Google OAuth登录遇redirect_uri_mismatch错误的原因及解决方法
Google OAuth "redirect_uri_mismatch" 错误:原因与解决办法
核心原因
这个错误的本质是:你的Flask应用向Google OAuth服务发送的回调URI,和你在Google Cloud控制台中配置的授权重定向URI完全不一致,Google出于安全策略会直接拒绝该请求。
具体排查与修复步骤
1. 先确认代码实际生成的回调URI
本地启动Flask应用后,访问/google-login路由,先搞清楚代码生成的回调URI到底是什么。可以临时在google_login函数里加一行打印:
@accounts_bp.route('/google-login') def google_login(): callback = url_for( 'accounts_bp.authorized', _external=True, next=request.args.get('next') or request.referrer or None ) print("生成的回调URI:", callback) # 临时打印,测试完成后可删除 return google.authorize(callback=callback)
启动应用后查看控制台输出的完整URI,这就是你需要在Google控制台配置的精确地址。
2. 核对Google Cloud控制台的重定向URI配置
登录Google Cloud控制台,找到你的OAuth 2.0客户端ID配置页,确保:
- 配置的URI和代码生成的完全一致:包括协议(http/https)、域名、端口、路径,一个字符都不能错
- 本地测试必须用
http://localhost:端口号/authorized(比如http://localhost:5000/authorized),别用127.0.0.1(除非你全程用这个域名访问应用) - 如果你的
accounts_bp设置了路由前缀(比如url_prefix='/accounts'),回调URI会变成http://localhost:5000/accounts/authorized,必须把这个完整路径加进配置
- 本地测试必须用
- 本地测试和线上环境的URI要分开添加,都列在重定向URI列表里
- 不要带任何查询参数(比如
?next=xxx),Google不允许配置带参数的重定向URI
3. 修正代码中next参数的处理方式
你的代码里把next参数拼进了回调URI,这会导致生成的URI带查询参数,和Google配置的纯路径URI不匹配。可以改成先把next暂存到session里,授权成功后再跳转:
@accounts_bp.route('/google-login') def google_login(): # 把next参数暂存到session session['next_target'] = request.args.get('next') or request.referrer or None # 生成不带参数的回调URI callback = url_for('accounts_bp.authorized', _external=True) return google.authorize(callback=callback) @accounts_bp.route('/authorized') def authorized(): resp = google.authorized_response() # ... 省略中间的用户验证、创建逻辑 ... # 授权成功后读取session里的next参数跳转 target_url = session.pop('next_target', url_for('dashboard_bp.app_home')) return redirect(target_url)
4. 检查Flask运行配置
- 确保本地启动Flask的端口和配置的一致:比如用
flask run --port=8080启动,回调URI的端口就是8080,必须对应到Google的配置里 - 不要用
app.run(host='0.0.0.0')然后用局域网IP访问应用,否则生成的回调URI会是那个IP,而Google配置里只有localhost,必然不匹配
5. 等待配置生效
修改Google控制台的重定向URI后,可能需要等待1-2分钟让配置同步,之后再测试登录流程。
内容的提问来源于stack exchange,提问作者TimothyAURA
相关产品推荐
相关产品推荐

