0

GCP にデプロイされ、Identity-Aware-Proxy (IAP) の背後にある Web サイト REST API にアクセスしたいと考えています。ローカル コンピューターからのみアクセスできればよいのですが、それを実現するためにサービス アカウント キーを使用することはできません。

gcloud auth loginapplication_default_credentials を使用しgcloud auth application-default loginて設定し、Oauth2 エンドポイントを呼び出して id_token を取得しようとしました。

何を試しても、「オーディエンスクライアントとクライアントは同じプロジェクトにある必要があります」というエラーが返されます。

デフォルトの認証情報にある client_id (74XXXXXXX) と IAP の client_id (73XXXXXXX) は一致しませんが、どちらも同じ GCP プロジェクトを使用しています。

この (ユーザーのデフォルト認証情報を使用して Cloud Identity-Aware Proxy (Cloud IAP) で保護されたリソースにプログラムで認証する方法は? )のPython の例を使用しています。

import google.auth
import requests
import json

def id_token_from_default_creds(audience): 
    cred, proj = google.auth.default()
    # data necessary for ID token
    client_id = cred.client_id
    client_secret= cred.client_secret
    refresh_token = str(cred.refresh_token)
    return id_token_from_refresh_token(client_id, client_secret, refresh_token, audience)

def id_token_from_refresh_token(client_id, client_secret, refresh_token, audience):
    oauth_token_base_URL = "https://www.googleapis.com/oauth2/v4/token"
    payload = {"client_id": client_id, "client_secret": client_secret,
                "refresh_token": refresh_token, "grant_type": "refresh_token",
                "audience": audience}
    res = requests.post(oauth_token_base_URL, data=payload)
    return (str(json.loads(res.text)[u"id_token"]))

print("ID token from \"default\" credentials: %s" % id_token_from_default_creds("<IAP Client ID>"))

IAP にローカル ユーザー資格情報を渡す方法についてのアイデアはありますか?

4

1 に答える 1

0

オーディエンス クライアントとクライアントは同じプロジェクトにある必要があります。これは、デフォルトの認証情報のクライアント ID と IAP クライアント ID が一致するプロジェクト番号を持っていないことを意味します。gcloud auth application-default loginから生成されたデフォルトの認証情報を使用すると、Client_ID がプロジェクト番号で始まる必要があるため、デフォルトの認証情報の Client_ID が一致しません。更新トークンを取得するために使用されるクライアント ID のプロジェクトは、IAP クライアント ID のプロジェクトと一致する必要があります。Gcloud は、path_to/google-cloud-sdk/lib/googlecloudsdk/api_lib/auth/util.py で定義されたクライアント ID とシークレットをデフォルトの資格情報 (DEFAULT_CREDENTIALS_DEFAULT_CLIENT_ID と DEFAULT_CREDENTIALS_DEFAULT_CLIENT_SECRET) に使用します。そのため、util.py を変更しないと google.auth.default() からの更新トークンを使用できません。

Johns のコメント (プログラムで IAP の背後にあるウェブサイトにアクセスしますか? ) に従い、GCP Credentials でデスクトップ アプリを作成しました。デスクトップ アプリから client_id と client_secret を使用して、最初に を取得auth_codeし、次にrefresh_tokenを取得しid_token、Oauth2 API を通過します。このトークンをヘッダーで使用して、IAP を渡すことができます。

コードは、ユーザーがログインする必要があるブラウザー タブを開きますが、私のユース ケースでは問題ありません。コード例については、https://stackoverflow.com/a/49129038/1411088を参照してください。

于 2021-09-02T14:06:24.437 に答える