サービス アカウントに有効期間の短い認証情報を作成する

このページでは、有効期間の短いサービス アカウントの認証情報を作成する方法について説明します。これにより、サービス アカウントの権限を借用できます。作成するトークンの種類に応じて、有効期間の短いトークンは、サービス アカウントに関連付けられた ID(ID トークンの場合)または権限(アクセス トークンの場合)を提供します。

システム アーキテクチャで一連のトークン生成呼び出しを使用する必要がある場合は、複数のサービス アカウントで構成される委任チェーンを使用できます。ほとんどの場合、このページで説明するように直接的な方法で十分です。

始める前に

  • Enable the IAM and Service Account Credentials APIs:

    gcloud services enable iam.googleapis.com iamcredentials.googleapis.com
  • 認証を設定します。

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

    Go

    ローカル開発環境でこのページの Go サンプルを使用するには、gcloud CLI をインストールして初期化し、ユーザー認証情報を使用してアプリケーションのデフォルト認証情報を設定します。

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    詳細については、Google Cloud の認証に関するドキュメントのローカル開発環境の認証の設定をご覧ください。

    Java

    ローカル開発環境でこのページの Java サンプルを使用するには、gcloud CLI をインストールして初期化し、ユーザー認証情報を使用してアプリケーションのデフォルト認証情報を設定します。

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    詳細については、Google Cloud の認証に関するドキュメントのローカル開発環境の認証の設定をご覧ください。

    Node.js

    ローカル開発環境でこのページの Node.js サンプルを使用するには、gcloud CLI をインストールして初期化し、ユーザー認証情報を使用してアプリケーションのデフォルト認証情報を設定します。

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    詳細については、Google Cloud の認証に関するドキュメントのローカル開発環境の認証の設定をご覧ください。

    Python

    ローカル開発環境でこのページの Python サンプルを使用するには、gcloud CLI をインストールして初期化し、ユーザー認証情報を使用してアプリケーションのデフォルト認証情報を設定します。

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    詳細については、Google Cloud の認証に関するドキュメントのローカル開発環境の認証の設定をご覧ください。

    REST

    このページの REST API サンプルをローカル開発環境で使用するには、gcloud CLI に指定した認証情報を使用します。

      Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init

    詳細については、Google Cloud 認証ドキュメントの REST を使用して認証するをご覧ください。

  • IAM サービス アカウントについて理解します。

  • サービス アカウントの権限借用について理解します。

  • 必要なトークンの種類を理解し、次のセクションで説明されている必要な手順を実施します。

有効期間の短いアクセス トークンを作成する

ほとんどの Google API で、認証にアクセス トークンを利用できます。サービス アカウントの権限を借用してアクセス トークンを生成した場合、アクセス トークンに更新トークンがありません。つまり、トークンの有効期限が切れた場合は、権限借用プロセスを繰り返して新しいトークンを生成する必要があります。

詳細については、アクセス トークンをご覧ください。

有効期間の短いアクセス トークンを作成するには、次の操作を行います。

必要な権限を提供する

直接リクエストには、認証情報をリクエストする呼び出し元と、認証情報が作成されるサービス アカウントの 2 つの ID が含まれます。権限を設定する方法は、呼び出し元がサービス アカウントとして認証されるか、ユーザー アカウントとして認証されるかによって異なります。

ローカル開発環境で、このページで説明する REST コマンドまたは gcloud CLI コマンドを実行する場合、呼び出し元をユーザー認証情報で表すことができます。Compute Engine で実行されているアプリケーションなどの自動ワークロードの場合、呼び出し元はサービス アカウントで表す必要があります。

サービス アカウント

呼び出し元のアプリケーションがサービス アカウントを ID として使用する場合、次のプリンシパルが関係します。

  • 呼び出し元のサービス アカウント(CALLER_SA

    このサービス アカウントは呼び出し元のアプリケーションを表し、有効期間の短い認証情報のリクエストを発行します。

  • 権限を保持しているサービス アカウント(PRIV_SA

    このサービス アカウントには、有効期間の短いトークンに必要な IAM ロールが付与されています。これは、有効期間の短いトークンが作成されるサービス アカウントです。

PRIV_SA に有効期間の短い認証情報を作成する権限を CALLER_SA に付与するには、PRIV_SA に対するサービス アカウント トークン作成者ロール(roles/iam.serviceAccountTokenCreator)を CALLER_SA に付与します。

PRIV_SA に必要なロールを付与します。

コンソール

  1. Google Cloud コンソールで、[サービス アカウント] ページに移動します。

    [サービス アカウント] に移動

  2. プロジェクトを選択します。
  3. 権限を保持しているサービス アカウントのメールアドレス(PRIV_SA)をクリックします。
  4. [権限] タブをクリックします。
  5. [このサービス アカウントにアクセスできるプリンシパル] で、[アクセスを許可] をクリックします。
  6. 呼び出し元のアカウント(CALLER_SA)のメールアドレスを入力します。

    例: demo@my-project.iam.gserviceaccount.com

  7. サービス アカウント トークン作成者ロール(roles/iam.serviceAccountTokenCreator)を選択します。
  8. [保存] をクリックして、サービス アカウントにロールを付与します。

gcloud

gcloud iam service-accounts add-iam-policy-binding コマンドで、サービス アカウントにロールを付与します。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • PRIV_SA: トークンが生成される権限保持サービス アカウントのメールアドレス。
  • CALLER_SA: 有効期間の短いトークンをリクエストするアプリケーションを表すサービス アカウントのメールアドレス。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

Windows(PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

Windows(cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

次のようなレスポンスが返されます。

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "serviceAccount:CALLER_SA"
      ],
      "role": "roles/iam.serviceAccountTokenCreator"
    }
  ],
  "etag": "BwXhCB4eyjY=",
  "version": 1
}

REST

  1. PRIV_SA の許可ポリシーを読み取ります。

    serviceAccounts.getIamPolicy メソッドで、サービス アカウントの許可ポリシーを取得します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
    • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。

    HTTP メソッドと URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    リクエストの本文(JSON):

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを開きます。

    次のような JSON レスポンスが返されます。

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

    サービス アカウントにロールを付与していない場合、レスポンスには etag 値のみが含まれます。この etag 値を次のステップに含めます。

  2. 許可ポリシーを変更して、CALLER_SA にサービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator)を付与します。

    たとえば、前の手順のサンプル レスポンスを変更するには、次のコードを追加します。

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }
  3. 更新された許可ポリシーを書き込みます。

    serviceAccounts.setIamPolicy メソッドは、サービス アカウントに更新後の許可ポリシーを設定します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
    • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。
    • POLICY: 設定するポリシーの JSON 表現。ポリシーの形式については、ポリシー リファレンスをご覧ください。

      たとえば、前の手順で示した許可ポリシーを設定するには、POLICY を次のように置き換えます。ここで、CALLER_SA は、有効期間が短いトークンを作成するサービス アカウントです。

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }

    HTTP メソッドと URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA

    リクエストの本文(JSON):

    {
      "policy": POLICY
    }
    

    リクエストを送信するには、次のいずれかのオプションを開きます。

    レスポンスには、更新された許可ポリシーが含まれます。

