使用 Google Compute Engine 默认服务帐户签署 Google Cloud Storage URL

2024-03-07

我正在尝试使用 GCE 默认服务帐户签署 GCS URL。我为计算默认服务帐户提供了必要的“服务帐户令牌创建者”角色。当我尝试在以下 Python 代码中签署 url 时,出现错误:

import google.auth
import google.auth.iam
from google.auth.transport.requests import Request as gRequest

creds, _ = google.auth.default(request=gRequest(), scopes=[
    'https://www.googleapis.com/auth/cloud-platform',
    'https://www.googleapis.com/auth/devstorage.read_write',
    'https://www.googleapis.com/auth/logging.write',
    'https://www.googleapis.com/auth/firebase',
    'https://www.googleapis.com/auth/compute.readonly',
    'https://www.googleapis.com/auth/userinfo.email',
])
## creds is a google.auth.compute_engine.credentials.Credentials
## creds.service_account_email is '<project-id>[email protected] /cdn-cgi/l/email-protection'
signer = google.auth.iam.Signer(
    gRequest(), credentials=creds,
    service_account_email=creds.service_account_email)

signer.sign('stuff')

Error:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  <TRUNCATED - my code>
  File "/usr/local/lib/python3.6/dist-packages/google/auth/iam.py", line 101, in sign
    response = self._make_signing_request(message)
  File "/usr/local/lib/python3.6/dist-packages/google/auth/iam.py", line 85, in _make_signing_request
    response.data))
google.auth.exceptions.TransportError: Error calling the IAM signBytes API: b'{\n  "error": {\n    "code": 400,\
n    "message": "Invalid service account email (default).",\n    "status": "INVALID_ARGUMENT"\n  }\n}\n'

是否不允许使用GCE默认SA?是否还有其他不允许的默认 SA(特别是 Google App Engine 灵活 SA)?


你需要两个角色。您无法在 Google Cloud Console 中将其中一项授予您的默认 GCE 服务帐户。记下您要使用的服务帐户电子邮件地址。

[更新 01/19/2019]

当您创建凭据时,它们不会在需要时初始化(例如,不请求访问令牌)。要预初始化凭据:

auth_url = "https://www.googleapis.com/oauth2/v4/token"
headers = {}
request = google.auth.transport.requests.Request()
creds.before_request(request, "POST", auth_url, headers)

[结束更新]

授予您的服务帐户角色roles/iam.serviceAccounts.signBlob

gcloud projects add-iam-policy-binding <project-id> --member=serviceAccount:<project-id>[email protected] /cdn-cgi/l/email-protection --role=roles/iam.serviceAccounts.signBlob

现在该服务帐户可以使用私钥对数据进行签名。

现在授予此服务帐户角色roles/iam.serviceAccountTokenCreator

gcloud iam service-accounts add-iam-policy-binding <project-id>[email protected] /cdn-cgi/l/email-protection --member=<project-id>[email protected] /cdn-cgi/l/email-protection --role=roles/iam.serviceAccountTokenCreator

现在该服务帐户可以使用该服务帐户来创建令牌。在命令中,您授予第一个 service_account_email 使用第二个 service_account_email 的权限。将此视为委托。请注意,一个角色位于项目级别,另一个角色分配给服务帐户本身。

在我的代码中,我实际上创建了一个新的服务帐户并使用该服务帐户的电子邮件地址进行签名。我向新服务帐户授予权限(使用第一个命令),并授予使用我的凭据使用新服务帐户的权限(第二个命令)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Google Compute Engine 默认服务帐户签署 Google Cloud Storage URL 的相关文章

