使用Google OAuth2.0获取Access Token和Refresh Token时遭遇Invalid_grant错误
我最近在尝试通过Google OAuth2.0获取Access Token和Refresh Token时碰到了invalid_grant错误,下面我一步步说下我的操作流程,看看问题出在哪:
步骤1:Google控制台配置完成
我已经在Google开发者控制台里正确设置了项目和OAuth2.0凭据,包括重定向URI这些核心配置都确认没问题。步骤2:成功获取授权码
我在浏览器里访问了以下授权URL(已补全个人客户端ID参数):https://accounts.google.com/o/oauth2/v2/auth?scope=https://mail.google.com/&access_type=offline&include_granted_scopes=true&response_type=code&state=state_parameter_passthrough_value&redirect_uri=http://localhost&client_id=【我的客户端ID】完成授权流程后,我成功拿到了授权码:
4/0AcvDMrAjHZ9AeAhiQiE533rWoe6Hk4gmetvjfv-cY6nXMaaFB8BoVrxL-9-2ZLqjfMh50A步骤3:尝试兑换Token时触发错误
接着我用curl发送请求,想把拿到的授权码换成Access Token和Refresh Token,请求内容大致如下:curl --location 'https://oauth2.googleapis.com/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'code=4/0AcvDMrAjHZ9AeAhiQiE533rWoe6Hk4gmetvjfv-cY6nXMaaFB8BoVrxL-9-2ZLqjfMh50A' \ --data-urlencode 'client_id=【我的客户端ID】' \ --data-urlencode 'client_secret=【我的客户端密钥】' \ --data-urlencode 'redirect_uri=http://localhost' \ --data-urlencode 'grant_type=authorization_code'但发送请求后,返回的结果却是
invalid_grant错误。我完全是照着官方文档的步骤来操作的,实在搞不清楚哪里出了问题。
结合我之前踩过的坑,给你几个排查方向:
检查授权码是否有效
Google的授权码是一次性的,而且有效期只有10分钟左右。如果你拿到授权码后隔了很久才发请求,或者之前已经用过这个码兑换过Token,都会触发invalid_grant。建议重新生成一个新的授权码,立刻发送兑换请求试试。确认重定向URI完全一致
控制台里配置的重定向URI必须和请求Token时redirect_uri参数完全匹配——包括协议(http/https)、端口、路径,哪怕是末尾多了个斜杠或者大小写不一致都会出错。你仔细核对下控制台里的配置是不是和请求里的http://localhost完全一样?检查客户端ID和密钥是否正确
别小看这个细节,很多时候都是复制时漏了字符或者选错了凭据类型。确认下curl请求里的client_id和client_secret是不是和Google控制台里生成的OAuth2.0凭据完全一致,有没有把服务端凭据当成客户端凭据用了?确认离线访问权限是否生效
你在授权请求里加了access_type=offline,这个是获取Refresh Token的必要参数,但要确保用户在授权时没有拒绝离线访问的权限(一般默认是允许的,但也可以去Google账号的授权记录里查一下)。检查用户是否取消了授权
如果用户在拿到授权码后,去Google账号的「安全」-「第三方应用访问」里取消了对你的应用的授权,那再用这个授权码请求Token也会失败。这种情况需要用户重新走一遍授权流程。尝试在同一设备/IP下操作
Google的安全机制有时候会检测到授权和兑换Token的设备或IP不一致,从而拒绝请求。你可以试试在同一个设备上重新完成授权和兑换操作,看看能不能解决问题。
备注:内容来源于stack exchange,提问作者satya