ユーザー認証情報

Google Cloud CLI を使用して有効期間の短いトークンを生成する場合、またはローカル開発環境から有効期間の短いトークンを生成する場合は、ユーザー アカウントを使用してトークンを生成できます。多くの場合、独自のユーザー アカウントを使用できます。

ユーザー アカウントを使用して有効期間の短いトークンを生成する場合、次の ID が関係します。

  • 呼び出し元アカウント(CALLER_ACCOUNT

    このユーザー アカウントは、権限を保持しているサービス アカウントに有効期間の短い認証情報を生成するために使用されます。

  • 権限を保持しているサービス アカウント(PRIV_SA

    このサービス アカウントには、有効期間の短いトークンに必要な IAM ロールが付与されています。これは、有効期間の短いトークンが作成されるサービス アカウントです。

CALLER_ACCOUNTPRIV_SA に有効期間の短い認証情報を作成できるようにするには、PRIV_SA に対するサービス アカウント トークン作成者ロール(roles/iam.serviceAccountTokenCreator)を CALLER_ACCOUNT に付与します。

PRIV_SA に必要なロールを付与します。

コンソール

  1. Google Cloud コンソールで、[サービス アカウント] ページに移動します。

    [サービス アカウント] に移動

  2. プロジェクトを選択します。
  3. 権限を保持しているサービス アカウントのメールアドレス(PRIV_SA)をクリックします。
  4. [権限] タブをクリックします。
  5. [このサービス アカウントにアクセスできるプリンシパル] で、[アクセスを許可] をクリックします。
  6. 呼び出し元のアカウントのプリンシパル ID(CALLER_ACCOUNT)を入力します。

    例: example-user@example.com

  7. サービス アカウント トークン作成者ロール(roles/iam.serviceAccountTokenCreator)を選択します。
  8. [保存] をクリックして、ユーザー アカウントにロールを付与します。

gcloud

gcloud iam service-accounts add-iam-policy-binding コマンドで、サービス アカウントにロールを付与します。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • PRIV_SA: トークンが生成される権限保持サービス アカウントのメールアドレス。
  • CALLER_ACCOUNT: 有効期間の短いトークンのリクエストに使用するユーザー アカウントのメールアドレス。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

Windows(PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

Windows(cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

次のようなレスポンスが返されます。

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "user:my-user@example.com"
      ],
      "role": "roles/iam.serviceAccountTokenCreator"
    }
  ],
  "etag": "BwX1ZbefjXU=",
  "version": 1
}

REST

  1. PRIV_SA の許可ポリシーを読み取ります。

    serviceAccounts.getIamPolicy メソッドで、サービス アカウントの許可ポリシーを取得します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
    • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。

    HTTP メソッドと URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    リクエストの本文(JSON):

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを開きます。

    次のような JSON レスポンスが返されます。

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

    サービス アカウントにロールを付与していない場合、レスポンスには etag 値のみが含まれます。この etag 値を次のステップに含めます。

  2. 許可ポリシーを変更して、CALLER_ACCOUNT にサービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator)を付与します。

    たとえば、前の手順のサンプル レスポンスを変更するには、次のコードを追加します。

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
  3. 更新された許可ポリシーを書き込みます。

    serviceAccounts.setIamPolicy メソッドは、サービス アカウントに更新後の許可ポリシーを設定します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
    • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。
    • POLICY: 設定するポリシーの JSON 表現。ポリシーの形式については、ポリシー リファレンスをご覧ください。

      たとえば、前の手順で示した許可ポリシーを設定するには、POLICY を次のように置き換えます。ここで、CALLER_ACCOUNT は、有効期間が短いトークンを作成するユーザー アカウントです。

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "CALLER_ACCOUNT"
            ]
          }
        ]
      }

    HTTP メソッドと URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA

    リクエストの本文(JSON):

    {
      "policy": POLICY
    }
    

    リクエストを送信するには、次のいずれかのオプションを開きます。

    レスポンスには、更新された許可ポリシーが含まれます。

アクセス トークンを生成する

gcloud CLI、REST API、または Cloud クライアント ライブラリと Google API クライアント ライブラリを使用して、OAuth 2.0 アクセス トークンを生成できます。

REST API を使用していて、トークンの有効期間を延長できるようにシステムが構成されている場合は、有効期間がデフォルトより長いトークンを作成できます。Google Cloud CLI では、トークンの有効期間の設定はサポートされていません。

以下のサンプルは、ローカル開発環境で使用するように設計されています。呼び出し元は、サービス アカウントではなくユーザー アカウントである必要があります。

サービス アカウントの OAuth 2.0 アクセス トークンを生成するには、次の手順を実施します。

gcloud

  1. 呼び出し元のユーザー アカウントで gcloud CLI にログインしていることを確認します。

  2. gcloud auth print-access-token コマンドを使用して、サービス アカウントのトークンを生成します。

    後述のコマンドデータを使用する前に、次のように置き換えます。

    • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。

    次のコマンドを実行します。

    Linux、macOS、Cloud Shell

    gcloud auth print-access-token --impersonate-service-account=PRIV_SA

    Windows(PowerShell)

    gcloud auth print-access-token --impersonate-service-account=PRIV_SA

    Windows(cmd.exe)

    gcloud auth print-access-token --impersonate-service-account=PRIV_SA

    次のようなレスポンスが返されます。

    WARNING: This command is using service account impersonation. All API calls will be executed as
    [my-sa@my-project.iam.gserviceaccount.com].
    ya29.c.b0AXv0zTPnzTnDV8F8Aj5Fgy46Yf2v_v8eZIoKq7xGpfbpXuy23aQ1693m3gAuE8AZga7w6kdagN7a9bfdDYbdeoGY0CMHOClsCwIdutL7k_RFC672lOCbUgF5hS8Iu2nCA8hle-11LJXBLmaxFmH08ZTBJLuDrWSNd8cYqGYFunSC1K1qLIPBF18tsa0hxVgKPucI8b1A9L8_MK1JGLGcr0n7-zY77_lmbcdODG3NmIbLOGWOutjJgqSO_YoeCKK2QTUZIp5PG7RkKlXWnmYJA9pEahzNoQrs5sWZctc2bia9af_ITzqqlXC9h1Kj5-me6e8rd734MJvpagqYazRk0gGWpMb03XmMGpgPc_FBp4pnX9rGOzW83SNpcDz8zeFO1Q0Bo3N7CuZougjRce0y8I2_4rtw5ME_nV3wrCWa..................................................................................................................................................................................................................................................................................................
    

REST

Service Account Credentials API の serviceAccounts.generateAccessToken メソッドによって、サービス アカウントの OAuth 2.0 アクセス トークンが生成されます。

