You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Heroku应用Google OAuth配置HTTPS回调报400重定向不匹配求助

问题原因

你碰到的redirect_uri_mismatch报错核心诱因是Heroku的反向代理架构,和Google控制台配置本身无关:

  • Heroku对外统一提供HTTPS访问入口,但流量经过平台负载均衡层后,会通过HTTP协议转发到你部署的Node.js应用实例
  • Express默认不信任反向代理携带的转发头,因此Passport判断当前请求协议为HTTP,自动生成的OAuth回调地址会拼接http://前缀,和你在Google控制台配置的HTTPS地址完全不匹配
  • 把控制台回调改成HTTP地址虽然能临时跑通,但会导致协议降级,既不安全也不符合Google应用发布的强制HTTPS要求,不是正规解决方案。
修复方案

1. 开启Express反向代理信任

找到你项目的Express入口文件(通常是app.js或index.js,即初始化express实例的文件),在初始化passport、挂载路由之前添加一行配置,让Express正确识别Heroku转发的真实请求协议:

const express = require('express')
const app = express()

// 新增这行配置,信任Heroku反向代理头
app.set('trust proxy', true)

// 你原有的其他配置保持不变即可,比如passport初始化、静态资源配置、路由挂载
// app.use(passport.initialize())
// app.use('/auth', require('./routes/auth.js'))

加完这行后,Passport生成OAuth回调地址时会自动识别用户实际访问的HTTPS协议,生成的回调地址会和你在Google控制台配置的HTTPS地址完全一致。

2. 修正Google Cloud Console配置

回到OAuth 2.0客户端配置页,已授权重定向URI列表里只保留HTTPS版本的地址:
https://XXX.herokuapp.com/auth/google/callback
删掉之前添加的HTTP版本回调地址,避免后续出现非预期的协议降级。

3. (可选)配置全站HTTPS强制跳转

如果要满足Google应用发布的强制HTTPS要求,可以在所有路由之前添加一个中间件,自动把所有HTTP请求跳转到HTTPS地址:

// 注意:这个中间件必须放在app.set('trust proxy', true)之后
app.use((req, res, next) => {
  if (req.get('x-forwarded-proto') !== 'https') {
    return res.redirect(`https://${req.get('host')}${req.originalUrl}`)
  }
  next()
})
验证

修改完成后重新部署到Heroku,再触发Google登录流程:

  • 跳转到Google授权页时,查看地址栏参数里的redirect_uri字段,会变成HTTPS开头的正确地址
  • 授权后不会再出现400报错,能正常完成登录跳转
  • 全站所有请求、资源加载都会走HTTPS协议,符合安全规范和Google发布要求。

内容的提问来源于stack exchange,提问作者Mav xyz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 06:24:31