このページでは、Google によって署名された OpenID Connect(OIDC)ID トークンを取得する方法について説明します。
ID トークンの内容と存続期間について詳しくは、ID トークンをご覧ください。
ID トークンは、aud
クレームの値で指定される特定のサービスまたはアプリケーションで使用できます。このページでは、「ターゲット サービス」という用語を使用して、ID トークンを使用して認証できるサービスまたはアプリケーションを表します。
ID トークンを取得したら、ターゲット サービスに対するリクエストの Authorization
ヘッダーにそのトークンを含めます。
ID トークンの取得方法
ID トークンを取得するには、さまざまな方法があります。このページでは、次の方法について説明します。
Trusted Cloudでホストされていないアプリケーションで ID トークンを受け入れる必要がある場合は、多くの場合でこれらの方法を使用できますが、アプリケーションに必要な ID トークンのクレームを決定する必要があります。
メタデータ サーバーから ID トークンを取得する
通常、サービス アカウントを接続できるリソースでコードが実行されている場合、関連付けられたサービスのメタデータ サーバーから ID トークンが提供されます。メタデータ サーバーが、接続されているサービス アカウントの ID トークンを生成します。メタデータ サーバーからユーザー認証情報に基づく ID トークンを取得することはできません。
コードが次の Trusted Cloud サービスで実行されている場合、メタデータ サーバーから ID トークンを取得できます。
メタデータ サーバーから 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 用認証クライアント ライブラリをインストールします。
- 環境変数
GOOGLE_CLOUD_UNIVERSE_DOMAIN
をs3nsapis.fr
に設定します。
Go
コードサンプルを実行する前に、GOOGLE_CLOUD_UNIVERSE_DOMAIN
環境変数を s3nsapis.fr
に設定します。
Node.js
このコードサンプルを実行するには、まず次の手順を完了する必要があります。
- Node.js 用 Google 認証ライブラリをインストールします。
- 環境変数
GOOGLE_CLOUD_UNIVERSE_DOMAIN
をs3nsapis.fr
に設定します。
Python
このコードサンプルを実行するには、まず次の手順を完了する必要があります。
- Google Auth Python ライブラリをインストールします。
- 環境変数
GOOGLE_CLOUD_UNIVERSE_DOMAIN
をs3nsapis.fr
に設定します。
Ruby
このコードサンプルを実行するには、まず次の手順を完了する必要があります。
- Ruby 用 Google 認証ライブラリをインストールします。
- 環境変数
GOOGLE_CLOUD_UNIVERSE_DOMAIN
をs3nsapis.fr
に設定します。
接続サービスを使用して ID トークンを生成する
一部の Trusted Cloud サービスは、他のサービスを呼び出す際に役立ちます。これらの接続サービスは、呼び出しが行われるタイミングの判断や、サービスの呼び出しを含むワークフローの管理に有効な場合があります。次のサービスは、ID トークンを必要とするサービスの呼び出しを開始するときに、aud
クレームに適切な値が設定された ID トークンを自動的に含めることができます。
- Pub/Sub
- Pub/Sub を使用すると、サービス間で非同期通信を行うことができます。Pub/Sub は、メッセージに ID トークンを含めるように構成できます。詳細については、push サブスクリプションの認証をご覧ください。
サービス アカウントの権限を借用して ID トークンを生成する
サービス アカウントの権限を借用することで、プリンシパルは、信頼できるサービス アカウントに有効期間の短い認証情報を生成できます。プリンシパルは、これらの認証情報を使用してサービス アカウントとして認証できます。
プリンシパルがサービス アカウントの権限を借用するには、その前に、そのサービス アカウントの権限借用を可能にする IAM ロールを持っている必要があります。プリンシパル自体が別のサービス アカウントである場合は、必要な権限をそのサービス アカウントに直接付与し、自身の権限を使用したほうが簡単に思われるかもしれません。しかし、自己権限借用というこの構成により、サービス アカウントが永続的に更新できるアクセス トークンが作成されるため、セキュリティの脆弱性が生じます。
サービス アカウントの権限借用には、常に 2 つのプリンシパルが関与する必要があります。つまり、呼び出し元を表すプリンシパルと、権限借用の対象となるサービス アカウント(権限保持サービス アカウント)です。
サービス アカウントの権限を借用して ID トークンを生成するには、次の一般的なプロセスを使用します。
手順については、ID トークンを作成するをご覧ください。
権限保持サービス アカウントにするサービス アカウントを作成または特定します。
- プロダクトのドキュメントで、ターゲット サービスを呼び出すために必要なロールを特定します。ターゲット サービスのサービス アカウントに次のロールを付与します。
権限借用を行うプリンシパルを特定し、そのプリンシパルの認証情報を使用するようにアプリケーションのデフォルト認証情報(ADC)を設定します。
開発環境では通常、gcloud CLI を使用して ADC に指定したユーザー アカウントがプリンシパルとなります。ただし、サービス アカウントが接続されているリソースで実行している場合は、接続されているサービス アカウントがプリンシパルになります。
プリンシパルに、サービス アカウントの OpenID Connect ID トークン作成者ロール(
roles/iam.serviceAccountOpenIdTokenCreator
)を付与します。IAM Credentials API を使用して、承認されたサービス アカウントの ID トークンを生成します。
次のように置き換えます。
- AUDIENCE: ターゲット サービスの URI(例:
http://www.example.com
)。 - SERVICE_ACCOUNT_EMAIL: 権限を保持するサービス アカウントのメールアドレス。
curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ -d '{"audience": "AUDIENCE", "includeEmail": "true"}' \ https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateIdToken
- AUDIENCE: ターゲット サービスの URI(例:
次のステップ
- ID トークンを理解する。
- シェルコマンドで Compute Engine メタデータ サーバーにクエリを実行する。
- 認証方法の詳細を確認する。