リクエストのデータを使用する前に、次のように置き換えます。

  • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
  • LIFETIME: アクセス トークンが期限切れになるまでの秒数。例: 300s

    デフォルトでは、トークンの最大有効期間は 1 時間(3,600 秒)です。これらのトークンの最大有効期間を 12 時間(43,200 秒)まで延長するには、constraints/iam.allowServiceAccountCredentialLifetimeExtension リスト型制約が含まれる組織のポリシーにサービス アカウントを追加します。

HTTP メソッドと URL:

POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/PRIV_SA:generateAccessToken

リクエストの本文(JSON):

{
  "scope": [
    "https://www.googleapis.com/auth/cloud-platform"
  ],
  "lifetime": "LIFETIME"
}

リクエストを送信するには、次のいずれかのオプションを開きます。

generateAccessToken リクエストが成功した場合、レスポンスの本文には OAuth 2.0 アクセス トークンと有効期限が含まれます。expireTime に達するまで、サービス アカウントの代わりに accessToken をリクエストの認証に使用できます。

{
  "accessToken": "eyJ0eXAi...NiJ9",
  "expireTime": "2020-04-07T15:01:23.045123456Z"
}

Go

import (
	"context"
	"fmt"
	"io"
	"time"

	"golang.org/x/oauth2/google"
	"google.golang.org/api/impersonate"
	"google.golang.org/api/option"
)

// getAccessTokenFromImpersonatedCredentials uses a service account (SA1) to impersonate
// another service account (SA2) and obtain OAuth2 token for the impersonated account.
// To obtain a token for SA2, SA1 should have the "roles/iam.serviceAccountTokenCreator" permission on SA2.
func getAccessTokenFromImpersonatedCredentials(w io.Writer, impersonatedServiceAccount, scope string) error {
	// impersonatedServiceAccount := "name@project.service.gserviceaccount.com"
	// scope := "https://www.googleapis.com/auth/cloud-platform"

	ctx := context.Background()

	// Construct the GoogleCredentials object which obtains the default configuration from your
	// working environment.
	credentials, err := google.FindDefaultCredentials(ctx, scope)
	if err != nil {
		fmt.Fprintf(w, "failed to generate default credentials: %v", err)
		return fmt.Errorf("failed to generate default credentials: %w", err)
	}

	ts, err := impersonate.CredentialsTokenSource(ctx, impersonate.CredentialsConfig{
		TargetPrincipal: impersonatedServiceAccount,
		Scopes:          []string{scope},
		Lifetime:        300 * time.Second,
		// delegates: The chained list of delegates required to grant the final accessToken.
		// For more information, see:
		// https://cloud.google.com/iam/docs/create-short-lived-credentials-direct#sa-credentials-permissions
		// Delegates is NOT USED here.
		Delegates: []string{},
	}, option.WithCredentials(credentials))
	if err != nil {
		fmt.Fprintf(w, "CredentialsTokenSource error: %v", err)
		return fmt.Errorf("CredentialsTokenSource error: %w", err)
	}

	// Get the OAuth2 token.
	// Once you've obtained the OAuth2 token, you can use it to make an authenticated call.
	t, err := ts.Token()
	if err != nil {
		fmt.Fprintf(w, "failed to receive token: %v", err)
		return fmt.Errorf("failed to receive token: %w", err)
	}
	fmt.Fprintf(w, "Generated OAuth2 token with length %d.\n", len(t.AccessToken))

	return nil
}

Java


package com.google.cloud.auth.samples;

import com.google.auth.oauth2.GoogleCredentials;
import com.google.auth.oauth2.ImpersonatedCredentials;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class AccessTokenFromImpersonatedCredentials {

  public static void main(String[] args) throws IOException {
    // TODO(Developer): Replace the below variables before running the code.

    // Provide the scopes that you might need to request access to Google APIs,
    // depending on the level of access you need.
    // This example uses the cloud-wide scope and uses IAM to narrow the permissions.
    // https://cloud.google.com/docs/authentication/external/authorization-gcp
    // For more information, see: https://developers.google.com/identity/protocols/oauth2/scopes
    String scope = "https://www.googleapis.com/auth/cloud-platform";

    // The name of the privilege-bearing service account for whom the credential is created.
    String impersonatedServiceAccount = "name@project.service.gserviceaccount.com";

    getAccessToken(impersonatedServiceAccount, scope);
  }

  // Use a service account (SA1) to impersonate another service account (SA2) and obtain an ID token
  // for the impersonated account.
  // To obtain a token for SA2, SA1 should have the "roles/iam.serviceAccountTokenCreator"
  // permission on SA2.
  public static void getAccessToken(
      String impersonatedServiceAccount, String scope) throws IOException {

    // Construct the GoogleCredentials object which obtains the default configuration from your
    // working environment.
    GoogleCredentials googleCredentials = GoogleCredentials.getApplicationDefault();

    // delegates: The chained list of delegates required to grant the final accessToken.
    // For more information, see:
    // https://cloud.google.com/iam/docs/create-short-lived-credentials-direct#sa-credentials-permissions
    // Delegate is NOT USED here.
    List<String> delegates = null;

    // Create the impersonated credential.
    ImpersonatedCredentials impersonatedCredentials =
        ImpersonatedCredentials.newBuilder()
            .setSourceCredentials(googleCredentials)
            .setTargetPrincipal(impersonatedServiceAccount)
            .setScopes(Arrays.asList(scope))
            .setLifetime(300)
            .setDelegates(delegates)
            .build();

    // Get the OAuth2 token.
    // Once you've obtained the OAuth2 token, you can use it to make an authenticated call.
    impersonatedCredentials.refresh();
    String accessToken = impersonatedCredentials.getAccessToken().getTokenValue();
    System.out.println("Generated access token.");
  }
}

Node.js

/**
 * TODO(developer):
 *  Uncomment and replace these variables before running the sample.
 */
// const impersonatedServiceAccount = 'name@project.service.gserviceaccount.com';
// const scope = 'https://www.googleapis.com/auth/cloud-platform';

const {GoogleAuth, Impersonated} = require('google-auth-library');

async function getAccessTokenFromImpersonatedCredentials() {
  const googleAuth = new GoogleAuth({
    scopes: scope,
  });
  // Construct the GoogleCredentials object which obtains the default configuration from your
  // working environment.
  const {credential} = await googleAuth.getApplicationDefault();

  // delegates: The chained list of delegates required to grant the final accessToken.
  // For more information, see:
  // https://cloud.google.com/iam/docs/create-short-lived-credentials-direct#sa-credentials-permissions
  // Delegate is NOT USED here.
  const delegates = [];

  // Create the impersonated credential.
  const impersonatedCredentials = new Impersonated({
    sourceClient: credential,
    delegates,
    targetPrincipal: impersonatedServiceAccount,
    targetScopes: [scope],
    lifetime: 300,
  });

  // Get the OAuth2 token.
  // Once you've obtained the OAuth2 token, you can use it to make an authenticated call
  // to the target audience.
  const resp = await impersonatedCredentials.getAccessToken();
  // Token is in resp.token.
  console.log('Generated OAuth2 token with length %s', resp.token.length);
}

getAccessTokenFromImpersonatedCredentials();

Python

