当前位置: 首页 > 知识库问答 >
问题:

使用Workload Identity Federation在Python中验证Google云存储

阳航
2023-03-14

是否可以使用谷歌的工作负载身份联合的OIDC方法来验证我的Python应用程序的谷歌云存储包。

我想这样做:

import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = str(os.path.dirname(os.path.dirname(__file__))) + "/keys/credentials.json"
from google.cloud import storage

import google.oauth2.id_token
import google.auth.transport.requests

request = google.auth.transport.requests.Request()
target_audience = "https://pubsub.googleapis.com"

obtained_id_token = google.oauth2.id_token.fetch_id_token(request, target_audience)

storage_client = storage.Client(credentials=obtained_id_token)

这会产生以下错误:

ValueError:此库仅支持来自google auth库python的凭据。看见https://google-auth.readthedocs.io/en/latest/有关此库的身份验证帮助


共有3个答案

司徒高寒
2023-03-14

这并不能解决问题中的工作负载标识联合部分,但可以使问题代码正常工作:

import google.oauth2.id_token
import google.auth.transport.requests

request = google.auth.transport.requests.Request()
target_audience = "https://storage.cloud.google.com/"

# Create ID token credentials.
credentials = google.oauth2.id_token.fetch_id_token_credentials(target_audience, request=request)

# Refresh the credential to obtain an ID token.
credentials.refresh(request)

id_token = credentials.token
id_token_expiry = credentials.expiry

storage_client = storage.Client(credentials=credentials)
bucket = storage_client.get_bucket(settings.GOOGLE_CLOUD_BUCKET_NAME)

仍然需要看看是否有可能在不需要回购中的凭据json文件的情况下进行身份验证。

莘昊
2023-03-14

不能直接回复评论但是

作为参考,这里有一些链接更详细地描述了这一点

>

  • 联合会将您的环境aws|oidc|azure凭据交换为GCP理解的凭据(不涉及svc帐户密钥),请参阅gcp工作负载标识联合

    Google发行的oidc(id_tokens)通常用于访问您部署在云运行等上的服务

    最后,仅供参考,谷歌使用svc帐户jwt(不是oidc或oauth,而是谷歌特有的)对某些服务进行身份验证的方式非常特殊。。。它一点也不常见,但这里描述了它参见jwt访问令牌

  • 郤浩慨
    2023-03-14
    匿名用户

    看看自动在萨尔的交换通用OIDC凭证为GCP凭证回购。

    IIUC将您的联合凭据转换为Google应用程序默认凭据(见下文),您可以在任何Google SDK中使用这些凭据。

    根据@john hanley的评论,您错误地使用了auth库。

    看看谷歌。验证(在导出GOOGLE_应用程序_凭证=/path/to/your/key.json之后)您可以:

    import google.auth
    
    credentials, project_id = google.auth.default()
    

     类似资料:
    • 我试图将一个用编写的函数迁移到 实时解压缩并逐行读取 对每一行执行一些光转换 将未压缩的输出(一次一行或块)写入GCS 输出是>2GB,但略小于3GB,所以它适合。 null AFAIC,我将坚持,因为输出可以放入内存--就目前而言--但是多部分上传是以最少的内存支持任何输出大小的方法。 想法还是替代方案?

    • 我正在谷歌云平台上工作,我必须使用java非Web应用程序访问云功能,就像我正在尝试使用谷歌云存储JSON API存储和检索谷歌云存储中的对象一样。 在访问这些之前,我需要对我的应用程序进行身份验证,所以我找到了授权API来进行授权访问。 null 我浏览了GCP文档,但没有得到区分这些文档的明确信息,我对GCP非常陌生,所以请您分享任何信息或博客链接,以说明如何使用Google Cloud Cl

    • 我试图使用云任务调用云运行服务,如文档中所述。 我有一个运行云运行服务。如果我让服务公开访问,它的行为将与预期的一样。 我已经创建了一个云队列,并使用本地脚本调度云任务。这个用的是我自己的账户。脚本如下所示 null 最后的测试:如果我在创建任务时从任务中删除,我将从Cloud Run得到一个403响应!不是401...如果我从服务帐户中删除“Cloud Run Invoker”角色并在本地使用c

    • 我正在尝试建立一个基于python的基本谷歌应用引擎站点,允许用户将文件上传到谷歌云存储(主要是图像) 我已经阅读了JSON API和GCS客户端库概述(以及blobstore等)的文档,但仍然没有很好地了解哪种方法是最好的以及它们之间的关系。如果有人能概述一下,或者给我指出一些我可以查看的资源,那就太好了 此外,任何相关的示例代码都会非常有用。我已经能够在此处运行上载示例,但不确定它们是否对应用

    • 这是一个很好的OAuth2用例吗?还是OAuth2仅用于授予第三方应用程序对用户数据的访问权限? 如果OAuth2不是可行的方法:如何将用户令牌安全地传递给浏览器,并防止中间人攻击?用户令牌应该在一定时间后过期吗?

    • 我在谷歌云存储桶中有文件。 如何将这些文件设置为Cloudflare CDN的原点? (Cloudflare控制面板似乎只想要根域上的网站...?)