このページでは、Google によって署名された OpenID Connect(OIDC)ID トークンを取得する方法について説明します。
次の認証ユースケースでは、Google によって署名された ID トークンが必要です。
- Cloud Run サービスへのアクセス
- Cloud Run functions の呼び出し
- Identity-Aware Proxy(IAP)で保護されたアプリケーションのユーザー認証
- API Gateway または Cloud Endpoints でデプロイされた API のリクエスト
ID トークンの内容と存続期間について詳しくは、ID トークンをご覧ください。
ID トークンは、aud
クレームの値で指定される特定のサービスまたはアプリケーションで使用できます。このページでは、「ターゲット サービス」という用語を使用して、ID トークンを使用して認証できるサービスまたはアプリケーションを表します。
ID トークンを取得したら、ターゲット サービスに対するリクエストの Authorization
ヘッダーにそのトークンを含めます。
ID トークンの取得方法
ID トークンを取得するには、さまざまな方法があります。このページでは、次の方法について説明します。
- メタデータ サーバーから ID トークンを取得する
- 接続サービスを使用して ID トークンを生成する
- サービス アカウントの権限を借用して ID トークンを生成する
- Cloud Run と Cloud Run functions で開発用の汎用 ID トークンを生成する
Google Cloud でホストされていないアプリケーションで ID トークンを受け入れる必要がある場合は、多くの場合でこれらの方法を使用できますが、アプリケーションに必要な ID トークンのクレームを決定する必要があります。
メタデータ サーバーから ID トークンを取得する
通常、サービス アカウントを接続できるリソースでコードが実行されている場合、関連付けられたサービスのメタデータ サーバーから ID トークンが提供されます。メタデータ サーバーが、接続されているサービス アカウントの ID トークンを生成します。メタデータ サーバーからユーザー認証情報に基づく ID トークンを取得することはできません。
コードが次の Google Cloud サービスで実行されている場合、メタデータ サーバーから ID トークンを取得できます。
- Compute Engine
- App Engine スタンダード環境
- App Engine フレキシブル環境
- Cloud Run functions
- Cloud Run
- Google Kubernetes Engine
- Cloud Build
メタデータ サーバーから ID トークンを取得するには、次の例のように、サービス アカウントの ID エンドポイントをクエリします。
curl
AUDIENCE
は、ターゲット サービスの URI に置き換えます(例: http://www.example.com
)。
curl -H "Metadata-Flavor: Google" \ 'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE'
PowerShell
AUDIENCE
は、ターゲット サービスの URI に置き換えます(例: http://www.example.com
)。
$value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE") $value
Java
このコードサンプルを実行するには、Java 用 Auth クライアント ライブラリをインストールする必要があります。
Go
Node.js
このコードサンプルを実行するには、Node.js 用の Google 認証ライブラリをインストールする必要があります。
Python
このコードサンプルを実行するには、Google Auth Python ライブラリをインストールする必要があります。
Ruby
このコードサンプルを実行するには、Ruby 用の Google 認証ライブラリをインストールする必要があります。
接続サービスを使用して ID トークンを生成する
一部の Google Cloud サービスは、他のサービスを呼び出す際に役立ちます。これらの接続サービスは、呼び出しが行われるタイミングの判断や、サービスの呼び出しを含むワークフローの管理に有効な場合があります。次のサービスは、ID トークンを必要とするサービスの呼び出しを開始するときに、aud
クレームに適切な値が設定された ID トークンを自動的に含めることができます。
- Cloud Scheduler
- Cloud Scheduler は、エンタープライズ クラスのフルマネージド cron ジョブ スケジューラです。別のサービスを呼び出すときに、ID トークンまたはアクセス トークンのいずれかを含めるように Cloud Scheduler を構成できます。詳細については、HTTP ターゲットでの認証の使用をご覧ください。
- Cloud Tasks
- Cloud Tasks を使用すると、分散タスクの実行を管理できます。ID トークンまたはアクセス トークンのいずれかをサービスの呼び出し時に含めるようにタスクを構成できます。詳細については、認証トークンを使用した HTTP ターゲット タスクの使用をご覧ください。
- Pub/Sub
- Pub/Sub を使用すると、サービス間で非同期通信を行うことができます。Pub/Sub は、メッセージに ID トークンを含めるように構成できます。詳細については、push サブスクリプションの認証をご覧ください。
- Workflows
- Workflows は、フルマネージドのオーケストレーション プラットフォームで、定義した順序(ワークフロー)でサービスを実行します。別のサービスを呼び出すときに、ID トークンまたはアクセス トークンのいずれかを含めるようにワークフローを定義できます。詳細については、ワークフローから認証済みリクエストを行うをご覧ください。
サービス アカウントの権限を借用して ID トークンを生成する
サービス アカウントのなりすましを使用すると、プリンシパルは、信頼できるサービス アカウントの有効期間が短い認証情報を生成できます。プリンシパルは、これらの認証情報を使用してサービス アカウントとして認証できます。
プリンシパルがサービス アカウントになりすますには、その前に、そのサービス アカウントに対するなりすましを可能にする IAM ロールを持っている必要があります。プリンシパル自体が別のサービス アカウントである場合は、必要な権限をそのサービス アカウントに直接付与し、自身になりすます方が簡単に思われるかもしれません。しかし、自己権限借用というこの構成により、サービス アカウントが永続的に更新できるアクセス トークンが作成されるため、セキュリティの脆弱性が生じます。
サービス アカウントの権限借用には、常に 2 つのプリンシパルが関与する必要があります。つまり、呼び出し元を表すプリンシパルと、権限借用の対象となるサービス アカウント(権限保持サービス アカウント)です。
サービス アカウントの権限を借用して ID トークンを生成するには、次の一般的なプロセスを使用します。
手順については、ID トークンを作成するをご覧ください。
権限保持サービス アカウントにするサービス アカウントを作成または特定します。
-
ターゲット サービスを呼び出すために必要なロールを特定します。ターゲット サービスのサービス アカウントに次のロールを付与します。
-
Cloud Run サービスの場合、Cloud Run 起動元ロール(
roles/run.invoker
)を付与します。 -
Cloud Run functions の場合、Cloud Functions 起動元ロール(
roles/cloudfunctions.invoker
)を付与します。 - その他のターゲット サービスについては、サービスのプロダクト ドキュメントをご覧ください。
-
Cloud Run サービスの場合、Cloud Run 起動元ロール(
権限借用を行うプリンシパルを特定し、そのプリンシパルの認証情報を使用するようにアプリケーションのデフォルト認証情報(ADC)を設定します。
開発環境では通常、gcloud CLI を使用して ADC に指定したユーザー アカウントがプリンシパルとなります。ただし、サービス アカウントが接続されているリソースで実行している場合は、接続されているサービス アカウントがプリンシパルになります。
プリンシパルに、サービス アカウントの OpenID Connect ID トークン作成者ロール(
roles/iam.serviceAccountOpenIdTokenCreator
)を付与します。IAM Credentials API を使用して、承認されたサービス アカウントの ID トークンを生成します。
Cloud Run と Cloud Run functions で開発用の汎用 ID トークンを生成する
gcloud CLI を使用して、呼び出し元に必要な IAM 権限が付与されている Cloud Run サービスまたは Cloud Run functions で使用可能なユーザー認証情報の ID トークンを取得できます。このトークンは他のアプリケーションでは機能しません。
汎用 ID トークンを生成するには、
gcloud auth print-identity-token
コマンドを使用します。gcloud auth print-identity-token
次のステップ
- ID トークンを理解する。
- シェルコマンドで Compute Engine メタデータ サーバーにクエリを実行する。
- 認証方法の詳細を確認する。