【发布时间】:2016-06-26 00:37:51
【问题描述】:
在我工作的地方,我们使用 Google Apps for Work。在过去的 9 个月中,我们一直在使用 Gmail API(每天约 2,000 个请求)为我们的支持电子邮件帐户提取新电子邮件。
这是我们最初的设置方式:
- 转至https://console.developers.google.com/project/
- 点击项目(或新建项目)
- 点击 API 和 Auth
- 点击凭据
- 点击创建新客户 ID
- 点击服务帐号
- 为帐户下载 JWT (json)。
- 关注 node.js quickstart guide 与同一帐户的已安装/本机类型令牌,并通过控制台对其进行授权。除非我们为每个帐户执行此步骤,否则 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 点左右,每个帐户都无法同时进行身份验证,jwtClient.authorize() 突然返回错误[Error: unauthorized_client]。
我尝试在新服务帐户上使用新令牌做同样的事情(获取令牌的 Web 界面在过去 9 个月中发生了很大变化),但它返回相同的错误。
我们使用的 googleapis 版本是 0.9.7,但我们也无法让 JWT 身份验证在最新版本上工作。
我们向 Google API 支持团队开了一张票,但与我们交谈的支持人员以前从未阅读过 Gmail API 规范,最终无法为我们提供帮助,因此他将我们重定向到这里以便与API engineering support team.
我们注意到,如果我们在管理控制台中启用域范围委派的范围,则身份验证会起作用,但我们不希望这样做。我们不需要模拟帐户,而是希望为每个帐户使用单独的 JWT。
【问题讨论】:
-
不隶属于谷歌,所以在这里只是在黑暗中拍摄:) expiration recommendations 可以提供线索吗?
A token might stop working for one of these reasons: The token has not been used for six months。会这样吗? -
@Tholle,感谢您的建议。我查看了原因列表,但我认为任何原因都不适用。所有账户同时停止工作,我们没有更改密码或撤销访问权限,它们都是服务账户,因此不应限制为 25 个刷新令牌。就使用而言,所有帐户/令牌每天都会使用。
-
我也尝试获取新令牌,但我们得到了同样的错误。
-
到目前为止,我们方面没有任何变化,我们所有的令牌现在都间歇性地工作。这让我相信 Google 正在推出修复程序。
-
对于每个服务帐户,您是如何为特定的支持电子邮件帐户授权的?我认为您概述的 7 个步骤中没有发生这种情况。
标签: google-api jwt gmail-api service-accounts google-api-nodejs-client