我工作的地方使用Google Apps for Work。在过去9个月中,我们一直在使用Gmail API(每天约2,000个请求)为我们的支持电子邮件帐户提取新电子邮件。
这就是我们最初的设置方式:
我们为每个支持电子邮件帐户执行此操作,以避免在管理控制台中为其中任何一个启用域范围委派。然后,我们可以使用官方支持的npm
库googleapis
对令牌进行身份验证,类似于:
var google = require('googleapis');
var jwtClient = new google.auth.JWT(
token.client_email,
null,
token.private_key,
['https://www.googleapis.com/auth/gmail.readonly'],
'supportemail@mycompany.com'
);
jwtClient.authorize(function(err, tokens) {
if (err) {
return cb(err);
}
var gmail = google.gmail('v1');
var requestOptions = {
auth: jwtClient,
userId: 'me',
id: messageId,
format: 'raw'
};
gmail.users.messages.get(requestOptions, function(err, response) {
if (err) {
return cb(err);
}
// do stuff with the response
});
});
就像我说的那样,我们使用了很长时间,从来没有遇到任何问题。昨天早上10点左右,每个帐户都无法同时进行身份验证,jwtClient.authorize()
突然返回错误[Error: unauthorized_client]
。
我尝试在新服务帐户上使用新令牌执行相同的操作(在过去9个月内获取令牌的Web界面已经发生了相当大的变化),并返回相同的错误。
我们使用的googleapis
版本为0.9.7
,但我们无法通过JWT身份验证来处理最新版本。
我们与Google API支持小组开了一张机票,但我们采访过的支持人员之前从未阅读过Gmail API规范,最终无法帮助我们,所以他将我们重定向到这里以便与我们取得联系API engineering support team
我们注意到,如果我们在管理控制台中启用域范围委派的范围,则身份验证有效,但我们不希望这样做。我们不需要冒充帐户,而是希望为每个帐户使用单独的JWT。
答案 0 :(得分:2)
事实证明,我们使用的身份验证流程从未受到支持,并且可能由于Google的错误修正而被破坏。
在问题评论@Brandon Jewett-Hall和@Steve Bazyl中建议我们使用installed app auth flow,因为它允许无限期刷新访问令牌并受到支持。
有关不同身份验证流程的更多信息,请参阅Google API docs。