在我工作的地方,我们使用Google Apps for Work。在过去的 9 个月中,我们一直在使用 Gmail API(每天 ~2,000 个请求)为我们的支持电子邮件帐户提取新电子邮件。
这是我们最初设置它的方式:
- 转到 https://console.developers.google.com/project/
- 单击项目(或创建一个新项目)
- 点击 API 和身份验证
- 单击凭据
- 单击创建新的客户端 ID
- 点击服务帐户
- 下载帐户的 JWT (json)。
- 按照节点.js快速入门指南为同一帐户提供已安装/本机类型令牌,并通过控制台对其进行授权。除非我们执行此步骤,否则 JWT 令牌不起作用,每个帐户一次。
我们为每个单独的支持电子邮件帐户执行此操作,以避免在管理控制台中为其中任何一个帐户启用全网域授权。然后,我们能够使用官方支持的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 点左右,MST 每个帐户都无法同时进行身份验证,jwtClient.authorize()
突然返回错误[Error: unauthorized_client]
。
我尝试在新服务帐户上使用新令牌做同样的事情(获取令牌的 Web 界面在过去 9 个月中发生了很大变化),它返回了相同的错误。
我们使用的googleapis
版本是 0.9.7
,但我们也无法让 JWT 身份验证在最新版本上运行。
我们向 Google API 支持团队开了一张票,但我们与之交谈的支持人员以前从未阅读过 Gmail API 规范,最终无法帮助我们,因此他将我们重定向到此处,以便与 API 工程支持团队取得联系。
我们注意到,如果我们在管理控制台中启用全网域委派的范围,身份验证会起作用,但我们不希望这样做。我们不需要模拟帐户,而是希望为每个帐户使用单独的 JWT。
事实证明,我们使用的身份验证流从未受到支持,并且可能由于Google的错误修复而被破坏。
在问题中,Jewett-Hall 和 @Steve Bazyl @Brandon建议我们改用已安装的应用程序身份验证流程,因为它允许无限期刷新访问令牌并且受支持。
有关不同身份验证流的更多信息,请参阅 Google API 文档。