如何用Python编程获取GCP身份令牌

vsikbqxv  于 2023-07-01  发布在  Python
关注(0)|答案(3)|浏览(274)

什么是gcloud命令行gcloud auth print-identity-token的python编程替代方案?
我试图通过http触发器调用Google Cloud Function(仅适用于auth用户),我需要在Authentication头中传递身份令牌。我有一个方法,当我运行GCP应用程序引擎的代码时,它工作得很好。然而,当我在自己的机器上运行这个程序时,我很难找到一种方法来获得这个身份令牌(在那里我可以用gcloud命令行gcloud auth print-identity-token创建令牌)。
我发现了如何根据this answer创建access-token,但我没有设法理解如何创建identity-token
感谢您的评分

os8fio9y

os8fio9y1#

好主题!这是一个很长的路,和几个月的测试和讨论与谷歌。
TL;DR:您不能用您的用户凭证生成身份令牌,您需要有一个服务帐户(或模拟服务)来生成身份令牌。

  • 如果您有服务帐户密钥文件,我可以共享一段代码来生成身份令牌,但生成和拥有服务帐户密钥文件在全球范围内是一种不好的做法。*

我发布了an article on this和2个合并请求,以实现Java Google auth库的演变(我更像是Java开发人员,而不是Python开发人员,即使我也为Python OSS项目做出了贡献)herehere。* 如果你想了解gcloud命令缺少了什么,以及它现在是如何工作的,你可以阅读它们。*
在最新的合并请求中,我知道有些东西来自谷歌内部,但到目前为止,我没有看到任何东西……

9udxz4iz

9udxz4iz2#

如果你有一个服务帐户,你可以模拟,这是从本地/dev机器获取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())
yiytaume

yiytaume3#

您可以通过subprocess.check_output从python运行shell命令,并使用返回值。
这对我很有效:

gcloud_itoken = subprocess.check_output(["gcloud","auth", "print-identity-token"])
gcloud_itoken_str = gcloud_itoken.decode().strip()
do_something(gcloud_itoken_str)

相关问题