【问题标题】:How to get a GCP identity-token programmatically with python如何使用 python 以编程方式获取 GCP 身份令牌
【发布时间】:2021-05-10 14:06:33
【问题描述】:
gcloud 命令行gcloud auth print-identity-token 的python 编程替代方案是什么?
我正在尝试通过 http 触发器调用 Google Cloud Function(仅适用于身份验证用户),并且我需要在身份验证标头中传递身份令牌。当我在 GCP 应用程序引擎上运行代码时,我的方法效果很好。但是,当我在自己的机器上运行程序时,我很难找到一种方法来获取这个身份令牌(我可以使用 gcloud 命令行 gcloud auth print-identity-token 创建令牌)
我找到了如何根据this answer 创建访问令牌,但我不明白如何创建身份令牌。
提前谢谢你!
【问题讨论】:
标签:
python
python-3.x
google-cloud-platform
google-iam
【解决方案1】:
好话题!这是一个漫长的过程,需要与 Google 进行数月的测试和讨论。
TL;DR:您无法使用您的用户凭据生成身份令牌,您需要有一个服务帐户(或模拟服务)才能生成身份令牌。
如果您有服务帐户密钥文件,我可以共享一段代码来生成身份令牌,但生成和拥有服务帐户密钥文件在全球范围内是一种不好的做法。
我发布了an article on this 和 2 个合并请求以实现 Java Google 身份验证库的演变(即使我也为 python OSS 项目做出贡献,我更像是 Java 开发人员而不是 python 开发人员)here 和 here。 如果您想了解目前缺少的内容以及 gcloud 命令的工作原理,可以阅读它们。
在最新的合并请求中,我了解到有些东西来自 google,内部,但到目前为止,我没有看到任何东西......
【解决方案2】:
如果您有服务帐户,则可以模拟这是从本地/开发机器获取 Python 中的 ID 令牌的一种方法。
import google.auth
from google.auth.transport.requests import AuthorizedSession
def impersonated_id_token():
credentials, project = google.auth.default(scopes=['https://www.googleapis.com/auth/cloud-platform'])
authed_session = AuthorizedSession(credentials)
sa_to_impersonate = "<SA_NAME>@<GCP_PROJECT>.iam.gserviceaccount.com"
request_body = {"audience": "<SOME_URL>"}
response = authed_session.post( f'https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/{sa_to_impersonate}:generateIdToken',request_body)
return response
if __name__ == "__main__":
print(impersonated_id_token().json())