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

时间:2016-03-10 22:42:43

标签: google-api jwt gmail-api service-accounts google-api-nodejs-client

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

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

  1. 转到https://console.developers.google.com/project/
  2. 点击该项目(或创建一个新项目)
  3. 点击API&验证
  4. 点击凭据
  5. 点击创建新客户ID
  6. 点击服务帐户
  7. 下载帐户的JWT(json)。
  8. 关注node.js quickstart guide,并为同一帐户安装/本机类型令牌,并通过控制台对其进行授权。除非我们为每个帐户执行此步骤,否则JWT令牌不起作用。
  9. 我们为每个支持电子邮件帐户执行此操作,以避免在管理控制台中为其中任何一个启用域范围委派。然后,我们可以使用官方支持的npmgoogleapis对令牌进行身份验证,类似于:

    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。

1 个答案:

答案 0 :(得分:2)

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

在问题评论@Brandon Jewett-Hall@Steve Bazyl中建议我们使用installed app auth flow,因为它允许无限期刷新访问令牌并受到支持。

有关不同身份验证流程的更多信息,请参阅Google API docs