Google Cloud Run服务集成Google OAuth2时遭遇redirect_uri_mismatch错误
我之前也踩过这个一模一样的坑!Google的错误提示确实够不友好的,连期望的重定向URI都不肯直接说,不过咱们可以从这几个核心方向排查:
1. 先核对Google OAuth控制台的授权URI列表
首先去Google Cloud Console的「API和服务」→「凭据」页面,找到你用的那个OAuth 2.0客户端ID,检查「已获授权的重定向URI」里有没有精确添加你代码里配置的https://helloworld-lrbsxicfna-uw.a.run.app/oauth2callback。这里一定要精确匹配:https不能写成http,域名、路径一个字符都不能错,哪怕多个斜杠都会出问题。
2. 别硬编码Cloud Run的服务域名!
你代码里硬写了root = 'https://helloworld-lrbsxicfna-uw.a.run.app',这在本地测试没问题,但Cloud Run如果后续换域名、加自定义域名,或者用临时测试域名的话,直接就会不匹配。更灵活的做法是让Flask动态获取当前请求的域名,比如:
# 举个例子,在登录路由里动态生成重定向URI @app.route('/login') def login(): # 用url_for的_external=True参数自动生成完整的回调URI redirect_uri = url_for('oauth2callback', _external=True) return oauth.google.authorize_redirect(redirect_uri)
甚至可以把oauth注册时的redirect_uri参数去掉,完全在授权的时候动态传,这样本地和Cloud Run环境都能自动适配。
3. 检查是否有代理/负载均衡导致的URI变形
如果你的Cloud Run服务前面挂了负载均衡、CDN或者其他代理,外部请求的真实URI可能和代码里获取到的不一致。这时候需要让Flask信任代理传递的头信息,在代码里加上:
from werkzeug.middleware.proxy_fix import ProxyFix # 配置信任代理的X-Forwarded-Proto和X-Forwarded-Host头 app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)
这样Flask才能正确拿到外部用户访问的真实域名,生成匹配的重定向URI。
4. 验证Cloud Run服务的实际回调路径
你可以先在本地模拟Cloud Run的环境,或者直接在Cloud Run的日志里看请求的实际路径,确认回调路径/oauth2callback是不是能正常访问,有没有被路由规则拦截。
备注:内容来源于stack exchange,提问作者Rick McGeer

