アプリで Google を使用してユーザーがアカウントにログインできるようにしている場合は、クロスアカウント保護機能から提供されるセキュリティ イベント通知をリッスンして対応することで、これらの共有ユーザーのアカウントのセキュリティを強化できます。
これらの通知は、ユーザーの Google アカウントに対する大きな変更を知らせるもので、多くの場合、アプリのアカウントにもセキュリティ上の影響を及ぼす可能性があります。たとえば、ユーザーの Google アカウントが不正使用された場合、メール アカウント復元やシングル サインオンの使用を通じて、アプリのユーザー アカウントが侵害される可能性があります。
このようなイベントのリスクを軽減するために、Google はセキュリティ イベント トークンと呼ばれるサービス オブジェクトを送信します。これらのトークンは、セキュリティ イベントのタイプ、発生日時、影響を受けたユーザーの識別子など、ごくわずかな情報しか公開しませんが、これを使用して適切な対応を行うことができます。たとえば、ユーザーの Google アカウントが侵害された場合、そのユーザーの Google でログインを一時的に無効にして、アカウント復元メールがユーザーの Gmail アドレスに送信されないようにすることができます。
クロスアカウント保護機能は、OpenID Foundation で開発された RISC 標準に基づいています。
概要
アプリまたはサービスでクロスアカウント保護機能を使用するには、次のタスクを完了する必要があります。
API Console でプロジェクトを設定します。
Google がセキュリティ イベント トークンを送信するイベント レシーバー エンドポイントを作成します。このエンドポイントは、受信したトークンを検証し、選択した方法でセキュリティ イベントに対応します。
エンドポイントを Google に登録して、セキュリティ イベント トークンの受信を開始します。
前提条件
セキュリティ イベント トークンを受信するのは、プロファイル情報またはメールアドレスへのアクセス権をサービスに付与した Google ユーザーのみです。この権限を取得するには、profile スコープまたは email スコープをリクエストします。新しい
Google でログインまたは従来の
Google ログイン SDK は、デフォルトでこれらのスコープをリクエストしますが、
デフォルト設定を使用しない場合や、Google の OpenID
Connect エンドポイントに直接アクセスする場合は、
これらのスコープの少なくとも 1 つをリクエストしていることを確認してください。
API Console でプロジェクトを設定する
セキュリティ イベント トークンの受信を開始する前に、サービス アカウントを作成し、API Console プロジェクトで RISC API を有効にする必要があります。アプリで Google ログインなどの Google サービスにアクセスするために使用する API Console プロジェクトと同じプロジェクトを使用する必要があります。
サービス アカウントを作成するには:
API Console 認証情報ページを開きます。プロンプトが表示されたら、アプリで Google サービスにアクセスするために使用する API Console プロジェクトを選択します。
[認証情報を作成] > [サービス アカウント] をクリックします。
手順に沿って、RISC 構成管理者ロール (
roles/riscconfigs.admin) を持つ新しいサービス アカウントを作成します 。新しく作成したサービス アカウントのキーを作成します。JSON キータイプを選択して [作成] をクリックします。キーが作成されると、サービス アカウントの認証情報を含む JSON ファイルがダウンロードされます。このファイルは安全な場所に保管してください。また、イベント レシーバー エンドポイントからアクセスできるようにしてください。
プロジェクトの [認証情報] ページで、Google でログインまたは Google ログイン(従来)に使用するクライアント ID もメモしておきます。通常、サポートするプラットフォームごとにクライアント ID があります。次のセクションで説明するように、セキュリティ イベント トークンを検証するには、これらのクライアント ID が必要になります。
RISC API を有効にするには:
RISC API ページを API Console で開きます。Google サービスへのアクセスに使用するプロジェクトが選択されていることを確認します。
RISC 利用規約を読み、要件を理解していることを確認します。
組織が所有するプロジェクトで API を有効にする場合は、組織を RISC 利用規約にバインドする権限があることを確認してください。
RISC 利用規約に同意する場合のみ、[有効にする] をクリックします。
イベント レシーバー エンドポイントを作成する
Google からセキュリティ イベント通知を受信するには、HTTPS POST リクエストを処理する HTTPS エンドポイントを作成します。このエンドポイントを登録すると(下記を参照)、Google はセキュリティ イベント トークンと呼ばれる暗号署名された文字列をエンドポイントに投稿し始めます。セキュリティ イベント トークンは、単一のセキュリティ関連イベントに関する情報を含む署名付き JWT です。
エンドポイントで受信したセキュリティ イベント トークンごとに、まずトークンを検証してデコードし、サービスに応じてセキュリティ イベントを処理します。悪意のあるユーザーによる攻撃を防ぐため、デコードする前にイベント トークンを検証することが不可欠 です。次のセクションでは、これらのタスクについて説明します。
1. セキュリティ イベント トークンをデコードして検証する
セキュリティ イベント トークンは特定の種類の JWT であるため、任意の JWT ライブラリ (たとえば、jwt.io に記載されているもの) を使用してデコードして 検証できます。どのライブラリを使用する場合でも、トークン検証コードは次の処理を行う必要があります。
- Google の RISC 構成ドキュメント(
https://accounts.google.com/.well-known/risc-configuration)から、クロスアカウント保護機能発行者 ID(issuer)と署名鍵証明書 URI(jwks_uri)を取得します。 - 選択した JWT ライブラリを使用して、セキュリティ イベント トークンのヘッダーから署名鍵 ID を取得します。
- Google の署名鍵証明書ドキュメントから、前の手順で取得した鍵 ID を使用して公開鍵を取得します。ドキュメントに目的の ID の鍵が含まれていない場合、セキュリティ イベント トークンが無効である可能性が高く、エンドポイントは HTTP エラー 400 を返す必要があります。
- 選択した JWT ライブラリを使用して、次のことを確認します。
- セキュリティ イベント トークンは、前の手順で取得した公開鍵を使用して署名されています。
- トークンの
audクレームは、アプリのクライアント ID のいずれかです。 - トークンの
issクレームは、RISC ディスカバリ ドキュメントから取得した発行者 ID と一致します。セキュリティ イベント トークンは過去のイベントを表すため、期限切れにならないため、トークンの有効期限(exp)を確認する必要はありません。
次に例を示します。
Java
java-jwt と jwks-rsa-java を使用した場合:
public DecodedJWT validateSecurityEventToken(String token) {
DecodedJWT jwt = null;
try {
// In a real implementation, get these values from
// https://accounts.google.com/.well-known/risc-configuration
String issuer = "accounts.google.com";
String jwksUri = "https://www.googleapis.com/oauth2/v3/certs";
// Get the ID of the key used to sign the token.
DecodedJWT unverifiedJwt = JWT.decode(token);
String keyId = unverifiedJwt.getKeyId();
// Get the public key from Google.
JwkProvider googleCerts = new UrlJwkProvider(new URL(jwksUri), null, null);
PublicKey publicKey = googleCerts.get(keyId).getPublicKey();
// Verify and decode the token.
Algorithm rsa = Algorithm.RSA256((RSAPublicKey) publicKey, null);
JWTVerifier verifier = JWT.require(rsa)
.withIssuer(issuer)
// Get your apps' client IDs from the API console:
// https://console.developers.google.com/apis/credentials?project=_
.withAudience("123456789-abcedfgh.apps.googleusercontent.com",
"123456789-ijklmnop.apps.googleusercontent.com",
"123456789-qrstuvwx.apps.googleusercontent.com")
.acceptLeeway(Long.MAX_VALUE) // Don't check for expiration.
.build();
jwt = verifier.verify(token);
} catch (JwkException e) {
// Key not found. Return HTTP 400.
} catch (InvalidClaimException e) {
} catch (JWTDecodeException exception) {
// Malformed token. Return HTTP 400.
} catch (MalformedURLException e) {
// Invalid JWKS URI.
}
return jwt;
}
Python
import json
import jwt # pip install pyjwt
import requests # pip install requests
def validate_security_token(token, client_ids):
# Get Google's RISC configuration.
risc_config_uri = 'https://accounts.google.com/.well-known/risc-configuration'
risc_config = requests.get(risc_config_uri).json()
# Get the public key used to sign the token.
google_certs = requests.get(risc_config['jwks_uri']).json()
jwt_header = jwt.get_unverified_header(token)
key_id = jwt_header['kid']
public_key = None
for key in google_certs['keys']:
if key['kid'] == key_id:
public_key = jwt.algorithms.RSAAlgorithm.from_jwk(json.dumps(key))
if not public_key:
raise Exception('Public key certificate not found.')
# In this situation, return HTTP 400
# Decode the token, validating its signature, audience, and issuer.
try:
token_data = jwt.decode(token, public_key, algorithms='RS256',
options={'verify_exp': False},
audience=client_ids, issuer=risc_config['issuer'])
except:
raise
# Validation failed. Return HTTP 400.
return token_data
# Get your apps' client IDs from the API console:
# https://console.developers.google.com/apis/credentials?project=_
client_ids = ['123456789-abcedfgh.apps.googleusercontent.com',
'123456789-ijklmnop.apps.googleusercontent.com',
'123456789-qrstuvwx.apps.googleusercontent.com']
token_data = validate_security_token(token, client_ids)
トークンが有効で、正常にデコードされた場合は、HTTP ステータス 202 を返します。 次に、トークンで示されたセキュリティ イベントを処理します。
2. セキュリティ イベントを処理する
デコードされたセキュリティ イベント トークンは、次の例のようになります。
{
"iss": "https://accounts.google.com/",
"aud": "123456789-abcedfgh.apps.googleusercontent.com",
"iat": 1508184845,
"jti": "756E69717565206964656E746966696572",
"events": {
"https://schemas.openid.net/secevent/risc/event-type/account-disabled": {
"subject": {
"subject_type": "iss-sub",
"iss": "https://accounts.google.com/",
"sub": "7375626A656374"
},
"reason": "hijacking"
}
}
}
iss クレームと aud クレームは、トークンの発行者(Google)とトークンの宛先(サービス)を示します。これらのクレームは前の手順で検証しました。
jti クレームは、単一のセキュリティ イベントを識別する文字列で、ストリームに固有です。この識別子を使用して、受信したセキュリティ イベントを追跡できます。
events クレームには、トークンが表すセキュリティ イベントに関する情報が含まれています。このクレームは、イベントタイプ識別子から subject クレームへのマッピングです。subject クレームは、このイベントに関係するユーザーと、利用可能なイベントに関する追加の詳細を指定します。
subject クレームは、ユーザーの一意の Google アカウント ID(sub)を使用して特定のユーザーを識別します。この Google アカウント ID は、新しい Google でログイン(JavaScript 、HTML)ライブラリ、以前の Google ログイン ライブラリ、または OpenID Connect によって発行された JWT ID トークンに含まれる識別子(sub)と同じです。クレームの subject_type が id_token_claims の場合、ユーザーのメールアドレスを含む email フィールドも含まれることがあります。
events クレームの情報を使用して、指定したユーザーのアカウントでイベントタイプに対して適切なアクションを実行します。
OAuth トークン識別子
個々のトークンに関する OAuth イベントの場合、トークン サブジェクト識別子タイプには次のフィールドが含まれます。
token_type:refresh_tokenのみがサポートされています。token_identifier_alg: 使用可能な値については、以下の表をご覧ください。token: 以下の表をご覧ください。
| token_identifier_alg | token |
|---|---|
prefix |
トークンの最初の 16 文字。 |
hash_base64_sha512_sha512 |
SHA-512 を使用したトークンの二重ハッシュ。 |
これらのイベントと統合する場合は、イベントを受信したときに迅速に照合できるように、これらの使用可能な値に基づいてトークンにインデックスを付けることをおすすめします。
サポートされているイベントタイプ
クロスアカウント保護機能は、次のタイプのセキュリティ イベントをサポートしています。
| イベントタイプ | 属性 | 対応方法 |
|---|---|---|
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked |
必須: 現在開いているセッションを終了して、ユーザーのアカウントを再保護します。 | |
https://schemas.openid.net/secevent/oauth/event-type/tokens-revoked |
必須: トークンが Google ログイン用である場合は、現在開いているセッションを終了します。また、別のログイン方法を設定するようユーザーに 提案することもできます。 推奨: トークンが他の Google API へのアクセス用である場合は、保存しているユーザーの OAuth トークンを削除します。 |
|
https://schemas.openid.net/secevent/oauth/event-type/token-revoked |
トークン識別子については、OAuth トークン識別子のセクションをご覧ください |
必須: 対応する更新トークンを保存している場合は、削除し 、アクセス トークンが必要になったときにユーザーに再同意をリクエストします。 |
https://schemas.openid.net/secevent/risc/event-type/account-disabled |
reason=hijacking、reason=bulk-account |
必須: アカウントが無効になった理由が
推奨: アカウントが無効になった理由が
推奨: 理由が指定されていない場合は、ユーザーの Google ログインを無効にし、ユーザーの Google アカウントに関連付けられたメールアドレス(通常は Gmail アカウントですが、必ずしもそうではありません)を使用したアカウント復元を無効にします。別のログイン方法をユーザーに提供します。 |
https://schemas.openid.net/secevent/risc/event-type/account-enabled |
推奨: ユーザーの Google ログインを再度有効にし、ユーザーの Google アカウントのメールアドレスを使用したアカウント復元を再度有効にします。 | |
https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required |
推奨: サービスで不審なアクティビティがないか確認し、 適切な対応を行います。 | |
https://schemas.openid.net/secevent/risc/event-type/verification |
state=state | 推奨: テスト トークンが受信されたことを記録します。 |
重複したイベントと欠落したイベント
クロスアカウント保護機能は、配信されていないと思われるイベントの再配信を試みます。そのため、同じイベントを複数回受信することがあります。これにより、ユーザーに不便な繰り返し操作が発生する可能性がある場合は、jti クレーム(イベントの一意の識別子)を使用してイベントの重複除去を検討してください。Google Cloud
Dataflow などの外部ツールを使用すると、
重複除去データフローを実行できます。
イベントの再試行回数は限られているため、レシーバーが長時間ダウンしている場合は、一部のイベントが完全に欠落する可能性があります。
レシーバーを登録する
セキュリティ イベントの受信を開始するには、RISC API を使用してレシーバー エンドポイントを登録します。RISC API の呼び出しには、認可トークンが必要です。
セキュリティ イベントを受信するのはアプリのユーザーのみであるため、以下の手順を行うには、GCP プロジェクトで OAuth 同意画面が構成 されている必要があります。
1. 認可トークンを生成する
RISC API の認可トークンを生成するには、次のクレームを含む JWT を作成します。
{
"iss": SERVICE_ACCOUNT_EMAIL,
"sub": SERVICE_ACCOUNT_EMAIL,
"aud": "https://risc.googleapis.com/google.identity.risc.v1beta.RiscManagementService",
"iat": CURRENT_TIME,
"exp": CURRENT_TIME + 3600
}サービス アカウントの秘密鍵を使用して JWT に署名します。秘密鍵は、サービス アカウント キーを作成したときにダウンロードした JSON ファイルにあります。
次に例を示します。
Java
java-jwt と Google の認証ライブラリを使用した場合:
public static String makeBearerToken() {
String token = null;
try {
// Get signing key and client email address.
FileInputStream is = new FileInputStream("your-service-account-credentials.json");
ServiceAccountCredentials credentials =
(ServiceAccountCredentials) GoogleCredentials.fromStream(is);
PrivateKey privateKey = credentials.getPrivateKey();
String keyId = credentials.getPrivateKeyId();
String clientEmail = credentials.getClientEmail();
// Token must expire in exactly one hour.
Date issuedAt = new Date();
Date expiresAt = new Date(issuedAt.getTime() + 3600000);
// Create signed token.
Algorithm rsaKey = Algorithm.RSA256(null, (RSAPrivateKey) privateKey);
token = JWT.create()
.withIssuer(clientEmail)
.withSubject(clientEmail)
.withAudience("https://risc.googleapis.com/google.identity.risc.v1beta.RiscManagementService")
.withIssuedAt(issuedAt)
.withExpiresAt(expiresAt)
.withKeyId(keyId)
.sign(rsaKey);
} catch (ClassCastException e) {
// Credentials file doesn't contain a service account key.
} catch (IOException e) {
// Credentials file couldn't be loaded.
}
return token;
}
Python
import json
import time
import jwt # pip install pyjwt
def make_bearer_token(credentials_file):
with open(credentials_file) as service_json:
service_account = json.load(service_json)
issuer = service_account['client_email']
subject = service_account['client_email']
private_key_id = service_account['private_key_id']
private_key = service_account['private_key']
issued_at = int(time.time())
expires_at = issued_at + 3600
payload = {'iss': issuer,
'sub': subject,
'aud': 'https://risc.googleapis.com/google.identity.risc.v1beta.RiscManagementService',
'iat': issued_at,
'exp': expires_at}
encoded = jwt.encode(payload, private_key, algorithm='RS256',
headers={'kid': private_key_id})
return encoded
auth_token = make_bearer_token('your-service-account-credentials.json')
この認可トークンを使用して、RISC API 呼び出しを 1 時間行うことができます。トークンの有効期限が切れたら、新しいトークンを生成して RISC API 呼び出しを続行します。
2. RISC ストリーム構成 API を呼び出す
認可トークンを取得したら、RISC API を使用して、レシーバー エンドポイントの登録など、プロジェクトのセキュリティ イベント ストリームを構成できます。
これを行うには、https://risc.googleapis.com/v1beta/stream:update に HTTPS POST リクエストを送信し、
レシーバー エンドポイントと関心のあるセキュリティイベントのタイプを指定します。
POST /v1beta/stream:update HTTP/1.1
Host: risc.googleapis.com
Authorization: Bearer AUTH_TOKEN
{
"delivery": {
"delivery_method":
"https://schemas.openid.net/secevent/risc/delivery-method/push",
"url": RECEIVER_ENDPOINT
},
"events_requested": [
SECURITY_EVENT_TYPES
]
}
次に例を示します。
Java
public static void configureEventStream(final String receiverEndpoint,
final List<String> eventsRequested,
String authToken) throws IOException {
ObjectMapper jsonMapper = new ObjectMapper();
String streamConfig = jsonMapper.writeValueAsString(new Object() {
public Object delivery = new Object() {
public String delivery_method =
"https://schemas.openid.net/secevent/risc/delivery-method/push";
public String url = receiverEndpoint;
};
public List<String> events_requested = eventsRequested;
});
HttpPost updateRequest = new HttpPost("https://risc.googleapis.com/v1beta/stream:update");
updateRequest.addHeader("Content-Type", "application/json");
updateRequest.addHeader("Authorization", "Bearer " + authToken);
updateRequest.setEntity(new StringEntity(streamConfig));
HttpResponse updateResponse = new DefaultHttpClient().execute(updateRequest);
Header[] responseContentTypeHeaders = updateResponse.getHeaders("Content-Type");
StatusLine responseStatus = updateResponse.getStatusLine();
int statusCode = responseStatus.getStatusCode();
HttpEntity entity = updateResponse.getEntity();
// Now handle response
}
// ...
configureEventStream(
"https://your-service.example.com/security-event-receiver",
Arrays.asList(
"https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required",
"https://schemas.openid.net/secevent/risc/event-type/account-disabled"),
authToken);
Python
import requests
def configure_event_stream(auth_token, receiver_endpoint, events_requested):
stream_update_endpoint = 'https://risc.googleapis.com/v1beta/stream:update'
headers = {'Authorization': 'Bearer {}'.format(auth_token)}
stream_cfg = {'delivery': {'delivery_method': 'https://schemas.openid.net/secevent/risc/delivery-method/push',
'url': receiver_endpoint},
'events_requested': events_requested}
response = requests.post(stream_update_endpoint, json=stream_cfg, headers=headers)
response.raise_for_status() # Raise exception for unsuccessful requests
configure_event_stream(auth_token, 'https://your-service.example.com/security-event-receiver',
['https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required',
'https://schemas.openid.net/secevent/risc/event-type/account-disabled'])
リクエストが HTTP 200 を返すと、イベント ストリームが正常に構成され、レシーバー エンドポイントがセキュリティ イベント トークンの受信を開始します。次のセクションでは、ストリーム構成とエンドポイントをテストして、すべてが正しく連携していることを確認する方法について説明します。
現在のストリーム構成を取得して更新する
今後、ストリーム構成を変更する場合は、
https://risc.googleapis.com/v1beta/stream に認可された GET リクエストを送信して
現在のストリーム構成を取得し、レスポンス本文を変更して、上記の https://risc.googleapis.com/v1beta/stream:update に
変更した構成を POST します。
イベント ストリームを停止して再開する
Google からのイベント ストリームを停止する必要がある場合は、リクエスト本文に { "status": "disabled" }
を指定して、https://risc.googleapis.com/v1beta/stream/status:update に認可された POST
リクエストを送信します。ストリームが無効になっている間、Google はエンドポイントにイベントを送信せず、セキュリティ イベントが発生してもバッファリングしません。イベント ストリームを再度有効にするには、同じエンドポイントに { "status": "enabled" } を POST します。
3. 省略可: ストリーム構成をテストする
イベント ストリームを介して確認トークンを送信することで、ストリーム構成とレシーバー エンドポイントが正しく連携していることを確認できます。このトークンには、エンドポイントでトークンが受信されたことを確認するために使用できる一意の文字列を含めることができます。このフローを使用するには、レシーバーを登録するときに https://schemas.openid.net/secevent/risc/event-type/verification イベントタイプをサブスクライブしてください。
確認トークンをリクエストするには、https://risc.googleapis.com/v1beta/stream:verify に認可された HTTPS POST リクエストを送信します。リクエストの本文で、識別文字列を指定します。
{
"state": "ANYTHING"
}
次に例を示します。
Java
public static void testEventStream(final String stateString,
String authToken) throws IOException {
ObjectMapper jsonMapper = new ObjectMapper();
String json = jsonMapper.writeValueAsString(new Object() {
public String state = stateString;
});
HttpPost updateRequest = new HttpPost("https://risc.googleapis.com/v1beta/stream:verify");
updateRequest.addHeader("Content-Type", "application/json");
updateRequest.addHeader("Authorization", "Bearer " + authToken);
updateRequest.setEntity(new StringEntity(json));
HttpResponse updateResponse = new DefaultHttpClient().execute(updateRequest);
Header[] responseContentTypeHeaders = updateResponse.getHeaders("Content-Type");
StatusLine responseStatus = updateResponse.getStatusLine();
int statusCode = responseStatus.getStatusCode();
HttpEntity entity = updateResponse.getEntity();
// Now handle response
}
// ...
testEventStream("Test token requested at " + new Date().toString(), authToken);
Python
import requests
import time
def test_event_stream(auth_token, nonce):
stream_verify_endpoint = 'https://risc.googleapis.com/v1beta/stream:verify'
headers = {'Authorization': 'Bearer {}'.format(auth_token)}
state = {'state': nonce}
response = requests.post(stream_verify_endpoint, json=state, headers=headers)
response.raise_for_status() # Raise exception for unsuccessful requests
test_event_stream(auth_token, 'Test token requested at {}'.format(time.ctime()))
リクエストが成功すると、登録したエンドポイントに確認トークンが送信されます。たとえば、エンドポイントが検証トークンをログに記録するだけで処理する場合、ログを確認してトークンが受信されたことを確認できます。
エラーコードの参照
RISC API は次のエラーを返すことがあります。
| エラーコード | エラー メッセージ | 推奨される対応 |
|---|---|---|
| 400 | ストリーム構成には $fieldname フィールドを含める必要があります。 | https://risc.googleapis.com/v1beta/stream:update エンドポイントへのリクエストが無効であるか、 解析できません。リクエストに $fieldname を含めてください。 |
| 401 | 許可されていません。 | 承認に失敗しました。リクエストに 認可トークンが添付されていること、トークンが有効で 期限切れになっていないことを確認してください。 |
| 403 | 配信エンドポイントは HTTPS URL である必要があります。 | 配信エンドポイント(RISC イベントの 配信先となるエンドポイント)は HTTPS である必要があります。HTTP URL に RISC イベントを送信することはありません。 |
| 403 | 既存のストリーム構成には、RISC の仕様に準拠した配信 方法がありません。 | Google Cloud プロジェクトには、RISC 構成がすでに存在している必要があります。Firebase を使用していて、Google ログインが有効になっている場合、Firebase がプロジェクトの RISC を管理します。カスタム構成を作成することはできません。Firebase プロジェクトで Google ログインを使用していない場合は、 無効にしてから 1 時間後に再度更新してみてください。 |
| 403 | プロジェクトが見つかりませんでした。 | 正しいプロジェクトに正しいサービス アカウントを使用していることを確認してください。削除された プロジェクトに関連付けられたサービス アカウントを使用している可能性があります。プロジェクトに関連付けられているすべてのサービス アカウントを確認する方法をご覧ください。 |
| 403 | サービス アカウントには RISC 構成にアクセスする権限が必要です | プロジェクトの API Console に移動し、手順に沿って、プロジェクトを呼び出すサービス アカウントに「RISC 構成管理者」ロール(roles/riscconfigs.admin)を割り当てます。 |
| 403 | ストリーム管理 API はサービス アカウントからのみ呼び出す必要があります。 | サービス アカウントを使用して Google API を呼び出す方法について詳しくは、 こちらをご覧ください。 |
| 403 | 配信エンドポイントは、プロジェクトのドメインに属していません。 | すべてのプロジェクトには、 認可されたドメインのセットがあります。 配信エンドポイント(RISC イベントの配信先となるエンドポイント)がこれらのいずれかでホストされていない場合は、エンドポイントのドメインをそのセットに追加する必要があります。 |
| 403 | この API を使用するには、プロジェクトに少なくとも 1 つの OAuth クライアントが構成されている必要があります。 | RISC は、Google ログインをサポートするアプリを構築した場合にのみ機能します。この接続には OAuth クライアントが必要です。プロジェクトに OAuth クライアントがない場合、RISC は役に立たない可能性があります。Google の API での OAuth の使用について詳しくは、こちらをご覧ください。 |
| 403 |
サポートされていないステータスです。 無効なステータスです。 |
現時点では、ストリーム ステータス「enabled」と「disabled」のみがサポートされています。 |
| 404 |
プロジェクトに RISC 構成がありません。 プロジェクトに既存の RISC 構成がないため、ステータスを更新できません。 |
https://risc.googleapis.com/v1beta/stream:update エンドポイントを呼び出して、新しいストリーム構成を作成します。 |
| 4XX/5XX | ステータスを更新できませんでした。 | 詳細については、詳細なエラー メッセージをご確認ください。 |
アクセス トークン スコープ
RISC API の認証にアクセス トークンを使用する場合は、アプリがリクエストする必要があるスコープは次のとおりです。
| エンドポイント | スコープ |
|---|---|
https://risc.googleapis.com/v1beta/stream/status |
https://www.googleapis.com/auth/risc.status.readonly
または https://www.googleapis.com/auth/risc.status.readwrite |
https://risc.googleapis.com/v1beta/stream/status:update |
https://www.googleapis.com/auth/risc.status.readwrite |
https://risc.googleapis.com/v1beta/stream |
https://www.googleapis.com/auth/risc.configuration.readonly
または https://www.googleapis.com/auth/risc.configuration.readwrite
|
https://risc.googleapis.com/v1beta/stream:update |
https://www.googleapis.com/auth/risc.configuration.readwrite |
https://risc.googleapis.com/v1beta/stream:verify |
https://www.googleapis.com/auth/risc.verify |
お困りの場合
まず、エラーコードの参照セクションをご覧ください。ご不明な点がございましたら、Stack Overflow に #SecEvents タグを付けて投稿してください。