【问题标题】:How do I use a GCloud Access Token with the Python SDK?如何在 Python SDK 中使用 GCloud 访问令牌?
【发布时间】:2021-02-04 06:44:27
【问题描述】:

我可以使用

获取服务帐户的访问令牌
gcloud auth print-access-token --impersonate-service-account=<my-service-account>

假设我从某个地方(例如,在环境变量中)有这样一个令牌,我如何使用它来进行身份验证,例如Google Cloud Storage Client SDK?

我查看了 Google Auth 包中各种包的文档,但我发现没有一个似乎接受令牌作为授权方法。

【问题讨论】:

  • 您能描述一下您的用例吗?你要做的事情真是奇怪!

标签: google-cloud-platform gcloud-python


【解决方案1】:

如果您查看code,我不确定访问令牌对于 Python SDK 是否足够,您需要提供更多配置数据,例如项目 ID 等等...(也可以通过环境设置但需要完成)。 通常,如果您设置了所有正确的环境变量,则身份验证应该使用令牌工作。

您遇到的错误是什么,也许您缺少其他一些配置?

【讨论】:

  • 我什至找不到可以接受令牌作为参数的Credentials 子类。现在我尝试了google.oauth2.credentials.Credentials(token),当我在本地尝试时它似乎工作正常,但在Docker容器中它显示Could not automatically determine credentials. Please set GOOGLE_APPLICATION_CREDENTIALS or explicitly create credentials and re-run the application.
  • 嗯,怀疑它似乎需要完整的 JSON 配置文件...在删除 - GOOGLE_APPLICATION_CREDENTIALS 的 env var 后尝试在本地计算机上运行...它也应该失败.. . 你需要验证你的 docker - 它上面是否有 cloud sdk 或除了令牌的 env var 之外的任何东西?您是否从 docker 中运行了 gcloud auth print-access-token --impersonate-service-account=&lt;my-service-account&gt;
  • 否; gcloud auth print-access-token ... 在 Docker 之外运行。该容器安装了gcloud(或者,如果需要,我可以添加它),但它没有完整的 JSON 密钥文件。我要解决的问题是通过只给它一个令牌(过期)而不是一个密钥文件(它不会)来在容器内进行身份验证。主要原因是执行环境(Flyte)不允许我挂载任何东西或设置环境变量,所以我必须在容器中嵌入 auth 的东西。
  • 我有点困惑,如果命令在 Docker 之外运行并且您无法挂载/设置环境变量 - 您会怎么做?我明白了,我对这种环境没有太多经验......我建议作为最后的手段是非常糟糕的做法,但我猜你是从某个存储库中构建 docker,你可以有一个加密的带有相关数据的 JSON - 在构建 docker 时,请确保包含相关文件并确保使用 Docker 命令解密并设置GOOGLE_APPLICATION_CREDENTIALS 位置...
  • 如果您使用的是 CI/CD 构建系统,最好从那里进行设置...但通常您必须从 Docker 内部以某种方式进行身份验证...
【解决方案2】:

我已经能够在 python 中获取和使用 GCloud 访问令牌,如下所示(进程所有者需要该服务的 Service Account Token Creator 权限):

from google.cloud.iam_credentials_v1 import IAMCredentialsClient
from google.oauth2.credentials import Credentials
import googleapiclient.discovery

response = IAMCredentialsClient().generate_access_token(
    name=f'projects/-/serviceAccounts/{service_id}',
    scope=['https://www.googleapis.com/auth/gmail.insert'],
)
service = googleapiclient.discovery.build(
    'gmail',
    'v1',
    credentials=Credentials(response.access_token), <= use your token here
)

很遗憾,I'm having trouble setting up Domain-wide delegation with this syntax

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-09
    • 2020-12-17
    • 2019-01-22
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    相关资源
    最近更新 更多