获取 Google 服务帐户的签名 Jwt 令牌

2024-04-14

我正在尝试为 google 服务帐户生成签名的 JWT 令牌

now = int(time.time())
expires = now + 900  # 15 mins in seconds, can't be longer.
payload = {
     'iat': now,
     'exp': expires,
     'sub': '[email protected] /cdn-cgi/l/email-protection',
     'aud': 'aud'
}
body = {'payload': json.dumps(payload)}
name = 'projects/someproject/serviceAccounts/[email protected] /cdn-cgi/l/email-protection'

iam = googleapiclient.discovery.build('iam', 'v1', credentials=credentials)
request = iam.projects().serviceAccounts().signJwt(name=name, body=body)
resp = request.execute()
jwt = resp['signedJwt']

我面临的问题是关于凭证 如果我使用

credentials = service_account.Credentials.from_service_account_info(gcp_json_credentials_dict)

工作正常。

但我正在尝试使用默认服务帐户

credentials, your_project_id = google.auth.default(scopes=["https://www.googleapis.com/auth/cloud-platform"])

出现以下错误 -

googleapiclient.errors.HttpError: <HttpError 403 when requesting https://iam.googleapis.com/v1/projects/someproject/serviceAccounts/[email protected] /cdn-cgi/l/email-protection:signJwt?alt=json returned "Permission iam.serviceAccounts.signJwt is required to perform this operation on service account

首先,我将尝试解释为什么您会收到错误:

需要 iam.serviceAccounts.signJwt 权限才能对服务帐户执行此操作.

A) 您的代码正在使用默认服务帐户的计算服务上运行。我会称之为身份1.

B)您的代码正在冒充身份[电子邮件受保护] /cdn-cgi/l/email-protection。我会称之为身份2.

您的代码需要权限才能使用以下凭据身份1以及冒充的权利身份2.

Part 1:

当您使用计算服务的默认服务帐户或将服务帐户分配给计算服务时,两种形式的权限控制将生效。主控装置是IAM 角色分配给服务帐户。限制器是为计算服务设置的 ** OAuth 范围**。

OAuth 范围不授予权限,OAuth 范围限制已通过 IAM 角色授予服务账户的权限。这是很重要的一点,我看到很多配置不正确。我建议使用计算引擎访问范围 set to 允许完全访问所有云 API。然后修改/管理分配给分配给 Compute Engine 的服务帐号的 IAM 角色。

Part 2:

为了冒充另一个身份,在您的情况下身份1正在冒充身份2,您的代码必须有权这样做。有两种类型的身份可以被模拟: a) 服务帐户; b) 用户身份。就您而言,您正在冒充另一个服务帐户。

如果您模拟服务账户,则需要通过 IAM 角色授予正确的 IAM 权限身份2成员设置为身份1。可以这样想:身份2必须授予许可身份1.

如果您要模拟用户身份,则需要设置 Google Workspace域范围内的授权。您所模拟的帐号必须由 Google Workspace 管理。参考Google Workspace 域范围内的授权 https://developers.google.com/admin-sdk/directory/v1/guides/delegation已设置用户帐户模拟,这在您的情况下不是必需的。

现在您可能想知道,哪种身份需要冒充权? JWT 代表的身份。该身份由 JWT 声明声明iss. 您的 JWT 不包含 iss 声明。有关更多详细信息,请参阅示例link https://developers.google.com/identity/protocols/oauth2/service-account。您所冒充的身份由声明指定sub。在 OAuth 中讲iss正在冒充sub.

Part 3:

您还必须配置您的 Google Cloud 项目来支持您的目标。这需要启用两个 API:

  • iamcredentials.googleapis.com
  • cloudresourcemanager.googleapis.com

解决方案:

  1. 启用所需的 API:

gcloud services enable iamcredentials.googleapis.com

gcloud services enable cloudresourcemanager.googleapis.com

  1. 设置计算引擎访问范围 to 允许完全访问所有云 API。这需要关闭 VM 并编辑 VM 配置。

  2. Add the iss声明您使用该值创建的 JWT身份1.

  3. 授予包含权限的 IAM 角色iam.serviceAccounts.signJwt。一个很好用的角色是服务帐户令牌创建者到身份2。看到这个link https://cloud.google.com/iam/docs/understanding-roles#service-accounts-roles更多细节。

