首页 > 解决方案 > 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.comhttp://my-ip-address:8080.

问题是redirect-uri总是生成为http://example.com/login/facebook而不是https://example.com/login/facebook(不是https)。

请帮助建议当用户通过访问网站时如何正确request.getScheme()返回。以下是反向代理配置httpshttps/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;
    }
}

标签: springredirectnginxhttpsreverse-proxy

解决方案


request.getScheme()将始终是 http,因为您通过 http 进行代理,但是您在标头中传递请求方案,所以使用它。

更改return request.getScheme() + "://"return request.getHeader('X-Forwarded-Proto') + "://"

不确定java如何解释标题,所以X-Forwarded-Proto可能会变成X_Forwarded_ProtoxForwardedProto其他东西,但你明白了......


推荐阅读