JHipster社交登录redirect_url错误:Google登录本地正常生产环境异常
解决Google登录Redirect URI错误的方案
这问题我之前帮人排查过,核心原因是你的Nginx反向代理没把真实的请求头传递给后端应用,导致后端生成redirect_uri的时候用了容器内部的地址,而不是用户实际访问的域名。下面是具体的解决步骤:
1. 修正Nginx代理配置,传递真实请求头
你的Nginx location /portal 块里需要添加几个关键的请求头,让后端应用知道用户实际访问的域名和协议:
location /portal { proxy_pass http://domain:8888; # 传递真实的主机名(域名) proxy_set_header Host $host; # 传递真实的协议(http/https) proxy_set_header X-Forwarded-Proto $scheme; # 传递真实的客户端IP proxy_set_header X-Forwarded-For $remote_addr; # 传递完整的访问主机地址 proxy_set_header X-Forwarded-Host $host; }
2. 配置后端应用信任反向代理
接下来要让你的后端应用(不管是Spring Boot、Node.js还是其他框架)识别这些X-Forwarded-*开头的头是来自可信的Nginx代理,这样才会用这些头里的信息生成正确的redirect_uri。
举几个常见框架的配置例子:
- Spring Boot:在
application.properties里添加:server.forward-headers-strategy=NATIVE server.use-forward-headers=true - Node.js/Express:使用
trust proxy设置:app.set('trust proxy', true);
3. 验证Google开发者控制台的Redirect URI配置
最后别忘了去Google开发者控制台,把生产环境的正确Redirect URI(https://domain.com/portal/signin/google)添加到OAuth 2.0客户端的授权重定向URI列表里,确保和后端生成的地址完全一致。
问题根源补充
当请求经过Nginx代理时,后端应用默认会认为请求是来自Nginx的(也就是http://domain:8888),而不是用户实际访问的https://domain.com。所以生成Google登录的redirect_uri时,就用了容器内部的地址,导致Google验证不通过。通过传递正确的请求头并让后端信任代理,就能让后端用真实的域名生成redirect_uri了。
内容的提问来源于stack exchange,提问作者Viktor Reinok
相关产品推荐
相关产品推荐

