调用Google OAuth2接口返回invalid_grant Bad Request错误排查咨询
Google OAuth2 刷新令牌返回
invalid_grant错误排查指南 调用场景说明
调用令牌接口获取access_token时传入参数如下:
grant_type: 'refresh_token', client_id: GOOGLE_OAUTH_CLIENT_ID, client_secret: GOOGLE_OAUTH_CLIENT_SECRET, refresh_token: refreshToken
已确认client_id与client_secret配置正确,且排除NTP时间同步问题,当前接口返回存在三类情况:
- 部分refresh_token可正常返回access_token
- 部分refresh_token返回明确的令牌已撤销提示
- 部分场景返回400错误,错误体如下:
error: '400 - {"error":"invalid_grant","error_description":"Bad Request"}'
常见诱因及排查方向
- 令牌与客户端凭据不匹配
refresh_token是和生成它时使用的OAuth客户端强绑定的,哪怕当前使用的client_id、client_secret本身是有效值,只要传入的refresh_token是同项目下其他客户端生成、或是其他Google Cloud项目下生成的,都会触发该错误。排查时回溯refresh_token生成时绑定的客户端ID,和当前请求传入的客户端ID做全量比对,确保完全一致。 - refresh_token自然过期
两类场景会导致refresh_token无提示过期:一是应用处于测试发布状态时,所有测试用户授权生成的refresh_token有效期仅7天,超期后直接失效;二是生产状态应用下,用户连续6个月未登录授权应用,对应refresh_token会自动失效。排查时先确认OAuth应用的发布状态,再核对异常refresh_token的生成时间是否符合过期规则。 - refresh_token轮换后旧令牌失效
如果OAuth客户端开启了令牌轮换策略,每次用refresh_token换取access_token时,服务端会同步返回新的refresh_token,旧令牌会立即作废。如果业务逻辑没有在每次刷新成功后更新存储的最新refresh_token,后续用旧令牌请求就会返回invalid_grant。排查时检查令牌刷新的响应处理逻辑,确认是否正确持久化了每次接口返回的新refresh_token。 - 授权范围变更导致旧令牌失效
如果在Google Cloud控制台修改过OAuth客户端申请的授权范围(新增/删除API权限),修改前生成的所有旧refresh_token都会直接失效,调用时不会返回明确的范围变更提示。排查时核对异常refresh_token生成时申请的scope列表,和当前客户端配置的scope列表是否一致,若存在变更需引导用户重新授权生成新令牌。 - 用户侧授权或账号状态变更
除了用户主动撤销授权会返回明确撤销提示外,两类用户侧操作也会返回invalid_grant:一是用户重置Google账号密码后,该账号下所有第三方应用的授权令牌都会失效;二是用户账号本身被封禁、停用,对应授权令牌全部作废。排查时可确认对应用户的账号是否可正常登录,以及账号安全中心的第三方授权列表中是否仍保留当前应用的授权记录。 - 请求参数格式异常
传入的refresh_token如果携带多余的空格、换行符,或是表单提交时特殊字符未做正确编码,会导致服务端识别到的令牌值和实际有效值不匹配,触发参数错误。排查时打印发起HTTP请求的原始请求体,确认refresh_token字段值和存储的原始值完全一致,无多余字符、编码错误。
内容的提问来源于stack exchange,提问作者Zaky
相关产品推荐
相关产品推荐