def accesstoken_from_impersonated_credentials(
    impersonated_service_account: str, scope: str
):
    from google.auth import impersonated_credentials
    import google.auth.transport.requests

    """
      Use a service account (SA1) to impersonate another service account (SA2)
      and obtain an ID token for the impersonated account.
      To obtain a token for SA2, SA1 should have the
      "roles/iam.serviceAccountTokenCreator" permission on SA2.

    Args:
        impersonated_service_account: The name of the privilege-bearing service account for whom the credential is created.
            Examples: name@project.service.gserviceaccount.com

        scope: Provide the scopes that you might need to request to access Google APIs,
            depending on the level of access you need.
            For this example, we use the cloud-wide scope and use IAM to narrow the permissions.
            https://cloud.google.com/docs/authentication#authorization_for_services
            For more information, see: https://developers.google.com/identity/protocols/oauth2/scopes
    """

    # Construct the GoogleCredentials object which obtains the default configuration from your
    # working environment.
    credentials, project_id = google.auth.default()

    # Create the impersonated credential.
    target_credentials = impersonated_credentials.Credentials(
        source_credentials=credentials,
        target_principal=impersonated_service_account,
        # delegates: The chained list of delegates required to grant the final accessToken.
        # For more information, see:
        # https://cloud.google.com/iam/docs/create-short-lived-credentials-direct#sa-credentials-permissions
        # Delegate is NOT USED here.
        delegates=[],
        target_scopes=[scope],
        lifetime=300,
    )

    # Get the OAuth2 token.
    # Once you've obtained the OAuth2 token, use it to make an authenticated call
    # to the target audience.
    request = google.auth.transport.requests.Request()
    target_credentials.refresh(request)
    # The token field is target_credentials.token.
    print("Generated OAuth2 token.")

OpenID Connect(OIDC)ID トークンを作成する

ID トークンは、OpenID Connect(OIDC)仕様に準拠しています。ID トークンは一部のサービスとアプリケーションで使用できます。

詳細については、ID トークンCloud Run または Cloud Run functions でホストされているアプリケーションの認証をご覧ください。

ID トークンを作成するには、次の操作を行います。

必要な権限を提供する

直接リクエストには、認証情報をリクエストする呼び出し元と、認証情報が作成されるサービス アカウントの 2 つの ID が含まれます。権限を設定する方法は、呼び出し元がサービス アカウントとして認証されるか、ユーザー アカウントとして認証されるかによって異なります。

ローカル開発環境で、このページで説明する REST コマンドまたは gcloud CLI コマンドを実行する場合、呼び出し元をユーザー認証情報で表すことができます。Compute Engine で実行されているアプリケーションなどの自動ワークロードの場合、呼び出し元はサービス アカウントで表す必要があります。

サービス アカウント

呼び出し元のアプリケーションがサービス アカウントを ID として使用する場合、次のプリンシパルが関係します。

  • 呼び出し元のサービス アカウント(CALLER_SA

    このサービス アカウントは呼び出し元のアプリケーションを表し、有効期間の短い認証情報のリクエストを発行します。

  • 権限を保持しているサービス アカウント(PRIV_SA

    このサービス アカウントには、有効期間の短いトークンに必要な IAM ロールが付与されています。これは、有効期間の短いトークンが作成されるサービス アカウントです。

有効期間の短い PRIV_SA の認証情報を作成する権限を CALLER_SA に付与するには、PRIV_SA に対するサービス アカウントの OpenID Connect ID トークン作成者ロール(roles/iam.serviceAccountOpenIdTokenCreator)を CALLER_SA に付与します。

PRIV_SA に必要なロールを付与します。

コンソール

  1. Google Cloud コンソールで、[サービス アカウント] ページに移動します。

    [サービス アカウント] に移動

  2. プロジェクトを選択します。
  3. 権限を保持しているサービス アカウントのメールアドレス(PRIV_SA)をクリックします。
  4. [権限] タブをクリックします。
  5. [このサービス アカウントにアクセスできるプリンシパル] で、[アクセスを許可] をクリックします。
  6. 呼び出し元のアカウント(CALLER_SA)のメールアドレスを入力します。

    例: demo@my-project.iam.gserviceaccount.com

  7. サービス アカウントの OpenID Connect ID トークン作成者ロール(roles/iam.serviceAccountOpenIdTokenCreator)を選択します。
  8. [保存] をクリックして、サービス アカウントにロールを付与します。

gcloud

gcloud iam service-accounts add-iam-policy-binding コマンドで、サービス アカウントにロールを付与します。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • PRIV_SA: トークンが生成される権限保持サービス アカウントのメールアドレス。
  • CALLER_SA: 有効期間の短いトークンをリクエストするアプリケーションを表すサービス アカウントのメールアドレス。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountOpenIdTokenCreator --format=json

Windows(PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountOpenIdTokenCreator --format=json

Windows(cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountOpenIdTokenCreator --format=json

次のようなレスポンスが返されます。

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "serviceAccount:CALLER_SA"
      ],
      "role": "roles/iam.serviceAccountOpenIdTokenCreator"
    }
  ],
  "etag": "BwXhCB4eyjY=",
  "version": 1
}

REST

  1. PRIV_SA の許可ポリシーを読み取ります。

    serviceAccounts.getIamPolicy メソッドで、サービス アカウントの許可ポリシーを取得します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
    • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。

    HTTP メソッドと URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    リクエストの本文(JSON):

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを開きます。

    次のような JSON レスポンスが返されます。

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

    サービス アカウントにロールを付与していない場合、レスポンスには etag 値のみが含まれます。この etag 値を次のステップに含めます。

  2. 許可ポリシーを変更して、CALLER_SA にサービス アカウントの OpenID Connect ID トークン作成者ロール(roles/iam.serviceAccountOpenIdTokenCreator)を付与します。

    たとえば、前の手順のサンプル レスポンスを変更するには、次のコードを追加します。

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountOpenIdTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }
  3. 更新された許可ポリシーを書き込みます。

    serviceAccounts.setIamPolicy メソッドは、サービス アカウントに更新後の許可ポリシーを設定します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
    • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。
    • POLICY: 設定するポリシーの JSON 表現。ポリシーの形式については、ポリシー リファレンスをご覧ください。

      たとえば、前の手順で示した許可ポリシーを設定するには、POLICY を次のように置き換えます。ここで、CALLER_SA は、有効期間が短いトークンを作成するサービス アカウントです。

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountOpenIdTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }

    HTTP メソッドと URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA

    リクエストの本文(JSON):

    {
      "policy": POLICY
    }
    

    リクエストを送信するには、次のいずれかのオプションを開きます。

    レスポンスには、更新された許可ポリシーが含まれます。

ユーザー認証情報

Google Cloud CLI を使用して有効期間の短いトークンを生成する場合、またはローカル開発環境から有効期間の短いトークンを生成する場合は、ユーザー アカウントを使用してトークンを生成できます。多くの場合、独自のユーザー アカウントを使用できます。

