REST を使用して認証する

このページでは、Google API に REST リクエストを行うときの認証方法について説明します。

Google クライアント ライブラリを使用する際の認証方法については、クライアント ライブラリを使用した認証をご覧ください。

準備

このページのサンプルを実行するには、次の手順を完了します。

  1. Cloud Resource Manager and Identity and Access Management (IAM) API を有効にします。

    gcloud services enable cloudresourcemanager.googleapis.comiam.googleapis.com
  2. Google Cloud CLI をインストールし、次のコマンドを実行して初期化します。

    gcloud init

    メタデータ サーバーを使用する場合、この手順は不要です。

認証情報の種類

REST 呼び出しの認証には、次のタイプの認証情報を使用できます。

  • gcloud CLI 認証情報

    これは、ローカル開発環境の REST メソッドに認証情報を提供するための最も簡単で安全な方法です。呼び出すメソッドに対して必要な Identity and Access Management(IAM)権限がユーザー アカウントに付与されている場合は、この方法をおすすめします。

    gcloud 認証情報は、gcloud CLI を使用して ADC に指定する認証情報とは異なります。詳細については、gcloud CLI 認証情報と ADC 認証情報をご覧ください。

  • アプリケーションのデフォルト認証情報(ADC)に提供される認証情報

    ADC は、コードが実行されているリソース(Compute Engine 仮想マシンなど)から認証情報を検索します。このため、本番環境での REST 呼び出しの認証には、これが推奨の方法となります。ローカル開発環境での認証に ADC を使用することも可能です。その場合は、gcloud CLI を使用して、認証情報を含むファイルをローカル ファイル システム内に作成します。

  • サービス アカウントの権限借用によって提供される認証情報。

    この方法では追加の設定が必要です。別のサービス アカウント用の有効期間が短い認証情報を取得するために既存の認証情報を使用する場合(例: サービス アカウントを使ってローカルでテストを行う場合、一時的に昇格させた権限をリクエストする場合)は、この方法を使用します。

  • メタデータ サーバーから返される認証情報

    この方法は、メタデータ サーバーにアクセスできる環境でのみ機能します。メタデータ サーバーから返される認証情報は、接続されたサービス アカウントを使用してアプリケーションのデフォルト認証情報により検出される認証情報と同じですが、メタデータ サーバーからアクセス トークンを明示的にリクエストし、REST リクエストで提供できます。メタデータ サーバーに認証情報をクエリするには、HTTP GET リクエストが必要です。この方法では、Google Cloud CLI を使用しません。

gcloud CLI 認証情報

以下の例を実行するには、プロジェクトに対する resourcemanager.projects.get 権限が必要です。resourcemanager.projects.get 権限は、閲覧者のロールroles/browser)など、さまざまなロールに含まれています。

  1. ユーザーの認証情報から生成されたアクセス トークンを挿入するには、gcloud auth print-access-token コマンドを使用します。

    次の例では、指定したプロジェクトの詳細を取得します。どの REST リクエストに対しても、同じパターンを使用できます。

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

    • PROJECT_ID: Google Cloud プロジェクト ID または名前。

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

    curl

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

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://cloudresourcemanager.googleapis.com/v3/projects/PROJECT_ID"

    PowerShell

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

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://cloudresourcemanager.googleapis.com/v3/projects/PROJECT_ID" | Select-Object -Expand Content

    プロジェクトの詳細が返されます。

割り当てプロジェクトが必要な API の場合は、リクエストで明示的に設定する必要があります。詳細については、このページの REST リクエストを使用して割り当てプロジェクトを設定するをご覧ください。

アプリケーションのデフォルト認証情報

以下の例を実行するには、ADC に提供する認証情報に関連付けられているプリンシパルに、プロジェクトに対する resourcemanager.projects.get 権限が必要です。resourcemanager.projects.get 権限は、閲覧者のロールroles/browser)など、さまざまなロールに含まれています。

  1. ADC に認証情報を提供します

    Google Cloud コンピューティング リソースで実行する場合は、ADC にユーザー認証情報を提供しないでください。代わりに、接続されたサービス アカウントを使用して認証情報を提供します。詳細については、サービス アカウントの接続をサポートする Google Cloud サービスをご覧ください。

  2. gcloud auth application-default print-access-tokenコマンドを使用して、ADC から返されたアクセス トークンを REST リクエストに挿入します。

    次の例では、指定したプロジェクトの詳細を取得します。どの REST リクエストに対しても、同じパターンを使用できます。

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

    • PROJECT_ID: Google Cloud プロジェクト ID または名前。

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

    curl

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

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://cloudresourcemanager.googleapis.com/v3/projects/PROJECT_ID"

    PowerShell

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

    $cred = gcloud auth application-default print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://cloudresourcemanager.googleapis.com/v3/projects/PROJECT_ID" | Select-Object -Expand Content

    プロジェクトの詳細が返されます。

    リクエストから、この API でサポートされていないエンドユーザー認証情報に関するエラー メッセージが返された場合は、このページの REST リクエストを使用して割り当てプロジェクトを設定するをご覧ください。

権限の借用元であるサービス アカウント

