客户端无权使用此方法检索访问令牌 Gmail API

nhe*_*nn1 4 gmail-api

正如许多其他人所写,我也遇到了这个问题,我在尝试通过 API 设置新的电子邮件签名时遇到了这个问题

确切的 API 调用是:

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

确切的回应是:

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}')
Run Code Online (Sandbox Code Playgroud)

我的场景如下:

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

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

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

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

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

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

服务帐号设置 在此处输入图片说明

得到这方面的帮助会很棒,

更新 1

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

更新 2

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

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

更新 3

我已经删除了 API 密钥,它没有帮助。

谢谢

Ald*_*ein 5

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

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


sea*_*son 1

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

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

这使我能够查询任何域用户的日历事件列表。