外部 ID とサービス アカウントの使用

この記事では、Identity-Aware Proxy(IAP)と外部 ID を使用しているときに、サービス アカウントで認証を行う方法について説明します。

クライアント ID とシークレットの取得

  1. Cloud Console で IAP ページに移動します。

    IAP ページに移動

  2. [HTTP Resources] タブをクリックします。

  3. サービス アカウントを使用するように構成するアプリを探します。

  4. オーバーフロー メニューから [クライアント ID の表示] を選択します。

アプリのクライアント ID とシークレットを表示するページが開きます。これらの情報は、次のセクションで Identity Platform を構成するときに必要になります。

Google を ID プロバイダとして構成する

Identity Platform プロジェクトで認証に Google をまだ使用していない場合は、クライアント ID とシークレットを使用して新しい構成を作成します。

  1. Cloud Console で Identity Platform プロバイダのページに移動します。
    [ID プロバイダ] ページに移動

  2. Identity Platform マルチテナンシーを使用している場合は、IAP リソースに関連付けられているテナントを選択します。

  3. [プロバイダを追加] をクリックします。

  4. プロバイダのリストから Google を選択します。

  5. [ウェブ SDK 構成] で、前のセクションで取得したクライアント ID とシークレットを入力します。

  6. [保存] をクリックします。

すでに Google 認証を使用している場合は、クライアント ID をホワイトリストに登録できます。この操作を行っても、既存のユーザーに影響はありません。

  1. Cloud Console で Identity Platform プロバイダのページに移動します。
    [ID プロバイダ] ページに移動

  2. Identity Platform マルチテナンシーを使用している場合は、IAP リソースに関連付けられているテナントを選択します。

  3. プロバイダのリストで Google を選択し、[編集] をクリックします。

  4. [ホワイトリスト登録済みクライアント ID] で、[追加] をクリックします。

  5. 前のセクションで取得したクライアント ID を入力します。

  6. [保存] をクリックします。

Identity Platform トークンと Google トークンの交換

Google で初めて認証を行うときに、Identity Platform から Google ID トークンが返されます。これにより、signInWithIdp を呼び出し、Identity Platform トークンと交換できます。

Node.js

import * as firebase from 'firebase/app';
import 'firebase/auth';

const config = {
  apiKey: '...',
};
firebase.initializeApp(config);
const cred = firebase.auth.GoogleAuthProvider.credential(google_oidc_id_token);
firebase.auth().signInWithCredential(cred)
  .then((userCredential) => {
    return userCredential.user.getIdToken();
  })
  .then((gcipIdToken) => {
    // This token can now be used to access the resource.
  })
  .catch((error) => {
    // Error occurred.
  });

Python

SIGN_IN_WITH_IDP_API = 'https://identitytoolkit.googleapis.com/v1/accounts:signInWithIdp'

def exchange_google_id_token_for_gcip_id_token(api_key, tenant_id, google_open_id_connect_token):
  url = SIGN_IN_WITH_IDP_API + '?key=' + api_key
  data={'requestUri': 'http://localhost',
        'returnSecureToken': True,
        'postBody':'id_token=' + google_open_id_connect_token + '&providerId=google.com',
        'tenantId': tenant_id}
  resp = requests.post(url, data)
  res = resp.json()
  return res['idToken']

REST

リクエスト:

POST https://identitytoolkit.googleapis.com/v1/accounts:signInWithIdp?key=API-KEY

本文:

{
"postBody":"id_token=GOOGLE-ID-TOKEN&providerId=google.com"
"requestUri": "http://localhost",
"returnIdpCredential": true,
"returnSecureToken": true,
"tenantId": "TENANT-ID"
}

IAP によってリソースにアクセスするには、認証ヘッダーに Identity Platform の ID トークンを含めます。

curl -H "Authorization: Bearer GCIP-ID-TOKEN" "https://example.appspot.com/api"

外部 ID は IAM をサポートしていないため、アプリのアクセス制御を手動で更新してサービス アカウントへのアクセスを許可する必要があります。詳しくは、外部 ID の JWT をご覧ください。