【问题标题】:Gmail API suddenly stopped working with [Error: unauthorized_client]Gmail API 突然停止使用 [错误:未授权客户端]
【发布时间】:2016-06-26 00:37:51
【问题描述】:

在我工作的地方,我们使用 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 quickstart guide 与同一帐户的已安装/本机类型令牌,并通过控制台对其进行授权。除非我们为每个帐户执行此步骤,否则 JWT 令牌将不起作用。

我们为每个单独的支持电子邮件帐户执行此操作,以避免必须在管理控制台中为其中任何一个启用域范围的委派。然后我们可以使用官方支持的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]

我尝试在新服务帐户上使用新令牌做同样的事情(获取令牌的 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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-05-14
    • 2016-06-21
    • 2017-02-22
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 2023-02-24
    相关资源
    最近更新 更多