Google认证在开发/预发布环境正常,生产环境报redirect_uri_mismatch求助
解决Rails + Devise + Omniauth-Google-OAuth2生产环境redirect_uri_mismatch问题
以下是针对生产环境出现Error 400: redirect_uri_mismatch的排查和修复步骤:
核对URI的细节一致性
Google OAuth对重定向URI的大小写、拼写要求严格,哪怕是细微差别都会触发不匹配错误。仔细对比生产环境实际请求的https://<production_domain>/users/auth/google_oauth2/callback和Google控制台中添加的URI:- 确认域名拼写完全一致,没有多/少字符、错误的子域名
- 检查路径部分:
/users/auth/google_oauth2/callback的下划线、斜杠都要完全匹配,比如别把google_oauth2写成google-oauth2 - 确认协议是
https,没有写成http或者遗漏s
验证凭证与项目的对应关系
检查生产环境使用的Google客户端ID、客户端密钥,是否属于Google控制台中添加了正确重定向URI的那个项目。如果不小心混用了staging环境的凭证,就会出现URI不匹配的情况。排查反向代理/负载均衡的影响
如果生产环境使用了Nginx、Apache等反向代理,或者有负载均衡,可能会导致Rails获取到的请求协议/域名和实际外部访问的不一致,进而让Omniauth生成错误的redirect_uri:- 查看Rails生产日志(
log/production.log),搜索redirect_uri字段,确认实际发送给Google的URI是否正确 - 在
config/environments/production.rb中强制设置正确的域名和协议:config.action_controller.default_url_options = { host: '<production_domain>', protocol: 'https' } - 也可以在Omniauth配置中手动指定redirect_uri,避免自动生成错误:
Devise.setup do |config| config.omniauth :google_oauth2, ENV['GOOGLE_CLIENT_ID'], ENV['GOOGLE_CLIENT_SECRET'], scope: 'email,profile', redirect_uri: 'https://<production_domain>/users/auth/google_oauth2/callback' end
- 查看Rails生产日志(
检查Google控制台的凭证类型
确保在Google控制台中创建的是Web应用类型的OAuth凭证,并且重定向URI是添加在该Web应用的「已授权的重定向URI」列表中,不要误加到Android、iOS等其他类型的凭证配置里。清除缓存并重新部署
Rails生产环境的配置缓存可能保留旧的设置,执行以下操作后重新部署:rails tmp:clear rails assets:precompile # 如果涉及静态资源变更
内容的提问来源于stack exchange,提问作者Kyryl Ωliinyk
相关产品推荐
相关产品推荐