命令示例:

gcloud iam service-accounts add-iam-policy-binding [Identity-2] \
--member serviceAccount:[Identity-1\ \
--role roles/iam.serviceAccountTokenCreator
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取 Google 服务帐户的签名 Jwt 令牌 的相关文章

  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class
  • CFdump cfcomponent cfscript

    可以在 cfcomponent 中使用 cfdump 吗 可以在 cfscript 中使用 cfdump 吗 我知道 anser 不是 那么如何发出 insde cfcomponent 函数的值 cf脚本 我用的是CF8 可以在 cfcom
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低
  • Redis如何存储关联数组?设置、散列还是列表?

    我对 Redis 的所有可用存储选项有点困惑 我想做一些简单的事情 并且不想过度设计它 我正在与phpredis and Redis v2 8 6 我有一个需要存储的简单关联数组 我还需要能够通过其键检索项目并循环遍历所有项目 a arra
  • PHPUnit 和 Zend Framework assertRedirectTo() 问题

    我在创建的测试中遇到了 assertRedirectTo 问题 下面是我使用的代码 public function testLoggedInIndexAction this gt dispatch this gt assertControl
  • 如何使用asm.js进行测试和开发?

    最近我读到asm js规范 看起来很酷 但是是否有任何环境 工具来开发和测试这个工具 这还只是处于规范阶段吗 您可以尝试使用 emscripten 和 ASM JS 1 并从侧分支在 firefox 构建中运行它 有关 asm js 的链接
  • 从超立方体图像中获取文本的确切位置

    使用 tesseract 中的 GetHOCRText 0 方法 我能够检索 html 中的文本 并在 webview 中呈现 html 时 我能够获取文本 但图像中文本的位置与输出不同 任何想法都非常有帮助 tesseract gt Se
  • Vue.js[vuex] 如何从突变中调度?

    我有一个要应用于 json 对象的过滤器列表 我的突变看起来像这样 const mutations setStars state payload state stars payload this dispatch filter setRev
  • CSS溢出文本显示在几行中,没有断字

    我有一些长文本显示在 div 中 该 div 具有固定的宽度和高度 我希望文本显示在几行上 作为 div 高度 并且句子单词不会中断 一行中的单词前缀和下一行中的继续 此外 我想在末尾添加省略号最后一句话 CSS white space n
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个
  • 循环内的异步性

    我正在使用 jQuery getJSON 用于从一组实用程序的给定 URL 检索数据的 API 我真的很想找到一种为每个实用程序重用代码 完全相同 的方法 由于循环的执行与 ajax 调用无关 因此我无法找到保留循环值的方法 我知道这个描述
  • 用于验证目的的动态查找方法

    我正在使用 Ruby on Rails 3 0 7 我想在运行时查找一些记录以进行验证 但为该查找方法传递 设置一个值 也就是说 在我的班级中 我有以下内容 class Group lt lt ActiveRecord Base valid
  • rspec 中的模拟方法链

    有一系列方法可以获得user目的 我试图模拟以下内容以返回user in my Factory Girl current user AuthorizeApiRequest call request headers result 我可以模拟该
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50
  • 在 Nexus 7 2013 上更改方向时 CSS 媒体查询不起作用

    我目前正在我的笔记本电脑 台式电脑和 Nexus 7 2013 上测试 CSS 媒体查询 除了 Nexus 7 之外 它们在台式机和笔记本电脑上都运行良好 当我更改方向时 除非刷新页面 否则样式不会应用 例如 以纵向模式握住设备时 页面正常
  • 如何在react-highcharts中使用图表工具提示格式化程序?

    如何使用图表工具提示格式化程序 我正在使用高图表的反应包装器 我有这样的配置 const CHART CONFIG tooltip formatter tooltip gt var s b this x b each this points
  • 强制 Listview 不重复使用视图(复选框)

    我做了一个定制Listview 没有覆盖getView 方法 Listview 中的每个项目都具有以下布局 联系布局 xml

随机推荐