この記事では、Identity-Aware Proxy(IAP)と外部 ID を使用しているときに、サービス アカウントで認証を行う方法について説明します。
クライアント ID とシークレットの取得
Google Cloud コンソールで [IAP] ページに移動します。
[アプリケーション] タブをクリックします。
サービス アカウントを使用するように構成するアプリを探します。
オーバーフロー メニューから [OAuth 構成に移動] を選択します。
アプリのクライアント ID とシークレットを表示するページが開きます。これらの情報は、次のセクションで Identity Platform を構成するときに必要になります。
Google を ID プロバイダとして構成する
Identity Platform プロジェクトで認証に Google をまだ使用していない場合は、クライアント ID とシークレットを使用して新しい構成を作成します。
Google Cloud コンソールで [Identity Platform Providers] ページに移動します。
[ID プロバイダ] ページに移動Identity Platform マルチテナンシーを使用している場合は、IAP リソースに関連付けられているテナントを選択します。
[プロバイダを追加] をクリックします。
プロバイダのリストから Google を選択します。
[ウェブ SDK 構成] で、前のセクションで取得したクライアント ID とシークレットを入力します。
[保存] をクリックします。
すでに Google 認証を使用している場合は、代わりにクライアント ID を使用できます。この操作を行っても、既存のユーザーに影響はありません。
Google Cloud コンソールで [Identity Platform Providers] ページに移動します。
[ID プロバイダ] ページに移動Identity Platform マルチテナンシーを使用している場合は、IAP リソースに関連付けられているテナントを選択します。
プロバイダのリストで Google を選択し、[編集] をクリックします。
[許可されたクライアント ID] で [追加] をクリックします。
前のセクションで取得したクライアント ID を入力します。
[保存] をクリックします。
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 をご覧ください。