我有一个G套件域,并打开一个域范围授权的服务帐户。服务帐户在项目中也具有所有者标识。 我启用gmail API并添加范围参考(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
});
但是当我使用此令牌尝试列出电子邮件时: 获取https://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与其他身份验证选项一起使用。 我读了很多文章,但没有一篇文章有所帮助。我坚持了一个星期,任何建议都将非常感激。
如果重要的话,我会自由提供更多详细信息。
答案 0 :(得分:3)
添加子声明应解决此问题。
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
);