Gmail API突然停止使用[错误:unauthorized_client]

bri*_*uth 5 google-api jwt service-accounts google-api-nodejs-client gmail-api

在我工作的地方,我们使用Google Apps for Work.在过去9个月中,我们一直在使用Gmail API(每天约2,000个请求)为我们的支持电子邮件帐户提取新电子邮件.

这就是我们最初的设置方式:

  1. 转到https://console.developers.google.com/project/
  2. 单击项目(或创建一个新项目)
  3. 点击API&Auth
  4. 单击凭据
  5. 单击"创建新客户端ID"
  6. 单击服务帐户
  7. 下载帐户的JWT(json).
  8. 遵循node.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
    });
});
Run Code Online (Sandbox Code Playgroud)

就像我说的,我们使用了很长时间,从来没有任何问题.昨天早上10点左右,每个帐户都停止了能够同时进行身份验证,并jwtClient.authorize()突然返回错误[Error: unauthorized_client].

我尝试在新服务帐户上使用新令牌执行相同的操作(在过去9个月内获取令牌的Web界面已经发生了很大变化),并且它返回相同的错误.

googleapis我们使用的版本是0.9.7,但我们无法让JWT身份验证在最新版本上运行.

我们打开与谷歌API的支持团队票,但与我们交谈的支持人员从未阅读Gmail API规范之前,是最终无法帮助我们,所以他为了取得联系与重定向到这里我们的API工程支持团队.

我们注意到,如果我们在管理控制台中启用域范围委派的范围,则身份验证有效,但我们不希望这样做.我们不需要冒充帐户,而是希望为每个帐户使用单独的JWT.

bri*_*uth 3

事实证明,我们使用的身份验证流程从未受到支持,并且可能由于 Google 方面的错误修复而被破坏。

在问题评论中,@Brandon Jewett-Hall@Steve Bazyl建议我们使用已安装的应用程序身份验证流程,因为它允许无限期刷新访问令牌并且受支持。

有关不同身份验证流程的更多信息可以在Google API 文档中找到。