带有 Google 服务帐户主题的generate_access_token()

2024-01-23

在 python 中,我尝试通过服务帐户调用 GMail API委派全域权限 https://developers.google.com/identity/protocols/oauth2/service-account#authorizingrequests, without using SERVICE_ACCOUNT_FILE.

我的目标是避免制造秘密Key对于服务帐户。相反,我给了Service Account Token Creator流程所有者的角色(我在本地开发中,App Engine 服务帐户在产品中)。

在下面的代码中,我成功获取并使用了服务帐户的访问令牌,没有任何SERVICE_ACCOUNT_FILE.

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

tk = IAMCredentialsClient().generate_access_token(
    name=f'projects/-/serviceAccounts/{service_id}',
    scope=['https://www.googleapis.com/auth/gmail.insert'],
    # subject='[email protected] /cdn-cgi/l/email-protection' doesn't work here :'(
)
service = googleapiclient.discovery.build('gmail', 'v1', credentials=Credentials(tk.access_token))
response = service.users().messages().insert(userId='[email protected] /cdn-cgi/l/email-protection', body=body).execute()

问题是,在 Google Admin 中向服务帐户授予权限后my.domain,我收到以下错误:

{'message': '前置条件检查失败。', 'domain': '全局', 'reason': 'failedPrecondition'}

我怀疑我缺少的是subject,即管理员的电子邮件地址my.domain.

我知道我可以提供subject通过构建credentials不同的是:

from google.oauth2 import service_account
credentials = service_account.Credentials.from_service_account_file(key_file, scopes=scopes)
delegated_credentials = credentials.with_subject('[email protected] /cdn-cgi/l/email-protection'). # <- I need this
service = googleapiclient.discovery.build('gmail', 'v1', credentials=delegated_credentials)

但这需要创建一个密钥,我想避免这种情况。

有没有办法传递上面第一个代码示例中的主题?


据我所知这是不可能的

Would be happy to be proved wrong on this!

我将此作为免责声明,因为你是对的,它并没有明确否认这种可能性。通常并不要求文档明确表达您可以表达的一切not这样做,尽管我确实看到这里可能会造成混乱,因此可能值得“发送反馈”到文档页面。

说明内容

准备进行授权 API 调用

从API控制台获取客户端电子邮件地址和私钥后...

source https://developers.google.com/identity/protocols/oauth2/service-account#python

没有任何地方说“这是一个可选步骤”。这在其他地方也是如此,比如有关域范围委派的目录 API 说明 https://developers.google.com/admin-sdk/directory/v1/guides/delegation, 或者报告API https://developers.google.com/admin-sdk/reports/v1/guides/delegation

不使用密钥的建议

以下内容来自您链接的文章:

仅当没有可行的替代方案时才使用服务帐户密钥

服务帐户密钥可让应用程序作为服务进行身份验证 帐户,类似于用户使用用户名和进行身份验证的方式 密码。

source https://cloud.google.com/blog/products/identity-security/how-to-authenticate-service-accounts-to-help-keep-applications-secure

例如,当您将服务帐户附加到 App Engine 实例时,该实例就像用户,而服务帐户就是其用户帐户。它充当实例的一种身份。有关此的更多信息StackOverflow线程 https://stackoverflow.com/questions/55354070/how-to-assign-multiple-service-account-credentials-to-google-cloud-functions.

所以服务帐户的唯一方法是假装是另一个帐户,有钥匙。同样,用户充当服务帐户的唯一方法是使用密钥。因此,如果您尝试启用域范围的委派,这预示着您希望有一个服务帐户行为as-if这是其他帐户,拥有钥匙是必不可少的,无论服务帐户是否附加到 App Engine 实例。

当然,它没有明确提到你可以not无需钥匙即可实现此目的。虽然没有提到你can任何一个。从我运行的测试来看,我遇到了与您类似的结果,所以看来您不能。正如免责声明中提到的,我很高兴被证明是错误的,但是,我怀疑这是由于漏洞而不是预期行为造成的。

您没有提到为什么需要域范围的授权,因此您可能需要评估是否真的需要它。通常所需要的只是 OAuth 流程,应用程序在其中执行操作哦-代表用户的,而不是as-if是用户。

