以编程方式访问 IAP 背后的网站?
Access website behind IAP programatically?
我想访问部署在 GCP 上并位于身份识别代理 (IAP) 后面的网站 REST API。我只需要能够从我的本地计算机访问,我不能使用服务帐户密钥来实现。
我尝试使用 gcloud auth login
和 gcloud auth application-default login
来设置 application_default_credentials,然后调用 Oauth2 端点来获取 id_token.
无论我尝试什么,我总是收到错误消息“观众客户端和客户端需要在同一个项目中”。
我的 client_id 默认凭据 (74XXXXXXX) 和 IAP (73XXXXXXX) 的 client_id 不匹配,但它们都使用相同的 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 吗?
观众客户端和客户端需要在同一个项目中。这意味着默认凭据客户端 ID 和 IAP 客户端 ID 没有匹配的项目编号。使用从 gcloud auth application-default login 生成的默认凭据给出默认凭据的不匹配 Client_ID 因为 Client_ID 应以项目编号开头。用于获取刷新令牌的 Client ID 项目应与 IAP Client 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 的评论 (Access website behind IAP programatically?),并在 GCP Credentials 中创建了一个桌面应用程序。我在桌面应用程序中使用 client_id 和 client_secret 首先获取 auth_code
,然后 refresh_token
,然后通过 Oauth2 API id_token
.然后可以在 header 中使用此令牌来传递 IAP。
代码现在打开一个浏览器选项卡,用户需要在其中登录,但这对我的用例来说没问题。有关代码示例,请参阅 https://whosebug.com/a/49129038/1411088。
我想访问部署在 GCP 上并位于身份识别代理 (IAP) 后面的网站 REST API。我只需要能够从我的本地计算机访问,我不能使用服务帐户密钥来实现。
我尝试使用 gcloud auth login
和 gcloud auth application-default login
来设置 application_default_credentials,然后调用 Oauth2 端点来获取 id_token.
无论我尝试什么,我总是收到错误消息“观众客户端和客户端需要在同一个项目中”。
我的 client_id 默认凭据 (74XXXXXXX) 和 IAP (73XXXXXXX) 的 client_id 不匹配,但它们都使用相同的 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 吗?
观众客户端和客户端需要在同一个项目中。这意味着默认凭据客户端 ID 和 IAP 客户端 ID 没有匹配的项目编号。使用从 gcloud auth application-default login 生成的默认凭据给出默认凭据的不匹配 Client_ID 因为 Client_ID 应以项目编号开头。用于获取刷新令牌的 Client ID 项目应与 IAP Client 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 的评论 (Access website behind IAP programatically?),并在 GCP Credentials 中创建了一个桌面应用程序。我在桌面应用程序中使用 client_id 和 client_secret 首先获取 auth_code
,然后 refresh_token
,然后通过 Oauth2 API id_token
.然后可以在 header 中使用此令牌来传递 IAP。
代码现在打开一个浏览器选项卡,用户需要在其中登录,但这对我的用例来说没问题。有关代码示例,请参阅 https://whosebug.com/a/49129038/1411088。