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

