Gmail API suddenly stopped working with [Error: unauthorized_client]
Gmail API suddenly stopped working with [Error: unauthorized_client]
在我工作的地方,我们使用 Google Apps for Work。在过去的 9 个月里,我们一直在使用 Gmail API(每天约 2,000 个请求)为我们的支持电子邮件帐户提取新电子邮件。
这是我们最初的设置方式:
- 前往 https://console.developers.google.com/project/
- 单击项目(或创建一个新项目)
- 点击 API 的 & 授权
- 单击凭据
- 点击创建新的客户端 ID
- 单击服务帐户
- 为帐户下载 JWT (json)。
- 跟随 node.js quickstart guide 使用同一帐户的 installed/native 类型令牌,并通过控制台对其进行授权。除非我们执行此步骤,否则 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 个月里发生了很大变化),但 returns 同样的错误.
我们使用的 googleapis
版本是 0.9.7
,但我们也无法让 JWT 身份验证在最新版本上工作。
我们向 Google API 的支持团队开了一个工单,但我们与之交谈的支持人员之前从未阅读过 Gmail API 规范,最终无法提供帮助我们,所以他将我们重定向到这里,以便与 API engineering support team.
取得联系
我们注意到,如果我们在管理控制台中启用域范围内的委派范围,则身份验证会起作用,但我们不希望这样做。我们不需要模拟帐户,更愿意为每个帐户使用一个单独的 JWT。
事实证明,我们使用的身份验证流程从未受到支持,并且可能由于 Google 方面的错误修复而被破坏。
在问题评论中改为 @Brandon Jewett-Hall and @Steve Bazyl recommended that we use the installed app auth flow,因为它允许无限期刷新访问令牌并受支持。
有关不同身份验证流程的更多信息,请参阅 Google API docs。
在我工作的地方,我们使用 Google Apps for Work。在过去的 9 个月里,我们一直在使用 Gmail API(每天约 2,000 个请求)为我们的支持电子邮件帐户提取新电子邮件。
这是我们最初的设置方式:
- 前往 https://console.developers.google.com/project/
- 单击项目(或创建一个新项目)
- 点击 API 的 & 授权
- 单击凭据
- 点击创建新的客户端 ID
- 单击服务帐户
- 为帐户下载 JWT (json)。
- 跟随 node.js quickstart guide 使用同一帐户的 installed/native 类型令牌,并通过控制台对其进行授权。除非我们执行此步骤,否则 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 个月里发生了很大变化),但 returns 同样的错误.
我们使用的 googleapis
版本是 0.9.7
,但我们也无法让 JWT 身份验证在最新版本上工作。
我们向 Google API 的支持团队开了一个工单,但我们与之交谈的支持人员之前从未阅读过 Gmail API 规范,最终无法提供帮助我们,所以他将我们重定向到这里,以便与 API engineering support team.
取得联系我们注意到,如果我们在管理控制台中启用域范围内的委派范围,则身份验证会起作用,但我们不希望这样做。我们不需要模拟帐户,更愿意为每个帐户使用一个单独的 JWT。
事实证明,我们使用的身份验证流程从未受到支持,并且可能由于 Google 方面的错误修复而被破坏。
在问题评论中改为 @Brandon Jewett-Hall and @Steve Bazyl recommended that we use the installed app auth flow,因为它允许无限期刷新访问令牌并受支持。
有关不同身份验证流程的更多信息,请参阅 Google API docs。