ユーザー アカウントを使用して有効期間の短いトークンを生成する場合、次の ID が関係します。

  • 呼び出し元アカウント(CALLER_ACCOUNT

    このユーザー アカウントは、権限を保持しているサービス アカウントに有効期間の短い認証情報を生成するために使用されます。

  • 権限を保持しているサービス アカウント(PRIV_SA

    このサービス アカウントには、有効期間の短いトークンに必要な IAM ロールが付与されています。これは、有効期間の短いトークンが作成されるサービス アカウントです。

CALLER_ACCOUNTPRIV_SA に有効期間の短い認証情報を作成できるようにするには、PRIV_SA に対するサービス アカウントの OpenID Connect ID トークン作成者ロール(roles/iam.serviceAccountOpenIdTokenCreator)を CALLER_ACCOUNT に付与します。

PRIV_SA に必要なロールを付与します。

コンソール

  1. Google Cloud コンソールで、[サービス アカウント] ページに移動します。

    [サービス アカウント] に移動

  2. プロジェクトを選択します。
  3. 権限を保持しているサービス アカウントのメールアドレス(PRIV_SA)をクリックします。
  4. [権限] タブをクリックします。
  5. [このサービス アカウントにアクセスできるプリンシパル] で、[アクセスを許可] をクリックします。
  6. 呼び出し元のアカウントのプリンシパル ID(CALLER_ACCOUNT)を入力します。

    例: example-user@example.com

  7. サービス アカウントの OpenID Connect ID トークン作成者ロール(roles/iam.serviceAccountOpenIdTokenCreator)を選択します。
  8. [保存] をクリックして、ユーザー アカウントにロールを付与します。

gcloud

gcloud iam service-accounts add-iam-policy-binding コマンドで、サービス アカウントにロールを付与します。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • PRIV_SA: トークンが生成される権限保持サービス アカウントのメールアドレス。
  • CALLER_ACCOUNT: 有効期間の短いトークンのリクエストに使用するユーザー アカウントのメールアドレス。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountOpenIdTokenCreator --format=json

Windows(PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountOpenIdTokenCreator --format=json

Windows(cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountOpenIdTokenCreator --format=json

次のようなレスポンスが返されます。

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "user:my-user@example.com"
      ],
      "role": "roles/iam.serviceAccountOpenIdTokenCreator"
    }
  ],
  "etag": "BwX1ZbefjXU=",
  "version": 1
}

REST

  1. PRIV_SA の許可ポリシーを読み取ります。

    serviceAccounts.getIamPolicy メソッドで、サービス アカウントの許可ポリシーを取得します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
    • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。

    HTTP メソッドと URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    リクエストの本文(JSON):

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを開きます。

    次のような JSON レスポンスが返されます。

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

    サービス アカウントにロールを付与していない場合、レスポンスには etag 値のみが含まれます。この etag 値を次のステップに含めます。

  2. 許可ポリシーを変更して、CALLER_ACCOUNT にサービス アカウントの OpenID Connect ID トークン作成者ロール(roles/iam.serviceAccountOpenIdTokenCreator)を付与します。

    たとえば、前の手順のサンプル レスポンスを変更するには、次のコードを追加します。

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountOpenIdTokenCreator",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
  3. 更新された許可ポリシーを書き込みます。

    serviceAccounts.setIamPolicy メソッドは、サービス アカウントに更新後の許可ポリシーを設定します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
    • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。
    • POLICY: 設定するポリシーの JSON 表現。ポリシーの形式については、ポリシー リファレンスをご覧ください。

      たとえば、前の手順で示した許可ポリシーを設定するには、POLICY を次のように置き換えます。ここで、CALLER_ACCOUNT は、有効期間が短いトークンを作成するユーザー アカウントです。

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountOpenIdTokenCreator",
            "members": [
              "CALLER_ACCOUNT"
            ]
          }
        ]
      }

    HTTP メソッドと URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA

    リクエストの本文(JSON):

    {
      "policy": POLICY
    }
    

    リクエストを送信するには、次のいずれかのオプションを開きます。

    レスポンスには、更新された許可ポリシーが含まれます。

ID トークンを生成する

OpenID Connect(OIDC)ID トークンは、gcloud CLI、REST API、または Cloud クライアント ライブラリと Google API クライアント ライブラリを使用して生成できます。

以下のサンプルは、ローカル開発環境で使用するように設計されています。呼び出し元は、サービス アカウントではなくユーザー アカウントである必要があります。

OIDC ID トークンは 1 時間(3,600 秒)有効です。

サービス アカウントの Google 署名 OIDC ID トークンを生成します。

gcloud

  1. 呼び出し元のユーザー アカウントで gcloud CLI にログインしていることを確認します。

  2. gcloud auth print-identity-token コマンドを使用して、サービス アカウントのトークンを生成します。

    後述のコマンドデータを使用する前に、次のように置き換えます。

    • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
    • AUDIENCE_NAME: トークンのオーディエンス。通常は、トークンのアクセスに使用されるアプリケーションまたはサービスの URL です。
      • 次のコマンドを実行します。

        Linux、macOS、Cloud Shell

        gcloud auth print-identity-token --impersonate-service-account=PRIV_SA --audiences="AUDIENCE_NAME"

        Windows(PowerShell)

        gcloud auth print-identity-token --impersonate-service-account=PRIV_SA --audiences="AUDIENCE_NAME"

        Windows(cmd.exe)

        gcloud auth print-identity-token --impersonate-service-account=PRIV_SA --audiences="AUDIENCE_NAME"

        次のようなレスポンスが返されます。

        WARNING: This command is using service account impersonation. All API calls will be executed as
        [my-sa@my-project.iam.gserviceaccount.com].
        eyJhbGciOiJSUzI1NiIsImtpZDNhMDg4ZDRmZmMjJkYTVmZTM5MDZjY2MiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJ3d3cuZXhhbXBsJhenAiOiIxMTYzwNDYyMDk0ODIiLCJleHAiOjE2NTQ4ODU0MzEsImlhdCI6MTY1NDg4MTgzMSwiaXN6Ly9hY2NvdW50cy5nb29nbGUuY29tIiwic3ViIMDQ2MjA5NDgyIn0.F7mu8IHj5VQdu7ItFrnYAKyGd7YqXuOP_rFLc98q8BaFBycAF1zAQnSnwqnSUXba0UK9PDT_-IOry68qLwBObz4XlX9lk0ehpN0O0W9FcFToKLB6wefXXPd4h7xtuPe5KzmpSOqj2Qqv34HriGw00Nqd-oGSgNY_lZ4wGEf4rT4oQa_kEcrY57Q2G6pwd769BhgeFwoLi5aK_Cv2kvf_zfMszC-xlkP9zwWQ8XinJBwe-qcQBa4NTgrbueNtXsEjccBS366zmw
        

REST

Service Account Credentials API の serviceAccounts.generateIdToken メソッドによって、サービス アカウントの OIDC ID トークンが生成されます。

リクエストのデータを使用する前に、次のように置き換えます。

  • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
  • AUDIENCE_NAME: トークンのオーディエンス。通常は、トークンのアクセスに使用されるアプリケーションまたはサービスの URL です。

