push サブスクリプションが認証を使用する場合、Pub/Sub サービスは JWT に署名し、push リクエストの認可ヘッダーで JWT を送信します。JWT にはクレームと署名が含まれます。
サブスクライバーは JWT を検証し、次のことを確認できます。
- クレームが正確である。
- Pub/Sub サービスがクレームに署名した。
サブスクライバーがファイアウォールを使用している場合、push リクエストを受信できません。push リクエストを受信するには、ファイアウォールをオフにして JWT を検証する必要があります。
準備
- サブスクリプションについて確認する。
- push サブスクリプションの仕組みを理解します。
- push サブスクリプションを作成します。
JWT の形式
JWT は、ヘッダー、クレームセット、署名で構成される OpenIDConnect JWT です。Pub/Sub サービスは、JWT をピリオド区切りの base64 文字列としてエンコードします。
たとえば、次の認証ヘッダーにはエンコードされた JWT が含まれています。
"Authorization" : "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjdkNjgwZDhjNzBkNDRlOTQ3MTMzY2JkNDk5ZWJjMWE2MWMzZDVh YmMiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJodHRwczovL2V4YW1wbGUuY29tIiwiYXpwIjoiMTEzNzc0M jY0NDYzMDM4MzIxOTY0IiwiZW1haWwiOiJnYWUtZ2NwQGFwcHNwb3QuZ3NlcnZpY2VhY2NvdW50LmNvb SIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJleHAiOjE1NTAxODU5MzUsImlhdCI6MTU1MDE4MjMzNSwia XNzIjoiaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tIiwic3ViIjoiMTEzNzc0MjY0NDYzMDM4MzIxO TY0In0.QVjyqpmadTyDZmlX2u3jWd1kJ68YkdwsRZDo-QxSPbxjug4ucLBwAs2QePrcgZ6hhkvdc4UHY 4YF3fz9g7XHULNVIzX5xh02qXEH8dK6PgGndIWcZQzjSYfgO-q-R2oo2hNM5HBBsQN4ARtGK_acG-NGG WM3CQfahbEjZPAJe_B8M7HfIu_G5jOLZCw2EUcGo8BvEwGcLWB2WqEgRM0-xt5-UPzoa3-FpSPG7DHk7 z9zRUeq6eB__ldb-2o4RciJmjVwHgnYqn3VvlX9oVKEgXpNFhKuYA-mWh5o7BCwhujSMmFoBOh6mbIXF cyf5UiVqKjpqEbqPGo_AvKvIQ9VTQ"
ヘッダーとクレームセットは JSON 文字列です。デコードされると次の形式になります。
{"alg":"RS256","kid":"7d680d8c70d44e947133cbd499ebc1a61c3d5abc","typ":"JWT"} { "aud":"https://example.com", "azp":"113774264463038321964", "email":"gae-gcp@appspot.gserviceaccount.com", "sub":"113774264463038321964", "email_verified":true, "exp":1550185935, "iat":1550182335, "iss":"https://accounts.google.com" }
push エンドポイントに送信されるリクエストに添付されるトークンは、最大 1 時間前のものである可能性があります。
Pub/Sub での push 認証を構成する
次の例は、push 認証サービス アカウントを任意のサービス アカウントに設定する方法と、iam.serviceAccountTokenCreator
ロールを service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
サービス エージェントに付与する方法を示しています。
。
コンソール
Pub/Sub サブスクリプション ページに移動します。
[サブスクリプションを作成] をクリックします。
[サブスクリプション ID] フィールドに名前を入力します。
トピックを選択します。
[配信タイプ] として [push] を選択します。
エンドポイント URL を入力します。
[認証を有効にする] にチェックを入れます。
サービス アカウントを選択します。
プロジェクトの IAM ダッシュボードで、サービス エージェント
service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
にiam.serviceAccountTokenCreator
ロールがあることを確認します。サービス アカウントにそのロールが付与されていない場合、IAM ダッシュボードで [付与] をクリックして付与します。省略可: オーディエンスを入力します。
[作成] をクリックします。
gcloud
# Configure the push subscription gcloud pubsub subscriptions (create|update|modify-push-config) ${SUBSCRIPTION} \ --topic=${TOPIC} \ --push-endpoint=${PUSH_ENDPOINT_URI} \ --push-auth-service-account=${SERVICE_ACCOUNT_EMAIL} \ --push-auth-token-audience=${OPTIONAL_AUDIENCE_OVERRIDE} # Your service agent # `service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com` needs to have the # `iam.serviceAccountTokenCreator` role. PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\ --role='roles/iam.serviceAccountTokenCreator'
プッシュ サブスクリプションの認証を有効にすると、permission denied
エラーまたは not authorized
エラーが発生することがあります。この問題を解決するには、サブスクリプションの作成または更新を開始するプリンシパルに、サービス アカウントに対する iam.serviceAccounts.actAs
権限を付与します。詳細については、「push サブスクリプションを作成する」の認証をご覧ください。
Identity-Aware Proxy で保護された App Engine アプリケーションで認証済み push サブスクリプションを使用する場合は、IAP クライアント ID を push auth トークンのオーディエンスとして指定する必要があります。App Engine アプリケーションで IAP を有効にするには、IAP の有効化をご覧ください。IAP クライアント ID を確認するには、[認証情報] ページで IAP-App-Engine-app
クライアント ID を探します。
請求
JWT を使用して、クレーム(email
クレームと aud
クレームを含む)が Google によって署名されていることを検証できます。認証と承認の両方で Google の OAuth 2.0 API を使用する方法の詳細については、OpenID Connect をご覧ください。
こうしたクレームを有用にするメカニズムが 2 つあります。まず、Pub/Sub では、CreateSubscription、UpdateSubscription、または ModifyPushConfig 呼び出しを行うユーザーまたはサービス アカウントは、push 認証サービス アカウントに対する iam.serviceAccounts.actAs
権限を持つ必要があります。このようなロールの例として、roles/iam.serviceAccountUser
ロールがあります。
次に、トークンの署名に使用する証明書に対するアクセス権を厳密に管理する必要があります。トークンを作成するには、Pub/Sub が個別の署名サービス アカウント ID(サービス エージェント service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
)を使用して、Google の内部サービスを呼び出す必要があります。この署名サービス アカウントは、push 認証サービス アカウント(またはプロジェクトなど、push 認証サービス アカウントの祖先リソース)に対する iam.serviceAccounts.getOpenIdToken
権限、またはサービス アカウント トークン作成者ロール(roles/iam.serviceAccountTokenCreator
)を持つ必要があります。
トークンを検証する
Pub/Sub によって push エンドポイントに送信されたトークンを検証するには、次のことを行います。
- 署名の検証を使用したトークンの整合性のチェック。
- トークンの email クレームと audience クレームが push サブスクリプション構成の設定値と一致することの確認。
次の例は、Identity-Aware Proxy で保護されていない App Engine アプリケーションに対する push リクエストを認証する方法を示しています。App Engine アプリケーションが IAP で保護されている場合、IAP JWT を含む HTTP リクエスト ヘッダーは x-goog-iap-jwt-assertion
であり、それに応じて検証する必要があります。
プロトコル
リクエスト:
GET https://oauth2.googleapis.com/tokeninfo?id_token={BEARER_TOKEN}
レスポンス:
200 OK
{ "alg": "RS256", "aud": "example.com", "azp": "104176025330667568672", "email": "{SERVICE_ACCOUNT_NAME}@{YOUR_PROJECT_NAME}.iam.gserviceaccount.com", "email_verified": "true", "exp": "1555463097", "iat": "1555459497", "iss": "https://accounts.google.com", "kid": "3782d3f0bc89008d9d2c01730f765cfb19d3b70e", "sub": "104176025330667568672", "typ": "JWT" }
C#
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、Pub/Sub C# API リファレンス ドキュメントをご覧ください。
Go
Java
Node.js
Python
Ruby
上のコードサンプルで使用されている環境変数 PUBSUB_VERIFICATION_TOKEN
については、Pub/Sub メッセージの作成とレスポンスをご覧ください。
署名なし JWT の検証方法の例は、ウェブサイト用の Google ログインガイドで確認できます。OpenID トークンの概要については、JWT の検証に役立つクライアント ライブラリのリストが含まれている OpenID Connect ガイドをご覧ください。
他の Google Cloud サービスからの認証
Cloud Run、App Engine、Cloud Run Functions は、Pub/Sub で生成されたトークンを確認して、Pub/Sub からの HTTP 呼び出しを認証します。必要な構成は、呼び出し元のアカウントに必要な IAM ロールを付与することのみです。
これらのサービスのさまざまなユースケースについては、以下のガイドやチュートリアルをご覧ください。
Cloud Run
- Pub/Sub の push によるトリガー: 対応する Cloud Run サービスを呼び出すには、push 認証サービス アカウントに
roles/run.invoker
ロールがあり、Cloud Run サービスにバインドされている必要があります。 - Cloud Run で Pub/Sub を使用するためのチュートリアル
App Engine
Cloud Run 関数
- HTTP トリガー: 関数への HTTP トリガーとして Pub/Sub push リクエストを使用する場合、関数を呼び出すには、push 認証サービス アカウントに
roles/cloudfunctions.invoker
のロールが必要です。 - Google Cloud Pub/Sub トリガー: Pub/Sub トリガーを使用して関数を呼び出す場合、IAM のロールと権限が自動的に構成されます。