クロスアカウント保護機能でユーザー アカウントを保護する

ユーザーがアプリを使用して Google を使用してアカウントにログインできるようにすれば、 ユーザーのセキュリティをユーザーの意見に耳を傾けて対応することで セキュリティ・イベント通知も受け取ることができます。

これらの通知は、 セキュリティに影響を及ぼす可能性があります。 説明します。たとえば、ユーザーの Google アカウントが乗っ取られた場合、 メールを通じてアプリのユーザーのアカウントが不正使用される可能性がある アカウント復元やシングル サインオンの使用などです。

このようなイベントのリスクを軽減するため、Google は セキュリティイベントトークンと呼ばれる サービスオブジェクトですこれらのトークンでは、 イベントの種類や発生日時、アラートを できます。ただし、この ID を使用して、 適切な措置を講じることができます。たとえば、ユーザーの Google アカウントが そのユーザーの「Google でログイン」を一時的に無効にし、 アカウント復元に関するメールがユーザーの Gmail アドレスに送信されないようにする。

クロスアカウント保護機能は、 RISC 標準。 OpenID Foundation へようこそ。

概要

アプリやサービスでクロスアカウント保護機能を使用するには、 できます。

  1. API Consoleでプロジェクトを設定します。

  2. Google がセキュリティ イベントを送信するイベント レシーバ エンドポイントを作成する 使用します。このエンドポイントは、受け取ったトークンを検証する役割を担います。 セキュリティ・イベントに任意で対応できます。

  3. エンドポイントを Google に登録して、セキュリティ イベント トークンの受信を開始します。

前提条件

セキュリティ イベント トークンを受け取るのは、 ユーザーのプロフィール情報やメールアドレスにアクセスすることを許可しています。マイページ この権限を取得するには、profile スコープまたは email スコープをリクエストします。新しい Google でログイン、従来版 Google ログインの SDK はデフォルトでこれらのスコープをリクエストしますが、 デフォルト設定を使用しない場合、または Google の OpenID エンドポイントを直接接続する場合は、 少なくとも 1 つはリクエストできます

API Consoleでプロジェクトを設定する

セキュリティ イベント トークンの受信を開始するには、サービスを作成する必要があります 管理して RISC API を API Console プロジェクト。同じものを使用する必要があります API Console プロジェクトへのアクセスに使用する アプリでの Google サービス(Google ログインなど)

サービス アカウントを作成するには:

  1. API Consoleを開きます。 Credentials page。画面の指示に従って API Console プロジェクト。

  2. [認証情報を作成] > [サービス アカウント] をクリックします。

  3. RISC 構成管理者のロールを持つ新しいサービス アカウントを作成する (roles/riscconfigs.admin) (フォロー) こちらの手順をご覧ください。

  4. 新しく作成したサービス アカウントのキーを作成します。JSON キーを選択する [作成] をクリックします。鍵が作成されると、 サービス アカウントが含まれる JSON ファイルをダウンロードし、 認証情報が必要です。このファイルを安全な場所に保管し、 イベント レシーバー エンドポイント。

で確認できます。

プロジェクトの [認証情報] ページで、 「Google でログイン」または「Google ログイン(従来版)」に使用している ID です。通常は各 ID にクライアント ID を 対応しています。セキュリティ イベントを検証するには、これらのクライアント ID が必要です。 トークンを渡します。

RISC API を有効にするには:

  1. Google Cloud コンソールの [RISC API] ページを開きます。 API Console。使用しているプロジェクトが [Google サービスにアクセスする] は引き続き選択されています。

  2. RISC 利用規約を読み、要件を理解しておいてください。

    組織が所有するプロジェクトに対して API を有効にする場合は、 貴組織を RISC 規約に拘束する権限を有しています。

  3. RISC の利用規約に同意した場合にのみ、[有効にする] をクリックします。

イベント レシーバー エンドポイントを作成する

Google からセキュリティ イベント通知を受け取るには、HTTPS エンドポイントを作成します HTTPS POST リクエストを処理できますこのエンドポイントを登録したら(以下を参照)、 Google がセキュリティ イベントと呼ばれる暗号署名文字列の投稿を開始 エンドポイントに送信されます。セキュリティ イベント トークンは署名付き JWT で、 単一のセキュリティ関連イベントに関する情報が収集されます。

エンドポイントで受信したセキュリティ イベント トークンごとに、まず、 そのトークンをデコードしてから、トークンを あります。デコードする前にイベント トークンを検証することが重要 保護する方法を学びます。以降のセクションでは、これらのタスクについて説明します。

1. セキュリティ イベント トークンのデコードと検証

セキュリティ イベント トークンは特定の種類の JWT であるため、 JWT ライブラリ(jwt.io にリストされているものなど)を使用して、 検証します。どのライブラリを使用する場合でも、トークン検証コードは 次のとおりです。

  1. クロスアカウント保護の発行元 ID(issuer)と署名鍵を取得する Google の RISC 構成ドキュメントにある証明書 URI(jwks_uri) 詳しくは https://accounts.google.com/.well-known/risc-configuration
  2. 任意の JWT ライブラリを使用して、ヘッダーから署名鍵 ID を取得します。 セキュリティ・イベント・トークンの
  3. Google の署名鍵証明書ドキュメントで、公開鍵を 鍵 ID が必要です。ドキュメントに鍵が含まれていない場合 場合、セキュリティ イベント トークンが 無効で、エンドポイントから HTTP エラー 400 が返されるはずです。
  4. 任意の JWT ライブラリを使用して、次のことを確認します。 <ph type="x-smartling-placeholder">
      </ph>
    • セキュリティ イベント トークンは、API 呼び出しで取得した公開鍵を使用して署名されます。 確認できます。
    • トークンの aud クレームがアプリの 1 つであるクライアント ID などがあります。
    • トークンの iss クレームが、取得した発行者 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 クレームは、単一のセキュリティ イベントを識別する文字列です。 一意でなければなりません。この ID を使用して、どのセキュリティ イベントが 。

