Google 云 python 使用本地应用程序默认身份令牌对云 运行 的身份验证请求

Google Cloud python autheticated request to cloud run using local application default identity token

我正在尝试将 following 命令从 CLI(有效)转换为 python,但我遇到了一些问题。

curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" SERVICE_URL

问题是我无法请求具有 application default local credentials 令牌的有效 Bearer 来向 Google 云 运行 发出授权请求。如果我从 CLI gcloud auth print-identity-token 生成 Bearer 令牌并在 python 请求中使用它,一切正常

request_url = 'https://<my endpoint>'
identity_token = '<>' # response of gcloud auth print-identity-token)
header= {'Authorization': f'Bearer {identity_token}'}
requests.get(url=request_url, headers=receiving_service_headers)

来自 google auth documentation 我了解到云 运行 通信是基于支持模拟身份验证的身份令牌,但我无法生成有效的凭据。

from google.auth import impersonated_credentials, default
from google.auth.transport.requests import AuthorizedSession

request_url = 'https://<my endpoint>'
source_credentials, project = default()

creds = impersonated_credentials.IDTokenCredentials(
    source_credentials,
    target_audience=request_url)

authed_session = AuthorizedSession(creds)
resp = authed_session.get(request_url)
print(resp)

bui 我收到以下错误

google.auth.exceptions.GoogleAuthError: Provided Credential must be impersonated_credentials

谢谢

如果要将 curl 命令转换为 python 请求,请按照 enter link 进行操作。这是转换后的代码:

导入请求

headers = { 'Authorization': 'Bearer $(gcloud auth print-identity-token)', }

响应 = requests.get('http://SERVICE_URL', headers=headers)

今天这是不可能的。我在 article 中谈到了它。您需要一个服务帐户才能使用 Google Auth 库生成有效的 JWT 令牌。所有图书馆和所有语言都存在同样的问题。

上周,我推送了一个 merge request in the Java auth library 来解决这个问题。不知道为什么Google不自己实现

在您的本地环境中,如果您想在本地和云端使用相同的代码,您必须生成一个服务帐户密钥文件并将其与 ADC 一起使用。可悲的是,这是一个安全问题...