HTTP メソッドと URL:

POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/PRIV_SA:generateIdToken

リクエストの本文(JSON):

{
  "audience": "AUDIENCE_NAME",
  "includeEmail": "true"
}

リクエストを送信するには、次のいずれかのオプションを開きます。

generateId リクエストが成功した場合、レスポンス本文には 1 時間有効な ID トークンが含まれます。サービス アカウントの代わりに token をリクエストの認証に使用できます。

{
  "token": "eyJ0eXAi...NiJ9"
}

自己署名 JSON Web Token(JWT)を作成する

自己署名 JSON Web Token(JWT)はさまざまな状況で役立ちます。たとえば、次のような場合です。

  • 独自のアプリケーション間での安全な通信を行う。このシナリオでは、1 つのアプリケーションが、認証目的で別のアプリケーションによって確認できるトークンに署名できます。
  • OAuth を使用しないサービス アカウントの認証の説明のように、Google API の呼び出しを認証する。
  • API Gateway でデプロイされた API の認証を行う。
  • ユーザー、アカウント、デバイスに関する任意のクレームを含む JWT に署名することにより、サービス アカウントを ID プロバイダとして扱う。

JWT を作成するには、次の操作を行います。

必要な権限を提供する

直接リクエストには、認証情報をリクエストする呼び出し元と、認証情報が作成されるサービス アカウントの 2 つの ID が含まれます。権限を設定する方法は、呼び出し元がサービス アカウントとして認証されるか、ユーザー アカウントとして認証されるかによって異なります。

ローカル開発環境で、このページで説明する REST コマンドまたは gcloud CLI コマンドを実行する場合、呼び出し元をユーザー認証情報で表すことができます。Compute Engine で実行されているアプリケーションなどの自動ワークロードの場合、呼び出し元はサービス アカウントで表す必要があります。

サービス アカウント

呼び出し元のアプリケーションがサービス アカウントを ID として使用する場合、次のプリンシパルが関係します。

  • 呼び出し元のサービス アカウント(CALLER_SA

    このサービス アカウントは呼び出し元のアプリケーションを表し、有効期間の短い認証情報のリクエストを発行します。

  • 権限を保持しているサービス アカウント(PRIV_SA

    このサービス アカウントには、有効期間の短いトークンに必要な IAM ロールが付与されています。これは、有効期間の短いトークンが作成されるサービス アカウントです。

PRIV_SA に有効期間の短い認証情報を作成する権限を CALLER_SA に付与するには、PRIV_SA に対するサービス アカウント トークン作成者ロール(roles/iam.serviceAccountTokenCreator)を CALLER_SA に付与します。

PRIV_SA に必要なロールを付与します。

コンソール

  1. Google Cloud コンソールで、[サービス アカウント] ページに移動します。

    [サービス アカウント] に移動

  2. プロジェクトを選択します。
  3. 権限を保持しているサービス アカウントのメールアドレス(PRIV_SA)をクリックします。
  4. [権限] タブをクリックします。
  5. [このサービス アカウントにアクセスできるプリンシパル] で、[アクセスを許可] をクリックします。
  6. 呼び出し元のアカウント(CALLER_SA)のメールアドレスを入力します。

    例: demo@my-project.iam.gserviceaccount.com

  7. サービス アカウント トークン作成者ロール(roles/iam.serviceAccountTokenCreator)を選択します。
  8. [保存] をクリックして、サービス アカウントにロールを付与します。

gcloud

gcloud iam service-accounts add-iam-policy-binding コマンドで、サービス アカウントにロールを付与します。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • PRIV_SA: トークンが生成される権限保持サービス アカウントのメールアドレス。
  • CALLER_SA: 有効期間の短いトークンをリクエストするアプリケーションを表すサービス アカウントのメールアドレス。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

Windows(PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

Windows(cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

次のようなレスポンスが返されます。

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "serviceAccount:CALLER_SA"
      ],
      "role": "roles/iam.serviceAccountTokenCreator"
    }
  ],
  "etag": "BwXhCB4eyjY=",
  "version": 1
}

REST

  1. PRIV_SA の許可ポリシーを読み取ります。

    serviceAccounts.getIamPolicy メソッドで、サービス アカウントの許可ポリシーを取得します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
    • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。

    HTTP メソッドと URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    リクエストの本文(JSON):

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを開きます。

    次のような JSON レスポンスが返されます。

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

    サービス アカウントにロールを付与していない場合、レスポンスには etag 値のみが含まれます。この etag 値を次のステップに含めます。

  2. 許可ポリシーを変更して、CALLER_SA にサービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator)を付与します。

    たとえば、前の手順のサンプル レスポンスを変更するには、次のコードを追加します。

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }
  3. 更新された許可ポリシーを書き込みます。

    serviceAccounts.setIamPolicy メソッドは、サービス アカウントに更新後の許可ポリシーを設定します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
    • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。
    • POLICY: 設定するポリシーの JSON 表現。ポリシーの形式については、ポリシー リファレンスをご覧ください。

      たとえば、前の手順で示した許可ポリシーを設定するには、POLICY を次のように置き換えます。ここで、CALLER_SA は、有効期間が短いトークンを作成するサービス アカウントです。

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }

    HTTP メソッドと URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA

    リクエストの本文(JSON):

    {
      "policy": POLICY
    }
    

    リクエストを送信するには、次のいずれかのオプションを開きます。

    レスポンスには、更新された許可ポリシーが含まれます。

ユーザー認証情報

Google Cloud CLI を使用して有効期間の短いトークンを生成する場合、またはローカル開発環境から有効期間の短いトークンを生成する場合は、ユーザー アカウントを使用してトークンを生成できます。多くの場合、独自のユーザー アカウントを使用できます。

ユーザー アカウントを使用して有効期間の短いトークンを生成する場合、次の ID が関係します。

  • 呼び出し元アカウント(CALLER_ACCOUNT

    このユーザー アカウントは、権限を保持しているサービス アカウントに有効期間の短い認証情報を生成するために使用されます。

  • 権限を保持しているサービス アカウント(PRIV_SA

    このサービス アカウントには、有効期間の短いトークンに必要な IAM ロールが付与されています。これは、有効期間の短いトークンが作成されるサービス アカウントです。

CALLER_ACCOUNTPRIV_SA に有効期間の短い認証情報を作成できるようにするには、PRIV_SA に対するサービス アカウント トークン作成者ロール(roles/iam.serviceAccountTokenCreator)を CALLER_ACCOUNT に付与します。

PRIV_SA に必要なロールを付与します。

コンソール

  1. Google Cloud コンソールで、[サービス アカウント] ページに移動します。

    [サービス アカウント] に移動

  2. プロジェクトを選択します。
  3. 権限を保持しているサービス アカウントのメールアドレス(PRIV_SA)をクリックします。
  4. [権限] タブをクリックします。
  5. [このサービス アカウントにアクセスできるプリンシパル] で、[アクセスを許可] をクリックします。
  6. 呼び出し元のアカウントのプリンシパル ID(CALLER_ACCOUNT)を入力します。

    例: example-user@example.com

  7. サービス アカウント トークン作成者ロール(roles/iam.serviceAccountTokenCreator)を選択します。
  8. [保存] をクリックして、ユーザー アカウントにロールを付与します。

gcloud

gcloud iam service-accounts add-iam-policy-binding コマンドで、サービス アカウントにロールを付与します。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • PRIV_SA: トークンが生成される権限保持サービス アカウントのメールアドレス。
  • CALLER_ACCOUNT: 有効期間の短いトークンのリクエストに使用するユーザー アカウントのメールアドレス。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

Windows(PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

Windows(cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

次のようなレスポンスが返されます。

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "user:my-user@example.com"
      ],
      "role": "roles/iam.serviceAccountTokenCreator"
    }
  ],
  "etag": "BwX1ZbefjXU=",
  "version": 1
}

