【发布时间】:2021-08-31 14:19:26
【问题描述】:
我想访问部署在 GCP 上且位于 Identity-Aware-Proxy (IAP) 之后的网站 REST API。我只需要能够从我的本地计算机访问,我不能使用服务帐户密钥来实现。
我尝试使用gcloud auth login 和gcloud auth application-default login 设置application_default_credentials,然后调用Oauth2 端点获取id_token。
无论我尝试什么,我都会不断收到错误消息“观众客户和客户需要在同一个项目中”。
默认凭据中的 client_id (74XXXXXXX) 和 IAP 的 client_id (73XXXXXXX) 不匹配,但它们都使用同一个 GCP 项目。
从这个 (How to authenticate programmatically to a Cloud Identity-Aware Proxy (Cloud IAP)-secured resource using user default credentials?) 问题中使用 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?
【问题讨论】:
-
google.auth.default() 正在获取的凭据是 user account 凭据。然后,您尝试提取 Client ID 和 Client Secret 并使用它们生成 OIDC 身份令牌,gcloud auth application-default login 最初并未将其请求为请求的范围。我不相信你能成功地做到这一点。验证身份令牌是否有效,包括签名。错误消息可能会误导您。
-
您能否详细说明如何做到这一点?
-
Client_ID 应以项目编号开头。在您的情况下,哪个 Client_ID 与项目编号匹配。是默认凭据 Client_ID 还是 IAP Client _ID?
-
您是否更新了文件 path_to/google-cloud-sdk/lib/googlecloudsdk/api_lib/auth 中的字段 DEFAULT_CREDENTIALS_DEFAULT_CLIENT_ID 和 DEFAULT_CREDENTIALS_DEFAULT_CLIENT_SECRET /util.py
-
我最终听从了 Johans 的建议,并在 GCP 凭据中创建了一个桌面应用程序,并从中使用了 client_id 和 client_secret。该代码现在打开一个浏览器选项卡以获取 auth_code,然后我使用 oauth2 api 获取通过 IAP 的 id_token。
标签: python google-cloud-platform identity-aware-proxy