spring - Spring从反向代理获取实际方案
问题描述
我有一个在 Widfly 服务器上运行的 Spring Boot Web 应用程序。我通过生成链接到 Facebook 登录端点的“使用 Facebook 登录”按钮来实现 Facebook OAuth 登录。
https://www.facebook.com/v2.5/dialog/oauth?client_id=****&response_type=code&redirect_uri=http://example.com/login/facebook
我生成redirect_uri
使用以下 java 代码的值。
public static String getFacebookRedirectUrl() {
RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
if (attrs instanceof ServletRequestAttributes) {
HttpServletRequest request = ((ServletRequestAttributes) attrs).getRequest();
return request.getScheme() + "://"
+ request.getServerName() + ":"
+ request.getServerPort()
+ request.getContextPath()
+ "/login/facebook";
} else {
throw new RuntimeException("Cannot determine facebook oauth redirect url");
}
}
我的网站在内部部署到http://my-ip-address:8080
并有一个反向代理 (nginx) 将请求从 转发https://example.com
到http://my-ip-address:8080
.
问题是redirect-uri
总是生成为http://example.com/login/facebook
而不是https://example.com/login/facebook
(不是https
)。
请帮助建议当用户通过访问网站时如何正确request.getScheme()
返回。以下是反向代理配置https
https
/etc/nginx/sites-enalbed/mysite.com
server {
listen 80;
listen 443;
server_name example.com www.example.com;
ssl on;
ssl_certificate /etc/nginx/cert.crt;
ssl_certificate_key /etc/nginx/cert.key;
location / {
proxy_pass http://my-ip-address:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
解决方案
request.getScheme()
将始终是 http,因为您通过 http 进行代理,但是您在标头中传递请求方案,所以使用它。
更改return request.getScheme() + "://"
为return request.getHeader('X-Forwarded-Proto') + "://"
不确定java如何解释标题,所以X-Forwarded-Proto
可能会变成X_Forwarded_Proto
或xForwardedProto
其他东西,但你明白了......
推荐阅读
- c# - 如果将 wpf ItemsControl 与 MVVM 模式一起使用,如何将一个 ObservableCollection 作为 ItemsSource 绑定到不同的组合框(模型)?
- python - 如何加入具有不同 dtype 的两个数据框?
- android - 写入 csv 文件时重复传感器值的问题
- php - 将两个表的结果组合成 JSON 数据
- three.js - 在three.js WebGL中创建放大镜效果
- web-services - Web 服务响应 SetValues 给 Ljava.lang.Object;@ 在电子表格中
- mysql - 表内连接未显示预期结果
- php - 我做错了什么?“定时任务”
- typescript - TypeScript 错误 TS2403:后续变量声明必须具有相同的类型
- python - pyspark 在 Jupyter notebook 中打开而不是 shell