调用googleapis刷新access token出现invalid_grant错误的原因咨询
GaxiosError: invalid_grant 报错原因及解决方案
该报错本质是谷歌OAuth服务判定你提交的刷新凭证无效,结合你给出的业务逻辑和配置,常见触发原因如下:
- 固定周期刷新逻辑的并发冲突
你设置的每6小时全量刷新逻辑容易出现两个问题:一是同一个用户的refresh token被多个并发请求同时调用刷新,谷歌会判定第一个请求有效并生成新的refresh token,后续携带旧refresh token的请求会直接返回invalid_grant;二是如果刷新后新的access token、refresh token写入数据库失败,下次请求还是用已失效的旧凭证,也会触发报错。 - refresh token本身已失效
以下任意场景都会导致refresh token被谷歌回收:- 你的OAuth同意屏幕未正式发布,仍处于测试状态,测试用户的refresh token默认有效期只有7天,到期自动失效
- 用户主动在谷歌账号安全中心撤销了对你应用的授权
- 用户修改了谷歌账号密码,且你申请的权限范围包含Gmail、日历这类敏感权限,refresh token会被自动作废
- 同一个谷歌用户对同一个应用最多生成50个有效refresh token,超过上限后最早生成的refresh token会自动失效
- 配置参数不匹配
实例化OAuth2Client时传入的client_id、client_secret、redirect_uri三个参数,和生成授权链接时使用的参数不一致,尤其是redirect_uri必须和谷歌云后台OAuth配置中的值完全一致,不能有路径、端口、参数的差异。
修复方案
- 优化刷新逻辑:取消固定6小时全量刷新的规则,改为在access_token临近过期(谷歌access_token默认有效期1小时,建议提前5分钟刷新),或者调用API返回401状态码时再触发刷新,同时给单个用户的刷新操作加分布式锁,避免并发刷新的冲突。
- 补充异常处理:捕获到
invalid_grant报错时直接引导用户重新走授权流程即可,该错误属于不可自动恢复的凭证错误,重复刷新无效。 - 校验后台配置:确认谷歌云后台的OAuth同意屏幕已正式发布,同时确认实例化客户端和生成授权链接时用的三个核心参数完全匹配。
内容的提问来源于stack exchange,提问作者jigenji
相关产品推荐
相关产品推荐