REST

  1. PRIV_SA の許可ポリシーを読み取ります。

    serviceAccounts.getIamPolicy メソッドで、サービス アカウントの許可ポリシーを取得します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
    • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。

    HTTP メソッドと URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    リクエストの本文(JSON):

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを開きます。

    次のような JSON レスポンスが返されます。

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

    サービス アカウントにロールを付与していない場合、レスポンスには etag 値のみが含まれます。この etag 値を次のステップに含めます。

  2. 許可ポリシーを変更して、CALLER_ACCOUNT にサービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator)を付与します。

    たとえば、前の手順のサンプル レスポンスを変更するには、次のコードを追加します。

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
  3. 更新された許可ポリシーを書き込みます。

    serviceAccounts.setIamPolicy メソッドは、サービス アカウントに更新後の許可ポリシーを設定します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
    • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。
    • POLICY: 設定するポリシーの JSON 表現。ポリシーの形式については、ポリシー リファレンスをご覧ください。

      たとえば、前の手順で示した許可ポリシーを設定するには、POLICY を次のように置き換えます。ここで、CALLER_ACCOUNT は、有効期間が短いトークンを作成するユーザー アカウントです。

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "CALLER_ACCOUNT"
            ]
          }
        ]
      }

    HTTP メソッドと URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA

    リクエストの本文(JSON):

    {
      "policy": POLICY
    }
    

    リクエストを送信するには、次のいずれかのオプションを開きます。

    レスポンスには、更新された許可ポリシーが含まれます。

JWT を生成する

自己署名 JWT を生成します。

REST

Service Account Credentials API の serviceAccounts.signJwt メソッドでは、サービス アカウントのシステムで管理する秘密鍵を使用して JWT に署名します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
  • JWT_PAYLOAD: 署名する JWT ペイロード。これは JWT クレームセットを含む JSON オブジェクトです。ご希望のユースケースに必要なクレームを含め、呼び出すサービスの検証要件を満たしてください。Google API を呼び出す場合は、クレーム要件について Google の認証ガイドをご覧ください。

    exp(有効期限)クレームは、今後 12 時間以内にする必要があります。Google API を呼び出す場合は、exp クレームは 1 時間以内に設定する必要があります。

    次の例のペイロードには、Google API を呼び出すクレームが含まれています。ここで、EXP は有効期限を表す整数タイムスタンプです。

    { \"iss\": \"PRIV_SA\", \"sub\": \"PRIV_SA\", \"aud\": \"https://firestore.googleapis.com/\", \"iat\": 1529350000, \"exp\": EXP }

HTTP メソッドと URL:

POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/PRIV_SA:signJwt

リクエストの本文(JSON):

{
  "payload": "JWT_PAYLOAD"
}

リクエストを送信するには、次のいずれかのオプションを開きます。

signJwt リクエストが成功した場合、レスポンスの本文には、署名付きの JWT と JWT の署名に使用された署名鍵 ID が含まれています。サービス アカウントの代わりに、signedJwt 値を署名なしトークンとして使用してリクエストを直接認証できます。トークンは、リクエストで指定された有効期限まで有効です。

{
  "keyId": "42ba1e...fc0a",
  "signedJwt": "eyJ0eXAi...NiJ9"
}

自己署名バイナリ オブジェクト(blob)を作成する

自己署名バイナリ オブジェクト(blob)は、データの送信元がわかっているときにバイナリデータを送信する際に使用されます(blob は自己署名であるため)。blob は、署名を作成するために使用できる Cloud Storage オブジェクトで、署名付き URL を含むさまざまな認証フローで必要になります。署名の詳細については、Cloud Storage のドキュメントをご覧ください。

自己署名バイナリ オブジェクトを作成するには、次の操作を行います。

必要な権限を提供する

直接リクエストには、認証情報をリクエストする呼び出し元と、認証情報が作成されるサービス アカウントの 2 つの ID が含まれます。権限を設定する方法は、呼び出し元がサービス アカウントとして認証されるか、ユーザー アカウントとして認証されるかによって異なります。

ローカル開発環境で、このページで説明する REST コマンドまたは gcloud CLI コマンドを実行する場合、呼び出し元をユーザー認証情報で表すことができます。Compute Engine で実行されているアプリケーションなどの自動ワークロードの場合、呼び出し元はサービス アカウントで表す必要があります。

サービス アカウント

呼び出し元のアプリケーションがサービス アカウントを ID として使用する場合、次のプリンシパルが関係します。

  • 呼び出し元のサービス アカウント(CALLER_SA

    このサービス アカウントは呼び出し元のアプリケーションを表し、有効期間の短い認証情報のリクエストを発行します。

  • 権限を保持しているサービス アカウント(PRIV_SA

    このサービス アカウントには、有効期間の短いトークンに必要な IAM ロールが付与されています。これは、有効期間の短いトークンが作成されるサービス アカウントです。

PRIV_SA に有効期間の短い認証情報を作成する権限を CALLER_SA に付与するには、PRIV_SA に対するサービス アカウント トークン作成者ロール(roles/iam.serviceAccountTokenCreator)を CALLER_SA に付与します。

PRIV_SA に必要なロールを付与します。

コンソール

  1. Google Cloud コンソールで、[サービス アカウント] ページに移動します。

    [サービス アカウント] に移動

  2. プロジェクトを選択します。
  3. 権限を保持しているサービス アカウントのメールアドレス(PRIV_SA)をクリックします。
  4. [権限] タブをクリックします。
  5. [このサービス アカウントにアクセスできるプリンシパル] で、[アクセスを許可] をクリックします。
  6. 呼び出し元のアカウント(CALLER_SA)のメールアドレスを入力します。

    例: demo@my-project.iam.gserviceaccount.com

  7. サービス アカウント トークン作成者ロール(roles/iam.serviceAccountTokenCreator)を選択します。
  8. [保存] をクリックして、サービス アカウントにロールを付与します。

gcloud

gcloud iam service-accounts add-iam-policy-binding コマンドで、サービス アカウントにロールを付与します。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • PRIV_SA: トークンが生成される権限保持サービス アカウントのメールアドレス。
  • CALLER_SA: 有効期間の短いトークンをリクエストするアプリケーションを表すサービス アカウントのメールアドレス。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

Windows(PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

Windows(cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

次のようなレスポンスが返されます。

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "serviceAccount:CALLER_SA"
      ],
      "role": "roles/iam.serviceAccountTokenCreator"
    }
  ],
  "etag": "BwXhCB4eyjY=",
  "version": 1
}

REST

  1. PRIV_SA の許可ポリシーを読み取ります。

    serviceAccounts.getIamPolicy メソッドで、サービス アカウントの許可ポリシーを取得します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
    • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。

    HTTP メソッドと URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    リクエストの本文(JSON):

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを開きます。

    次のような JSON レスポンスが返されます。

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

    サービス アカウントにロールを付与していない場合、レスポンスには etag 値のみが含まれます。この etag 値を次のステップに含めます。

  2. 許可ポリシーを変更して、CALLER_SA にサービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator)を付与します。

    たとえば、前の手順のサンプル レスポンスを変更するには、次のコードを追加します。

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }
  3. 更新された許可ポリシーを書き込みます。

    serviceAccounts.setIamPolicy メソッドは、サービス アカウントに更新後の許可ポリシーを設定します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
    • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。
    • POLICY: 設定するポリシーの JSON 表現。ポリシーの形式については、ポリシー リファレンスをご覧ください。

      たとえば、前の手順で示した許可ポリシーを設定するには、POLICY を次のように置き換えます。ここで、CALLER_SA は、有効期間が短いトークンを作成するサービス アカウントです。

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }

    HTTP メソッドと URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA

    リクエストの本文(JSON):

    {
      "policy": POLICY
    }
    

    リクエストを送信するには、次のいずれかのオプションを開きます。

    レスポンスには、更新された許可ポリシーが含まれます。