参考

  • 使用服务帐户访问 Google API https://developers.google.com/identity/protocols/oauth2/service-account#python
  • 如何验证服务帐户 https://cloud.google.com/blog/products/identity-security/how-to-authenticate-service-accounts-to-help-keep-applications-secure
  • 有关域范围委派的目录 API 说明 https://developers.google.com/admin-sdk/directory/v1/guides/delegation
  • 报告有关域范围委派的 API 指令 https://developers.google.com/admin-sdk/reports/v1/guides/delegation
  • “如何将多个服务帐户分配给云功能”(你不能) https://stackoverflow.com/questions/55354070/how-to-assign-multiple-service-account-credentials-to-google-cloud-functions.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有 Google 服务帐户主题的generate_access_token() 的相关文章

  • Selenium 3 Firefox .click() 不起作用

    自从我升级到最新的 Selenium 版本后 我的 Firefox 驱动程序无法正常工作 未能通过搜索 Google Stack 找到答案 我希望这里有人能找到答案 我已经构建了一个页面对象模型 用于登录网页 单击管理站点并填写用户名 密码
  • 在 python 2 或 python 3 中编写 csv 文件的便携式方法

    在我的 Windows 机器上 我通常在 python 2 中这样做来编写 csv 文件 import csv f open out csv wb cr csv writer f delimiter cr writerow a b c f
  • 使用 selenium 进行身份验证 (Python)

    我有指向我网站管理区域的链接 是否可以使用 selenium 在给定的浏览器中 启动这些 URI 链接 而无需事先进行身份验证 如果没有 那么我如何使用 selenium 处理身份验证 不确定您的意思 但您可以仅使用选择器并在身份验证字段中
  • AIOHTTP - Application.make_handler(...) 已弃用 - 添加多重处理

    我经历了 我可以从 Python Web 服务器中获得多少性能 的旅程 这让我想到了 AIOHTTP 和 uvloop 尽管如此 我仍然可以看到 AIOHTTP 并未充分利用我的 CPU 潜力 我开始将多处理与 AIOHTTP 结合使用 我
  • Google API Oauth2:所有用户只有一个刷新令牌?

    我正在使用 OAuth2 身份验证 并且我有一个包含多个用户的 CMS 每个用户都有自己的配置文件 碰巧我们公司有一个 Google 帐户 可以访问多个 Analytics 帐户 对于使用 CMS 的每个用户 我使用不同的用户名连接到 Go
  • Python 3 __getattribute__ 与点访问行为

    我读了一些关于 python 的对象属性查找的内容 这里 https blog ionelmc ro 2015 02 09 understanding python metaclasses object attribute lookup h
  • 无法打开 Python。错误 0xc000007b

    我最近一直在学习 Python 3 我在我的上网本 32 位 Windows 7 上创建简单的小程序没有任何问题 当我将它安装在我的上网本上时 我没有遇到任何问题 但现在我已经开始使用它了 我想将它安装在我的台式机上 并且我有一个 我的桌面
  • Asyncio 中的无限循环或“递归”

    我是 Python3 asyncio 的新手 我有一个函数可以不断地从 websocket 连接检索消息 我想知道我是否应该使用while True循环或asyncio ensure future以递归方式 哪个是首选还是不重要 Examp
  • 在 python 3 中压缩字符串?

    我不明白 在 2 X 中它起作用了 import zlib zlib compress Hello world 现在我有一个 zlib compress Hello world TypeError must be bytes or buff
  • python 3.4 计算 .txt 文件中的出现次数

    我正在为我正在上课的课程编写一个 简单 的小程序 这应该询问我要搜索哪个团队 然后返回它出现在 txt 文件列表中的次数 它像它应该的那样请求输入 并且看起来运行得很好 它现在已经运行了一个小时 我完全没有收到任何错误 它似乎陷入了循环 预
  • ValueError:超出整数字符串转换的限制(4300)

    gt gt gt import sys gt gt gt sys set int max str digits 4300 Illustrative this is the default gt gt gt int 2 5432 Traceb
  • 复制单元格包含多条数据的行

    我想获取一个数据框并复制某些行 一列 称为name 可能有多个名称 下面构建了一个示例数据框 data Joe 17 11 2018 2 Karen 17 11 2018 4 Bill Avery 17 11 2018 6 Sam 18 1
  • 如何从 curve_fit 获取置信区间

    我的问题涉及统计学和Python 我是两者的初学者 我正在运行模拟 对于自变量 X 的每个值 我都会为因变量 Y 生成 1000 个值 我所做的是计算每个 X 值的 Y 平均值 并使用 scipy optimize curve fit 拟合
  • 带圆角的 Seaborn 条形图

    我正在尝试绘制一些条形图 但想控制角的圆度 我尝试按照堆栈问题中提供的答案进行操作Matplotlib 中带圆角的条形图 https stackoverflow com questions 58425392 bar chart with r
  • 如何更改充当按钮的范围的文本

    我正在为自定义 Web 应用程序编写自动化测试 我遇到了无法更改跨度文本的问题 我尝试过使用 driver execute script 但没有运气 如果我更好地了解 javascript 这确实会有帮助 据我所知 您无法单击跨度 并且列表
  • 为什么延迟参数会影响预测曲线?

    I put the result of Gekko s calculation into the queue after a delay write the first value of the queue to TCLab Arduino
  • 通过 Google HTTP 客户端向 Box API 发出多部分请求

    我正在尝试调用这个特定方法http developers box com docs files upload a file http developers box com docs files upload a file在 Google H
  • 地图与星图的性能?

    我试图对两个序列进行纯Python 没有外部依赖 逐元素比较 我的第一个解决方案是 list map operator eq seq1 seq2 然后我发现starmap函数来自itertools 这看起来和我很相似 但事实证明 在最坏的情
  • Python3.1中的视图?

    Python3 1中的视图到底是什么 它们的行为方式似乎与迭代器类似 并且它们也可以具体化为列表 迭代器和视图有何不同 据我所知 视图仍然附加到创建它的对象上 对原始对象的修改会影响视图 来自docs http docs python or
  • 避免在列表理解中计算相同的表达式两次[重复]

    这个问题在这里已经有答案了 我在列表理解中使用一个函数和一个 if 函数 new list f x for x in old list if f x 0 令我恼火的是这个表达f x 在每个循环中计算两次 有没有办法以更清洁的方式做到这一点

