Ruby on Rails+Devise集成Google OAuth2遇redirect_uri_mismatch错误求助
解决OmniAuth-Google-OAuth2 + Devise的redirect_uri_mismatch问题
我之前也踩过这个坑,给你梳理几个关键排查步骤,应该能解决你的问题:
1. 先确认Google Cloud Console的配置是否完全匹配
- 首先要确保你修改的是正确的OAuth客户端ID:有时候我们会在Google Cloud里创建多个项目或者多个客户端ID,不小心改到了别的项目里,等于白忙活。
- 授权重定向URI必须和请求的完全一致:你请求的是
http://localhost:3000/users/auth/google_oauth2/callback,那Google面板里添加的URI就得一模一样——不能改成https,也不能加尾部斜杠,多一个字符都不行。 - 别搞混客户端类型:本地Web测试的话,应该选「Web应用」类型的客户端ID,而不是「桌面应用」或者「Android/iOS」,这两类的URI规则不一样。
2. 检查Rails项目里的OmniAuth配置
- 打开
config/initializers/devise.rb,看看有没有手动设置redirect_uri参数:如果有类似下面的错误写法,赶紧把redirect_uri: 'xxx'删掉,让OmniAuth自动生成符合当前环境的回调地址,或者改成和Google面板一致的地址。# 错误示例(不要这么写) config.omniauth :google_oauth2, ENV['GOOGLE_CLIENT_ID'], ENV['GOOGLE_CLIENT_SECRET'], redirect_uri: 'https://localhost:3000/xxx' # 正确示例 config.omniauth :google_oauth2, ENV['GOOGLE_CLIENT_ID'], ENV['GOOGLE_CLIENT_SECRET'], scope: 'email,profile', prompt: 'select_account' - 一定要重启Rails服务器!很多时候改了配置没重启,服务器还是用旧的缓存配置,这就是你改了Google面板路径但网站请求还是老地址的核心原因——服务器没刷新!
3. 清除浏览器缓存和OAuth会话
浏览器有时候会缓存之前的OAuth授权会话信息,导致请求还是用旧的redirect_uri。你可以:
- 打开浏览器的隐私模式(Incognito)测试,避免缓存影响
- 或者直接清除当前域名的Cookie和缓存
4. 排查本地SSL/代理影响
如果你之前给本地Rails开启了SSL(比如用了rails ssl:install),那要确保:
- 启动服务器时用SSL模式:
rails s -b 'ssl://localhost:3000?key=localhost.key&cert=localhost.crt' - Google面板里的重定向URI也要改成
https://localhost:3000/users/auth/google_oauth2/callback - 如果你用了ngrok之类的本地代理工具,那要把代理后的地址(比如
https://xxxx.ngrok.io/users/auth/google_oauth2/callback)添加到Google面板的授权URI里,同时确保Rails的config.hosts允许这个域名。
最后再验证一遍
- 打开Google Cloud Console,找到对应的OAuth客户端ID,确认授权URI和你请求的地址完全一致
- 重启Rails服务器
- 用隐私模式打开网站,测试Google登录
如果还是不行,可以检查一下Rails的日志(log/development.log),看看实际生成的redirect_uri到底是什么,和你看到的请求地址是否一致,这样能快速定位是不是配置哪里出了问题。
内容的提问来源于stack exchange,提问作者Kamil Siwek
相关产品推荐
相关产品推荐

