【问题标题】: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 开发人员)herehere如果您想了解目前缺少的内容以及 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())
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-27
        • 1970-01-01
        • 1970-01-01
        • 2019-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-10
        相关资源
        最近更新 更多