ユーザー認証情報

Google Cloud CLI を使用して有効期間の短いトークンを生成する場合、またはローカル開発環境から有効期間の短いトークンを生成する場合は、ユーザー アカウントを使用してトークンを生成できます。多くの場合、独自のユーザー アカウントを使用できます。

ユーザー アカウントを使用して有効期間の短いトークンを生成する場合、次の ID が関係します。

  • 呼び出し元アカウント(CALLER_ACCOUNT

    このユーザー アカウントは、権限を保持しているサービス アカウントに有効期間の短い認証情報を生成するために使用されます。

  • 権限を保持しているサービス アカウント(PRIV_SA

    このサービス アカウントには、有効期間の短いトークンに必要な IAM ロールが付与されています。これは、有効期間の短いトークンが作成されるサービス アカウントです。

CALLER_ACCOUNTPRIV_SA に有効期間の短い認証情報を作成できるようにするには、PRIV_SA に対するサービス アカウント トークン作成者ロール(roles/iam.serviceAccountTokenCreator)を CALLER_ACCOUNT に付与します。

PRIV_SA に必要なロールを付与します。

コンソール

  1. Google Cloud コンソールで、[サービス アカウント] ページに移動します。

    [サービス アカウント] に移動

  2. プロジェクトを選択します。
  3. 権限を保持しているサービス アカウントのメールアドレス(PRIV_SA)をクリックします。
  4. [権限] タブをクリックします。
  5. [このサービス アカウントにアクセスできるプリンシパル] で、[アクセスを許可] をクリックします。
  6. 呼び出し元のアカウントのプリンシパル ID(CALLER_ACCOUNT)を入力します。

    例: example-user@example.com

  7. サービス アカウント トークン作成者ロール(roles/iam.serviceAccountTokenCreator)を選択します。
  8. [保存] をクリックして、ユーザー アカウントにロールを付与します。

gcloud

gcloud iam service-accounts add-iam-policy-binding コマンドで、サービス アカウントにロールを付与します。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • PRIV_SA: トークンが生成される権限保持サービス アカウントのメールアドレス。
  • CALLER_ACCOUNT: 有効期間の短いトークンのリクエストに使用するユーザー アカウントのメールアドレス。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

Windows(PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

Windows(cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

次のようなレスポンスが返されます。

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "user:my-user@example.com"
      ],
      "role": "roles/iam.serviceAccountTokenCreator"
    }
  ],
  "etag": "BwX1ZbefjXU=",
  "version": 1
}

REST

  1. PRIV_SA の許可ポリシーを読み取ります。

    serviceAccounts.getIamPolicy メソッドで、サービス アカウントの許可ポリシーを取得します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
    • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。

    HTTP メソッドと URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    リクエストの本文(JSON):

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを開きます。

    次のような JSON レスポンスが返されます。

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

    サービス アカウントにロールを付与していない場合、レスポンスには etag 値のみが含まれます。この etag 値を次のステップに含めます。

  2. 許可ポリシーを変更して、CALLER_ACCOUNT にサービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator)を付与します。

    たとえば、前の手順のサンプル レスポンスを変更するには、次のコードを追加します。

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
  3. 更新された許可ポリシーを書き込みます。

    serviceAccounts.setIamPolicy メソッドは、サービス アカウントに更新後の許可ポリシーを設定します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
    • POLICY_VERSION: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。
    • POLICY: 設定するポリシーの JSON 表現。ポリシーの形式については、ポリシー リファレンスをご覧ください。

      たとえば、前の手順で示した許可ポリシーを設定するには、POLICY を次のように置き換えます。ここで、CALLER_ACCOUNT は、有効期間が短いトークンを作成するユーザー アカウントです。

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "CALLER_ACCOUNT"
            ]
          }
        ]
      }

    HTTP メソッドと URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA

    リクエストの本文(JSON):

    {
      "policy": POLICY
    }
    

    リクエストを送信するには、次のいずれかのオプションを開きます。

    レスポンスには、更新された許可ポリシーが含まれます。

自己署名 blob を生成する

サービス アカウントの自己署名 blob を生成します。

REST

Service Account Credentials API の serviceAccounts.signBlob メソッドでは、サービス アカウントのシステムで管理する秘密鍵を使用して blob に署名します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PRIV_SA: 有効期間の短いトークンが作成される権限保持サービス アカウントのメールアドレス。
  • BLOB_PAYLOAD: base64 でエンコードされたバイトの文字列。例: VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2cu

HTTP メソッドと URL:

POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/PRIV_SA:signBlob

リクエストの本文(JSON):

{
  "payload": "BLOB_PAYLOAD"
}

リクエストを送信するには、次のいずれかのオプションを開きます。

signBlob リクエストが成功した場合、レスポンスの本文には、署名 blob と blob の署名に使用された署名鍵 ID が含まれています。サービス アカウントの代わりに、signedBlob 値を署名なしトークンとして使用してリクエストを直接認証できます。トークンは、サービス アカウントのシステムで管理する秘密鍵が期限切れになるまで有効です。この鍵の ID はレスポンスの keyId フィールドの値です。

{
  "keyId": "42ba1e...fc0a",
  "signedBlob": "eyJ0eXAi...NiJ9"
}