获取Google OAuth2访问令牌时遇重定向URI不匹配问题求助
解决Google OAuth2重定向URI不匹配问题
我之前也碰到过这个一模一样的问题,咱们一步步拆解排查解决:
核心原因
这个问题的本质是Google Cloud控制台里配置的「已授权重定向URI」,和你代码实际请求时使用的URI完全不一致——Google的OAuth2机制对这个匹配要求极其严格,从协议(http/https)、域名、端口到路径,甚至结尾的斜杠都必须分毫不差。
第一步:先搞清楚你实际在用的重定向URI
当你调用auth2.grantOfflineAccess()时,如果没手动指定redirect_uri参数,Google会默认把当前页面的完整URL作为重定向URI。你可以先在回调函数里打印错误详情,直接看到Google预期的URI和你实际发送的URI:
function signInCallback(authResult) { if (authResult.error) { console.log("OAuth错误详情:", authResult.error_details); // 这里会明确显示"预期的URI列表"和"实际收到的URI" } }
第二步:在Google Cloud控制台修正配置
- 登录你的Google Cloud控制台,找到对应项目,进入API和服务 → 凭据页面
- 找到代码里
client_id对应的那个「OAuth 2.0客户端ID」 - 在「已授权的重定向URI」区域,添加你从错误日志里看到的实际URI;如果想手动指定固定URI,要满足两个要求:
- 必须属于你当前项目的授权域名(本地开发可以用
http://localhost:端口号或http://127.0.0.1:端口号) - 要和代码里的参数完全一致,比如修改调用代码:
这时候就必须把auth2.grantOfflineAccess({ redirect_uri: 'http://localhost:3000/auth/google/callback' }) .then(signInCallback);http://localhost:3000/auth/google/callback准确添加到控制台的授权列表里。
- 必须属于你当前项目的授权域名(本地开发可以用
容易踩坑的细节要注意
- 本地开发时,
localhost和127.0.0.1是两个不同的URI,不要混用 - 端口号不能漏:比如本地服务跑在3000端口,就必须写全
http://localhost:3000,不能只写http://localhost - 生产环境必须用HTTPS(localhost例外),Google不允许非HTTPS的重定向URI
- 路径要完全匹配:比如代码里是
/callback,控制台就不能写成/callback/(多了结尾斜杠)
最后验证
修改完控制台配置后,记得等1-2分钟(Google的配置同步需要一点时间),然后重新测试代码,应该就能解决重定向URI不匹配的问题了。
内容的提问来源于stack exchange,提问作者zookastos