サービス アカウントの権限の借用について詳しくは、サービス アカウントの権限借用を使用するをご覧ください。

  1. 必要な権限を確認します。

    • ユーザー アカウントには、借用するサービス アカウント(権限を保持するサービス アカウント)に対する iam.serviceAccounts.getAccessToken 権限が必要です。iam.serviceAccounts.getAccessToken 権限は、サービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator)に含まれています。プロジェクトに対するオーナーロール(roles/owner)がある場合でも、この権限が必要になります。詳細については、必要な権限の設定をご覧ください。

    • 次の例では、権限を借用するサービス アカウントにはプロジェクトに対する resourcemanager.projects.get 権限が必要です。resourcemanager.projects.get 権限は、閲覧者のロールroles/browser)など、さまざまなロールに含まれています。

  2. 権限を保持するサービス アカウント(権限を借用するサービス アカウント)を特定または作成します。

    権限を保持するサービス アカウントには、API メソッドの呼び出しに必要な権限が付与されている必要があります。

  3. --impersonate-service-account フラグを指定して gcloud auth print-access-token コマンドを使用し、権限を保持するサービス アカウントのアクセス トークンを REST リクエストに挿入します。

    次の例では、指定したプロジェクトの詳細を取得します。どの REST リクエストに対しても、同じパターンを使用できます。

    この例を実行するには、権限を借用するサービス アカウントに resourcemanager.projects.get 権限が必要です。resourcemanager.projects.get 権限は、閲覧者のロールroles/browser)など、さまざまなロールに含まれています。

    次の項目を置き換えます。

    • PRIV_SA: 権限を保持するサービス アカウントのメールアドレス。例: my-sa@my-project.iam.gserviceaccount.com

    • PROJECT_ID: Google Cloud プロジェクト ID または名前。

    curl -X GET \
        -H "Authorization: Bearer $(gcloud auth print-access-token --impersonate-service-account=PRIV_SA)" \
        "https://cloudresourcemanager.googleapis.com/v3/projects/PROJECT_ID"
    

メタデータ サーバー

メタデータ サーバーからアクセス トークンを取得するには、メタデータ サーバーにアクセスできるサービスのいずれかを使用して REST 呼び出しを行う必要があります。

curl などのコマンドライン ツールを使用してアクセス トークンを取得し、REST リクエストに挿入します。

  1. メタデータ サーバーに対してクエリを行い、アクセス トークンを取得します。

    curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
        -H "Metadata-Flavor: Google"
    

    このリクエストにより、次の例に似たレスポンスが返されます。

    {
          "access_token":"ya29.AHES6ZRN3-HlhAPya30GnW_bHSb_QtAi85nHq39HE3C2LTrCARA",
          "expires_in":3599,
          "token_type":"Bearer"
     }
    
  2. アクセス トークンを REST リクエストに挿入して、次のようにします。

    • ACCESS_TOKEN: 前の手順で返されたアクセス トークン。
    • PROJECT_ID: Google Cloud プロジェクト ID または名前。
    curl -X GET \
        -H "Authorization: Bearer ACCESS_TOKEN" \
        "https://cloudresourcemanager.googleapis.com/v3/projects/PROJECT_ID"
    

REST リクエストで割り当てプロジェクトを設定する

ユーザー認証情報を使用して API を呼び出す場合、使用量に応じて課金され、割り当ての追跡に使用されるプロジェクトの設定が必要になる場合があります。API 呼び出しでユーザー認証情報がサポートされていないことや、割り当てプロジェクトが設定されていないことを通知するエラー メッセージが返された場合は、リクエストの割り当てプロジェクトを明示的に設定する必要があります。割り当てプロジェクトを設定するには、リクエストに x-goog-user-project ヘッダーを含めます。

この問題が発生した場合は、ユーザー認証情報が機能しないをご覧ください。

プロジェクトを請求先プロジェクトとして指定するには、serviceusage.services.use IAM 権限が必要です。serviceusage.services.use 権限には、Service Usage ユーザーの IAM ロールに含まれています。プロジェクトに対する serviceusage.services.use 権限がない場合は、セキュリティ管理者か、プロジェクトの Service Usage ユーザーのロールを付与できるプロジェクト オーナーに連絡します。

次の例では、Cloud Translation API を使用して「hello」という単語をスペイン語に翻訳します。Cloud Translation API は、割り当てプロジェクトの指定が必要な API です。サンプルを実行するには、リクエスト本文を含む request.json という名前のファイルを作成します。

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

  • PROJECT_ID: 課金プロジェクトとして使用する Google Cloud プロジェクトの ID または名前。

JSON 本文のリクエスト:

{
  "q": "hello",
  "source": "en",
  "target": "es"
}

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

curl

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://translation.googleapis.com/language/translate/v2"

PowerShell

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred"; "x-goog-user-project" = "PROJECT_ID" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://translation.googleapis.com/language/translate/v2" | Select-Object -Expand Content

翻訳リクエストは成功します。x-goog-user-project ヘッダーのないコマンドを使用してみると、課金プロジェクトを指定しないとどうなるか確認できます。

次のステップ