当前位置: 首页 > 知识库问答 >
问题:

NodeJS:无法使用服务帐户访问Gmail API

皇甫喜
2023-03-14

我有一个G套件域,并用域范围的授权打开一个服务号。服务号在项目中也有所有者身份。我启用gmail应用编程接口并添加范围参考(https://developers.google.com/admin-sdk/directory/v1/guides/delegation“将域范围的权限委托给您的服务号”)我也启用不太安全的应用程序设置。

这是我的代码:

var {google} = require('googleapis');

var jwtClient = new google.auth.JWT(
    "service@xxx.iam.gserviceaccount.com",
    null,
    "-----BEGIN PRIVATE KEY-----\n....",
    ['https://mail.google.com/', 
    'https://www.googleapis.com/auth/gmail.readonly', 
    'https://www.googleapis.com/auth/gmail.modify', 
    'https://www.googleapis.com/auth/gmail.metadata'] // I have also tried https://www.googleapis.com/auth/gmail.imap_admin
);

jwtClient.authorize(function(err, tokens) {
    if (err) {
      console.error(err);
      return;
    }
    console.log(tokens); // successful print the token
});

但是当我使用这个令牌尝试列出电子邮件时:GEThttps://www.googleapis.com/gmail/v1/users/me/messages?access_token={access_token}

发生错误。

{
    "error":{
        "errors":[
            {
                "domain": "global",
                "reason": "failedPrecondition",
                "message": "Bad Request"
            }
        ],
        "code": 400,
        "message": "Bad Request"
    }
}

我不想要解决办法,我打算用服务帐户解决这个问题。我成功地将Gmail API与其他身份验证选项结合使用。我读过很多文章,但没有一篇有用。我已经坚持了一个星期,任何建议都将不胜感激。

我将随时提供更多细节,以备不时之需。

共有1个答案

薛钧
2023-03-14

添加子索赔可以解决此问题。

var jwtClient = new google.auth.JWT(
    "service@xxx.iam.gserviceaccount.com",
    null,
    "-----BEGIN PRIVATE KEY-----\n....",
    ['https://mail.google.com/', 
    'https://www.googleapis.com/auth/gmail.readonly', 
    'https://www.googleapis.com/auth/gmail.modify', 
    'https://www.googleapis.com/auth/gmail.metadata'], // I have also tried https://www.googleapis.com/auth/gmail.imap_admin
    'user@yourdomain.com' // use a user email in your domain since service account do not have Gmail box
);
 类似资料:
  • 我正在尝试使用Google Directory API验证组成员,但每次我发出请求时都无法通过403错误。 我使用的是一个服务帐户,我为它启用了“启用G套件域范围委托”选项。我还使用套件中的客户端ID添加了“https://www.googleapis.com/auth/admin.directory.user,https://www.googleapis.com/auth/admin.direc

  • 我正在工作上传文件在谷歌驱动器与服务帐户,我能够插入文件在谷歌驱动器,但我不能查看该文件在谷歌驱动器。 我是创建abc@gmail.com。用abc@gmail.com创建一个服务帐户。有了P12证书和服务客户端电子邮件id,我可以在驱动器中插入文件。但无法在abc@gmail.com的谷歌驱动器上看到该文件。当fatch从应用程序中的文件列表时,它将显示5个文件,但在我的abc@gmail.co

  • 我想使用gsutil和服务帐户在命令行上访问Goolge播放报告。有一个云存储URI,格式为gs://bucket\u name,我可以用我的用户帐户列出和下载报告,但不能用我创建的服务帐户。错误总是相同的: 我已向服务帐户授予了所有必需的权限,因此我不明白为什么用户帐户可以使用,而服务帐户却无法使用。 所以如果你知道如何帮助我,我会非常感谢你。

  • 我正在尝试使用服务帐户访问目录API(https://developers.google.com/admin-sdk/Directory/v1/reference/users/list)。最简单的任务是列出组织中的用户。通过OAuth2.0 PlayGorund测试,这在我的用户帐户中运行良好。但我需要使用服务帐户。我正在阅读关于双腿OAuth(https://developers.google.

  • 是否可以使用服务帐户访问Google Admin Report SDK? 我有一个非常基本的例子,我正在尝试运行,我总是得到一个400错误返回。我已经验证了密钥和服务ID是正确的,我甚至已经将权限委托给这个服务帐户。难道这就是不可能吗?有人有什么想法吗? 返回的错误如下: {“代码”:401,“错误”:[{“domain”:“global”,“location”:“authorization”,“

  • 问题内容: 我们在使用服务帐户访问代理商API时遇到问题。具有客户机密的示例运行良好,但是我们需要将其部署在k8s(Kubernetes Engine)中,而无需定期刷新oauth会话(尤其是执行一次,因为在docker容器中有点难)。 尽管有很多关于如何使用python进行操作的文档,但我们找不到使用服务帐户进行访问的任何方法。 我们尝试了两个帐户,一个为默认计算引擎,一个为我们的用例直接创建。