You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中Google Calendar API令牌失效,invalid_grant错误求助

Google Calendar API调用返回invalid_grant错误的排查与解决

问题背景

在Node.js应用中使用googleapis包集成Google Calendar API,已完成OAuth2认证授权流程,前期运行正常,但近期调用接口时返回以下错误:

{
  "error": "invalid_grant",
  "error_description": "Bad Request"
}

未修改代码或API使用方式,尝试刷新访问令牌也无法解决问题。

相关代码

核心调用代码

const { google } = require('googleapis');
const calendar = google.calendar('v3');
const OAuth2 = google.auth.OAuth2;

const auth = new OAuth2(CLIENT_ID, CLIENT_SECRET, redirect);
auth.forceRefreshOnFailure = true;
// tokens是从数据库中存储的Google返回的令牌数据
auth.setCredentials(tokens);

// 检查日历是否可用
const from = new Date();
const to = new Date(24 * 60 * 60 * 1000 + +from);
try {
  const freeBusyQuery = {
    requestBody: {
        items: [{ id: 'primary' }],
        timeMin: from.toISOString(),
        timeMax: to.toISOString(),
    },
    fields: 'calendars,groups,kind,timeMax,timeMin',
    alt: 'json',
    auth: auth.client,
  };
  const response = await calendar.freebusy.query(freeBusyQuery);
  return !!response.data;
} catch (error) {
  // 最初几天正常,之后使用存储的令牌请求总会报错
  console.error(error);
  return false;
}

授权请求参数

const options = {
  access_type: 'offline',
  prompt: 'consent',
  include_granted_scopes: true,
  scopes: 'openid email profile https://www.googleapis.com/auth/calendar'
}

环境信息

  • googleapis包版本:95.0.0
  • 授权屏幕发布状态:生产中

错误原因分析

  • 刷新令牌过期或失效:Google刷新令牌并非永久有效,若用户主动撤销应用授权、令牌超过6个月未被使用,或应用的OAuth配置发生变更,都会导致刷新令牌失效。
  • 存储的令牌数据异常:数据库中存储的tokens对象可能缺失refresh_token等关键字段,或字段值被篡改、截断,导致无法正常刷新令牌。
  • OAuth2客户端配置不匹配:代码中的CLIENT_ID、CLIENT_SECRET或redirect_uri与Google Cloud控制台中的配置不一致,即使前期正常,若控制台配置被修改也会触发该错误。
  • 服务器时间偏差:服务器系统时间与标准NTP时间偏差过大(超过5分钟),Google OAuth服务会因时间校验失败拒绝令牌请求。

解决方法

  1. 重新获取有效刷新令牌:引导用户重新完成授权流程,确保授权请求保留access_type: 'offline'和prompt: 'consent'参数,获取新的refresh_token后更新数据库中的存储内容。
  2. 校验令牌存储数据:检查数据库中的tokens对象,确认包含refresh_token、expiry_date等必要字段,且字段值格式正确、无损坏。
  3. 核对OAuth客户端配置:登录Google Cloud控制台,确认OAuth 2.0客户端ID的CLIENT_ID、CLIENT_SECRET、授权重定向URI与代码中的配置完全一致,注意大小写和路径细节。
  4. 同步服务器系统时间:配置服务器的NTP服务自动同步标准时间,确保系统时间与实际时间偏差在允许范围内。
  5. 代码优化建议:将请求中的auth: auth.client改为auth: auth,直接传入OAuth2实例,避免因auth.client引用问题导致的授权异常。

内容的提问来源于stack exchange,提问作者Graidenix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:05:19