Rails 7 API集成Google登录遇redirect_uri_mismatch错误求助
排查Google OAuth2 redirect_uri_mismatch问题的关键步骤
针对你遇到的Rails 7 API换Google access token时的redirect_uri_mismatch错误,按以下步骤逐一排查:
1. 严格校验URI的完全一致性
Google对重定向URI的匹配是字节级严格匹配,必须确保以下三处完全一致:
- Google控制台「已授权的重定向URI」列表中的地址
- 获取授权码时,前端/授权请求中使用的
redirect_uri参数 - 换token时代码中传入的
redirect_uri参数
重点检查:
- 是否存在大小写差异(比如
Callback和callback) - 结尾是否多了/少了斜杠(比如
/callback和/callback/) - HTTP/HTTPS协议是否一致(比如本地用
http,控制台不能写成https) - 是否有多余的空格或特殊字符(比如URI里的空格是否被正确编码)
2. 确认Google控制台的配置位置
- 确保你配置的是对应项目下的OAuth 2.0客户端ID,而非其他项目或客户端
- 客户端类型必须是「Web应用」,不能选iOS/Android等其他类型
- 重定向URI是添加在「已授权的重定向URI」列表中,而非「已授权的JavaScript来源」(后者用于前端授权场景)
3. 验证授权码与URI的绑定关系
每个授权码在生成时就和当时使用的redirect_uri绑定,换token时必须使用同一个URI。如果你的测试流程是:
- 用
http://localhost:3000/...获取授权码 - 换token时用
https://ngrok.io/...
这种情况必然触发错误,必须重新获取对应URI的授权码再测试。
4. 检查环境变量是否正确加载
在代码中添加调试代码,确认ENV['REDIRECT_URI']的实际值:
def self.get_access_token(auth_code) puts "Loaded REDIRECT_URI: #{ENV['REDIRECT_URI']}" # 新增调试打印 # ... 原有代码 end
确认输出的URI和控制台配置的完全一致,排除.env文件中的拼写错误、引号包裹或转义问题。
5. 查看Google错误响应的详细信息
打印完整的错误响应,查看error_description字段(如果存在),Google通常会明确说明它收到的URI和允许的URI分别是什么:
{ "error": "redirect_uri_mismatch", "error_description": "Bad Request: Redirect URI mismatch. Expected one of https://xxx.ngrok.io/..., got http://localhost:3000/..." }
这能直接帮你定位差异点。
6. 清除旧授权码并重新测试
不要使用之前生成的旧授权码,每次测试都重新发起授权流程获取新的授权码,避免旧码绑定了错误的URI。
7. 验证Faraday请求的实际参数
打印Faraday生成的请求body,确认redirect_uri参数是否正确:
def self.get_access_token(auth_code) body = URI.encode_www_form( code: auth_code, client_id: ENV['GOOGLE_CLIENT_ID'], client_secret: ENV['GOOGLE_CLIENT_SECRET'], grant_type: 'authorization_code', redirect_uri: ENV['REDIRECT_URI'] ) puts "Request body: #{body}" # 新增调试打印 conn = Faraday.new response = conn.post(ENV['GOOGLE_AUTHORIZATION_URL']) do |req| req.headers['Content-Type'] = 'application/x-www-form-urlencoded' req.body = body end # ... 原有代码 end
确认redirect_uri参数的值和预期一致,没有被错误编码或截断。
内容的提问来源于stack exchange,提问作者SmackDH
相关产品推荐
相关产品推荐