events クレームには、トークンのセキュリティ イベントに関する情報が含まれます。 表します。このクレームは、イベントタイプ ID から subject へのマッピングです。 クレームで、このイベントが関係するユーザーを指定します。また、 詳細が表示されます。

subject クレームは、特定のユーザーを、そのユーザーに固有の Google アカウント ID(sub)。この Google アカウント ID は、次に含まれている ID と同じです(sub) 新しい「Google でログイン」機能(JavaScript)によって発行された JWT ID トークンを使用 、HTML)ライブラリ、以前の Google ログイン ライブラリ、 OpenID Connect。リクエストの subject_typeid_token_claims である場合、このフィールドに email 入力します。

events クレームの情報を使用して、 タイプのイベントタイプを指定します。

OAuth トークン ID

個々のトークンに関する OAuth イベントの場合、token subject 識別子タイプには次のフィールドがあります。

  • 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 トークン ID セクションをご覧ください。 トークン識別子

必須: 対応する更新トークンを保存している場合は、それを削除します。 次にアクセス トークンが必要になったときに、ユーザーに再同意をリクエストします。

https://schemas.openid.net/secevent/risc/event-type/account-disabled reason=hijacking
reason=bulk-account

必須: アカウントが無効になっている理由が hijacking さん、 表示されます。

推奨: アカウントが無効になっている理由が 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 です。 De-Dup Dataflow です

イベントの再試行回数が制限されているため、レシーバーがダウンしている場合に注意してください。 一部の予定を完全に見落とす可能性があります。

レシーバーを登録する

セキュリティ イベントの受信を開始するには、 。RISC API の呼び出しには認証トークンが必要です。

アプリのユーザーについてのみセキュリティ イベントを受信するため、OAuth 同意画面を設定しておく必要があります を、以下で説明する手順の前提条件にする必要があります。

1. 認証トークンを生成する

RISC API の認証トークンを生成するには、 次の主張をしています。

{
  "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-jwtGoogle の認証ライブラリ:

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')

この認証トークンを使用して、1 時間の RISC API 呼び出しを行うことができます。日時 トークンの有効期限が切れたら、新しいトークンを生成して 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 リクエストを レスポンスの本文を変更してから、そのメッセージを POST する 前述のとおり、構成を https://risc.googleapis.com/v1beta/stream:update に戻しました。

イベント ストリームを停止して再開する

Google からのイベント ストリームを停止する必要がある場合は、承認済みの POST を行います。 { "status": "disabled" } を使用した https://risc.googleapis.com/v1beta/stream/status:update へのリクエスト あります。ストリームが無効になっている間は、Google からイベントは送信されません。 エンドポイントに送られ、セキュリティ イベントが発生したときにバッファリングされません。宛先 イベント ストリームを再度有効にし、同じエンドポイントに { "status": "enabled" } を POST します。

3. 省略可: ストリーム構成をテストする

ストリーム構成とレシーバー エンドポイントが機能していることを確認する 検証トークンを送信する必要があります。 このトークンには一意の文字列を含めることができます。この文字列を使用して、 トークンがエンドポイントで受信されました。このフローを使用するには、 https://schemas.openid.net/secevent/risc/event-type/verification にサブスクライブ レシーバの登録時にイベントタイプを指定します。

確認トークンをリクエストするには、承認済みの HTTPS POST リクエストを https://risc.googleapis.com/v1beta/stream:verify。リクエストの本文で、いくつかの 識別文字列:

{
  "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 である必要があります。RISC イベントは HTTP URL に送信されません。
403 既存のストリーム構成に仕様に準拠した配信がない メソッドです。 Google Cloud プロジェクトには、すでに RISC 構成が必要です。条件 使用していて Google ログインを有効にしている場合、Firebase は プロジェクトの RISC の管理カスタムモデルを構築して できます。Firebase プロジェクトで Google ログインを使用していない場合は、 無効にしてから 1 時間後にもう一度更新してください。
403 プロジェクトが見つかりませんでした。 正しいサービス アカウントを使用していることを確認してください。 できます。削除済みに関連付けられたサービス アカウントを使用している可能性があります。 できます。学習 <ph type="x-smartling-placeholder"></ph> プロジェクトに関連付けられているすべてのサービス アカウントを確認する方法をご覧ください。
403 サービス アカウントに RISC へのアクセス権限が必要です。 構成 プロジェクトの API Console 「RISC 構成管理者」を割り当てます。ロール (roles/riscconfigs.admin) サービス アカウントに関連付けることができます。 フォロー中 こちらの手順をご覧ください。
403 ストリーム管理 API は、サービス アカウントによってのみ呼び出す必要があります。 このモジュールの サービス アカウントで Google API を呼び出す方法をご覧ください。
403 配信エンドポイントはプロジェクトのどのドメインにも属していません。 どのプロジェクトにも 承認済みドメインです 配信エンドポイント(つまり、RISC イベントを受け取ると想定されるエンドポイント)は、 のいずれかでホストされていない場合、 エンドポイントのドメインがそのセットにマッピングされます。
403 この API を使用するには、プロジェクトに少なくとも 1 つの OAuth クライアントが構成されている必要があります。 RISC が機能するのは、 Google ログイン。 この接続には OAuth クライアントが必要です。プロジェクトに OAuth が有効になっていない場合 場合、RISC はあまり役に立たない可能性があります。詳細 Google による 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 できます。