如何通过code获取Google API refresh_token?请求返回invalid_grant错误
问题分析与解决方法
常见错误原因
- 授权码code失效:Google OAuth的授权码仅能使用一次,且有效期仅约10分钟,重复使用或超时都会触发
invalid_grant错误。 - redirect_uri不匹配:请求中的
redirect_uri必须与获取授权码时使用的地址完全一致,包括协议(http/https)、域名、路径,任何细微差异都会导致验证失败。 - 客户端凭证错误:
client_id或client_secret与Google Cloud控制台中创建的OAuth客户端凭证不一致,比如拼写错误、截断或复制不全。 - 未请求离线访问权限:若要获取
refresh_token,必须在用户授权阶段的请求中包含offline_access权限范围,否则Google不会返回refresh_token,甚至会导致授权码无效。 - 权限配置问题:OAuth consent screen未添加测试用户(测试环境下)、客户端被封禁,或账号无权限使用该客户端,也可能引发此错误。
正确获取refresh_token的步骤
获取授权码时包含offline_access范围
发起用户授权请求时,必须在scope参数中加入offline_access,示例授权URL:https://accounts.google.com/o/oauth2/v2/auth?client_id=你的客户端ID&redirect_uri=你的回调地址&response_type=code&scope=openid%20email%20profile%20offline_access用户完成授权后,会跳转到
redirect_uri并携带有效的授权码code。用未使用过的有效code发起token请求
确保code是刚获取且未使用过的,执行以下curl命令(替换所有占位符为真实值):curl --request POST \ --data "code=刚获取的授权码&client_id=你的客户端ID&client_secret=你的客户端密钥&redirect_uri=你的回调地址&grant_type=authorization_code" \ https://accounts.google.com/o/oauth2/token验证参数一致性
- 确认
redirect_uri与授权请求中的地址完全一致,不能有任何修改。 - 核对
client_id和client_secret,确保与Google Cloud控制台中的凭证完全匹配。
- 确认
内容的提问来源于stack exchange,提问作者user2666909
相关产品推荐
相关产品推荐

