【问题标题】:Client is unauthorized to retrieve access tokens using this method Gmail API客户端未经授权使用此方法 Gmail API 检索访问令牌
【发布时间】:2019-08-14 23:54:56
【问题描述】:

正如许多其他人所写,我也遇到了这个问题,我在尝试set new email signature via the API时遇到了这个问题

确切的 API 调用是:

sendAsConfiguration = {
        'signature': 'Test email signature'
    }
result = gmailService.users().settings().sendAs().patch(userId='xxx@domain.com',
            sendAsEmail="xxx@domain.com",
            body=sendAsConfiguration).execute()

确切的回答是:

google.auth.exceptions.RefreshError: ('unauthorized_client: Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested.', '{\n  "error": "unauthorized_client",\n  "error_description": "Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested."\n}')

我的场景如下:

  1. 我正在使用来自 GCP Cloud Functions 的 Python
  2. 我通过相同的代码库和设置管理对 G Suite 目录管理员的请求
  3. 我创建了一个带有野委托的服务帐户。我在代码和 G Suite 帐户中都添加了正确的范围。
  4. 尝试使用 gmail API 时,它不起作用。
  5. 我创建了一个新项目,并部署了完全相同的代码(当然还有新服务帐户的设置)并且一切正常。
  6. 我重复了在原始项目中创建服务帐户的所有步骤,但仍然无法正常工作。

我需要它在生产项目中工作,而不是测试项目。

我已阅读以下问题和答案(以及它们的许多其他变体),但没有任何效果answer 1answer 2

关于答案 2,我不确定我是否理解这个,所以如果这是真正的解决方案,那么获得具体步骤会很棒。

我没有添加代码本身,因为它可以肯定地工作(在不同的项目上进行了测试,并且有效)。请参阅下面的服务帐户设置

G Suite 设置 一开始我在同一个服务帐户下拥有两个范围,我得到了相同的结果。在上次测试中,我尝试了每个只有一个范围的服务帐户。结果一样

服务帐号设置

在这方面能得到帮助会很棒,

更新 1

我没有 OAuth 凭据,请参见下图

更新 2

我比较了成功的项目和失败的项目。我注意到的唯一区别是,在工作项目中没有 API 密钥。由于人们写过关于 OAuth 的文章,我想我可能会给它一个机会。但由于这是一个生产环境,我不想删除它们,特别是因为它是由 Google 自动生成的,我不知道它们在哪里使用。我认为它们没有在任何地方使用,但我不确定。

我尝试向工作帐户添加一个 API 密钥,但它仍然有效,这给了我更多动力,让生产设置保持不变。

更新 3

我已删除 API 密钥,但没有帮助。

谢谢

【问题讨论】:

  • 来自answer 2,据说该解决方案可能会删除不属于任何服务帐户的凭据,这导致this github post,“我通过删除所有其他类型解决了我的问题相关应用的凭据(没有 oauth,只有服务帐户)”。
  • 感谢@MαπμQμαπkγVπ.0。我仍然很困惑,据我所知我没有 OAuth 密钥。请看我附上的截图。我错过了什么吗?

标签: gmail-api


【解决方案1】:

我创建了一个带有野委托的服务帐户。我在代码和 G Suite 帐户中都添加了正确的范围。

在 G Suite 管理员的“管理 API 客户端访问”页面上添加服务帐号及其范围之前,必须先启用“向服务帐号委派域范围内的权限”。否则它将失败,并显示“客户端未授权使用此方法检索访问令牌,或者客户端未授权任何请求的范围。”错误,需要删除 API 客户端并重新添加。

【讨论】:

  • 这对我有帮助。看起来服务帐户是在启用委派之前创建的。所以我所做的是删除服务帐户并创建一个新帐户。还要确保请求中的范围在此服务帐户的域范围委派中得到授权。
【解决方案2】:

我发现这是服务帐户的角色问题。

  1. 在您的开发者控制台 -> 项目 -> IAM 中,确保您的服务帐户在此处列出。
    • 如果不是,请单击添加并开始输入名称以添加它
  2. 对于角色,选择 Access Approval -> Access Approval Approver

这让我可以查询任何域用户的日历事件列表。

【讨论】:

  • 谢谢,但这并不能解决我的问题。正如问题所说。对于某些 API,它确实适用于我的同一个项目,但不适用于所有 API。我还是没有解决这个问题
猜你喜欢
  • 2017-08-04
  • 1970-01-01
  • 2019-01-27
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
相关资源
最近更新 更多