随机推荐

  • Google 脚本选择 Google 电子表格中的整行

    我想知道我们是否可以使用 Google 脚本在电子表格中选择一行 如下所示 无论如何 首先我尝试使用此功能来处理列 但我收到数据错误 未找到 如果您有一个想法 function testGetFullColumn getFullColumn
  • 为什么使用类而不是函数? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我确实知道类的一些优点 例如变量和函数作用域 但除此之外 对我来说 拥有一组函数似乎比拥有许多类的实例和抽象更容易 那么为什么将相似的函数分组在
  • 关于C++中const指针的问题?

    我无法解释以下代码 double d 100 double const d1 30 double const p d Line 1 double const p1 d1 Line 2 在上面的代码中 Line 1没问题 但是Line 2产生
  • JPA 单表层次结构中的 PostgreSQL 标识

    在具有单个表继承层次结构的 Hibernate JPA 环境中使用 PostgreSQL 时 我看到了奇怪的行为 首先是我的环境 PostgreSQL 8 3 春季2 5 6SEC01 Hibernate entitymanager 3 4
  • 具有 json 模式的 Kafka jdbc 接收器连接器无法正常工作

    使用最新的 kafka 和 confluence jdbc 接收器连接器 发送一条非常简单的 Json 消息 schema type struct fields type int optional false field id type s
  • 每 1 分钟定期调用一次 AWS Lambda

    我如何定期调用 AWS Lambda 特别是每 1 分钟一次 当前功能允许 Lambdas 设置为5分钟触发 https stackoverflow com a 27382253 358013 但我正在寻找更短的时间间隔 我想过永远运行 L
  • phpass 返回不同的结果

    我只是将我的项目从本地主机放到我的主机上 并使用相同的 phpass 函数 我收到不同的结果 并且返回的字符串的长度也不同 顺便说一句 一切都在本地主机上运行 所以在线时相同的函数返回 false 我想知道可能是什么问题 结果如下 Inpu
  • 如何在 Javascript/Angular JS 中进行舍入——但删除无关紧要的数字

    我的 Javascript 控制器中有以下语句 scope myList 0 1 0 5 0 6666666 我的 AngularJS 模板包含以下行 div i div 这会产生以下 HTML 输出 div 0 div div 1 div
  • JavaFX 一次运行大量倒计时器?

    所以我可以看到几种不同的方法来完成我需要的事情 并且我已经做了很多谷歌 堆栈溢出搜索 但找不到我真正想要的东西 我需要运行多个 倒计时器 我需要在不同时间同时运行大约 6 个 可能最多 10 个 倒计时器 我的主程序上有一个选项卡窗格 我在
  • 强制分配实内存

    是否可以分配大块实内存 512Mb 1Gb 安装了 4Gb 而不将其丢弃到交换区 我的最终目的是释放系统内存 当可用内存接近 0 时 os x 会出现问题 它不会努力将未使用的内存放入交换区 并且尝试获取内存时一切都会变得非常慢 所以 我决
  • PrimeNg 上下文菜单传递数据问题

    我正在使用 PrimeNg 的上下文菜单 v6 0 1 问题是文档不清楚 我也无法在网上找到有关如何将数据传递给命令函数的信息 例如 我在屏幕上渲染了 10 个对象 并且上下文菜单附加到所有这些对象 现在如果我单击菜单项 我想获取渲染上下文
  • Laravel 分页链接与渲染

    我已经使用 Laravel 5 x 几个月了 我只是想知道使用分页时使用链接和渲染之间有什么区别 我做了一些研究 人们以相同的方式使用这两者 假设我有一个从控制器返回的数组变量 我会将分页切成每个视图 5 个项目 public functi
  • PowerShell 脚本不会作为 Windows 计划任务执行

    我有一个 PowerShell 脚本 可以运行 在 Windows 任务计划程序中 我创建了一个要执行的新任务 C Windows System32 WindowsPowerShell v1 0 powershell exe 将参数作为我的
  • mysql 触发器不工作?

    我正在尝试创建一个触发器来根据另一个表上的插入有条件地插入新行 我似乎无法确定语法 到目前为止 这是我所拥有的 DELIMETER CREATE TRIGGER overPricedCar AFTER INSERT ON cars FOR
  • 无法获取Android广告ID

    我正在尝试获取 Android 广告 Id 但找不到正确的方法 事实上 我什至无法获取广告 ID 提供商 isAdvertisingIdProviderAvailable 始终返回 false 我使用的是带有 8 0 PlayStore 的
  • 什么是 Microsoft.Practices.EnterpriseLibrary.Data

    我想知道什么Microsoft Practices EnterpriseLibrary Data dll是以及为什么我们使用这个组件 这个dll有什么好处呢 我想在 3 层架构上创建一个项目 并且很好奇执行 sql 查询的最佳方法是什么 我
  • 使用C++11随机库生成随机数

    正如标题所示 我正在尝试找出一种使用新的 C 11 生成随机数的方法
  • Android:Deviceready 5 秒后尚未触发

    将 Cordova 更新到 v6 4 0 并将 Android 平台更新到 6 0 0 后 我的应用程序不再运行 我得到这个 deviceready has not fired after 5 seconds cordova js 1223
  • NDK/Java项目中的Eclipse CDT C/C++代码补全问题

    我有一个 Android Java 项目 其中包含一些本机 C C 代码 我需要它能够在各种 C 类和函数上完成代码 然而 包含 完整 源代码来源的选项似乎在 Android Java 项目中不可用 有谁知道一种方法 1 欺骗 Eclips
  • 带有 Google 服务帐户主题的generate_access_token()

    在 python 中 我尝试通过服务帐户调用 GMail API委派全域权限 https developers google com identity protocols oauth2 service account authorizing