随机推荐

  • 无法加载 Subversion python 绑定

    这是尝试将 SVN 存储库转换为 Mercurial 存储库的第 2 部分的一部分 命令是 hg convert file c svnrepository 但是 我得到的输出是 assuming destination svnreposit
  • Windows 上的 Jenkins 中的 Git 操作偶尔会挂起

    我们正在运行 Assembla 托管的 Git 项目的连续 Jenkins 构建 Jenkins 在 Tomcat 6 上以自己的用户身份运行 通常工作正常 然而 每隔一段时间 例如每 10 个构建一次 构建作业开始时的签出操作就会挂起 有
  • Ansible回调插件:如何获取其中扩展了变量的任务名称?

    我下面有一个游戏 其中包含一个名称中包含变量的任务 hosts localhost connection local vars a variable test tasks name this is a task to echo a vari
  • Android 的 WebView 中的 shouldOverrideUrlLoading 未运行

    编辑 找到解决方案 经过一番艰苦的搜索后发现了这一点 一个人 我的字面意思是一个人 说他们改为使用 onPageLoad 这非常适合我的目的 不同之处在于 onPageLoad 运行晚于 shouldOverrideUrlLoading 但
  • MassTransit 2.6.1 请求/响应模式 - 响应超时

    我正在将 MassTransit 作为 ServiceBus 实现来在 Web 项目中使用 我正在玩请求 响应 http docs masstransit project com en latest overview request htm
  • 如何在Python中进行多次导入?

    在 Ruby 中 我不是多次重复 require Python 中的 import 这个词 而是 w lib1 lib2 lib3 lib4 lib5 each x require x 因此它会迭代 libs 和 require 导入 的集
  • Zend 框架 2 文件下载

    我制作了一个表单来将文件上传到文件夹 data uploads使用Zend Filter File RenameUpload filter 这就像一个魅力 我现在的问题是如何提供这个文件给用户下载呢 我认为它会是这样的 response g
  • 将多维 NumPy 数组的图像旋转 90 度

    我有一个形状为 7 4 100 100 的 numpy 数组 这意味着我有 7 个 100x100 深度为 4 的图像 我想将这些图像旋转 90 度 我努力了 rotated numpy rot90 array 1 但它将数组的形状更改为
  • 如何将 JTable 中第一行的颜色设置为任何颜色并保留表中之前设置的颜色

    我已经阅读了很多有关 Java 中的 CellRendering 的内容 并且还访问了这个优秀网站的其他问答 不幸的是我仍然没有找到以下问题的解决方案 我想渲染一个显示 StatusEvents 的 JTable 这对于监视正在运行的系统是
  • 使用 load_model 时,keras 内核初始化程序被错误调用

    Keras 版本 2 2 4 张量流版本1 13 1 我正在使用 Colab 笔记本 我正在尝试制作自定义初始值设定项并使用 model save 保存模型 但是当我再次加载模型时 出现以下错误 类型错误 myInit 缺少 1 个必需的位
  • 是否可以在运行时更改 Qt 上的语言

    在我的应用程序中 我需要国际化 假设我为不同语言创建了多个 ts 文件 例如 德语 法语等 以及翻译的短语 现在 假设用户想要在运行时更改语言 使用Qt方法是不可能的吗 Qt 5 10 中引入的函数 QQmlEngine retransla
  • Rust 泛型中的常量值[重复]

    这个问题在这里已经有答案了 Rust 语言是否支持类似于 C 方式的通用代码中的常量值 看来语言overview http static rust lang org doc tutorial html generics不做广告 在 C 中使
  • 非管理员的图形 API 权限

    我想向非管理员用户 Bob 授予一些 Graph API 权限 以便它能够读取一些数据without需要管理员同意 If I give the admin consent here every permission is given to
  • 传递到字典中的模型项的类型为“System.Collections.Generic.List”

    我是 ASP NET 新手 这是我的第一个应用程序 我正在开发一个管理保险请求的应用程序 模型请求包含文件上传 addDemand 添加请求 需要成员 遵守者 登录 每次我尝试运行 addDemande 时都会收到错误 传递到字典中的模型项
  • Angular 测试中 fakeAsync 和 async 有什么区别?

    我知道tick 函数利用fakeAsync 我也可以使用fixture whenStable then with async and fakeAsync 以及 我想知道它们的确切用例 任何人都可以用例子解释这一点 注意 我想在这两种情况下使
  • Chart JS:忽略 x 值并将点数据放在第一个可用标签上

    我正在 Chart js 中制作折线图 并且遇到一个问题 我试图在线上绘制点数据 但它忽略了我给出的 x 值 而是将它们放在第一个可用标签上 this myLineChart new Chart this ctx type line dat
  • 如何从菜单切换到新的活动?

    我有一个菜单 想在用户单击菜单项时打开一个新的活动 Override public boolean onOptionsItemSelected MenuItem item Handle item selection switch item
  • 使用InnoIDE写入AppData目录?

    我需要写信给 C Users 用户 AppData Roaming AppName 安装过程中的文件夹 我使用 InnoIDE 程序进行设置 非常棒 然而 它似乎缺少一个 AppData 特殊文件夹来轻松访问该目录 例如 您可以使用 Des
  • 如何制作本地离线数据库

    我正在使用 HTML CSS 和 JavaScript 制作一个待办事项列表应用程序 我认为存储数据的最佳方式是本地数据库 我知道如何使用localStorage and sessionStorage 而且我也知道如何使用在线MySQL h
  • 使用 Google Compute Engine 默认服务帐户签署 Google Cloud Storage URL

    我正在尝试使用 GCE 默认服务帐户签署 GCS URL 我为计算默认服务帐户提供了必要的 服务帐户令牌创建者 角色 当我尝试在以下 Python 代码中签署 url 时 出现错误 import google auth import goo