概述Nginx反向代理Websocket身份validation – HTTP 403
我使用Nginx作为Spring启动应用程序的反向代理。 我也使用sockJs和stomp消息的Websockets。
这是上下文configuration。
<websocket:message-broker application-destination-prefix=\”/app\”> <websocket:stomp-endpoint path=\”/localization\” > <websocket:sockJs/> </websocket:stomp-endpoint> <websocket:simple-broker prefix=\”/topic\” /> </websocket:message-broker>
这里是客户端代码:
var socket = new SockJs(entryPointUrl); var stompClIEnt = Stomp.over(socket); var _this = this; stompClIEnt.connect({},function () { stompClIEnt.subscribe(\’/app/some-url\’,function (message) { // do some stuff }); });
我也是你们spring安全保护一些内容。
在Nginx后面运行一个Spring Boot应用程序
Docker端口不能从主机访问
@Configuration @Order(4) public static class FrontendSecurityConfig extends WebSecurityConfigurerAdapter { @OverrIDe protected voID configure(httpSecurity http) throws Exception { http.authorizeRequests() .antMatchers(\”/Js/**\”,\”/CSS/**\”,\”/webjars/**\”).permitAll() .anyRequest().authenticated() .and() .formLogin().loginPage(\”/login\”).permitAll() .and() .logout().permitAll(); } }
一切运行良好,期望当我运行这个应用程序背后的Nginx逆向代理。 这是相反的configuration:
proxy_pass http://testsysten:8080; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # WebSocket support (Nginx 1.4) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; # Max body size clIEnt_max_body_size 10M;
连接总是以http 403代码失败。
我正在使用版本1.9.7。
你有什么想法,为什么客户端没有得到authentication?
我知道类似这样的问题,但解决scheme根本不起作用。
更新
我设法通过http运行应用程序。 我需要在Nginxconfiguration中传递CSRF令牌。 新的configuration是:
proxy_pass http://testsysten:8080; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # Pass the csrf token (see https://de.wikipedia.org/wiki/Cross-Site-Request-Forgery) # Default in Spring Boot proxy_pass_header X-XSRF-TOKEN; # WebSocket support (Nginx 1.4) proxy_http_version 1.1;
唯一缺less的是通过httpSredirect。 在Spring日志中看到以下条目:
oswssthDefaultSockJsService – Processing transport request: GET http://testsystem:80/localization/226/3mbmu212/websocket
好像Nginx Proxy需要重写到正确的端口。
我自己解决了这个问题。 基本上,如果你想使用Websocket和Spring Security,Nginx需要传递一些额外的头值。 需要将以下几行添加到Nginx配置中的location部分:
# Pass the csrf token (see https://de.wikipedia.org/wiki/Cross-Site-Request-Forgery) # Default in Spring Boot and required. Without it Nginx suppresses the value proxy_pass_header X-XSRF-TOKEN; # Set origin to the real instance,otherwise a of Spring security check will fail # Same value as defined in proxy_pass proxy_set_header Origin \”http://testsysten:8080\”;
我遇到了类似的问题。 我无法使用Nginx的基本Spring Security认证。 除了设置proxy_pass_header X-XSRF-TOKEN; ,我也必须设置underscores_in_headers on; ,因为默认情况下Nginx不允许带下划线的标题,并且CSRF标记被命名为_csrf 。
所以我最后的配置文件看起来像这样:
server { underscores_in_headers on; Listen 80 default_server; Listen [::]:80 default_server ipv6only=on; root /usr/share/Nginx/HTML; index index.HTML index.htm; # Make site accessible from http://localhost/ server_name localhost; location / { # First attempt to serve request as file,then # as directory,then fall back to displaying a 404. try_files $uri $uri/ =404; # Uncomment to enable naxsi on this location # include /etc/Nginx/naxsi.rules } location /example/ { proxy_pass_header X-XSRF-TOKEN; proxy_pass http://localhost:8080/; } }
我在Nginx代理中解决了这个问题,没有CSRF头。
我的堆栈:spring-boot,spring-security(带有redis会话存储),spring-boot-websocket ,默认的STOMP实现 ,Nginx服务于前端,代理到前端消费的其他服务。
在第一次使用Nginx博客的默认配置展示在这里和这里(复制和粘贴历史记录):
http { map $http_upgrade $connection_upgrade { default upgrade; \’\’ close; } upstream websocket { server 192.168.100.10:8010; } server { Listen 8020; location / { proxy_pass http://websocket; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } } }
但不工作,仍403禁止。
我用下面的配置解决了这个问题(修复websocket的真正重要部分是#WebSocket Proxy ):
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { Listen 30010; server_name localhost; clIEnt_max_body_size 10M; location / { root /usr/share/Nginx/HTML; index index.HTML index.htm; } # Backend API Proxy location /API { proxy_pass http://192.168.0.100:30080; proxy_set_header Host $http_host; proxy_set_header Access-Control-Allow-Origin 192.168.0.100; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Nginx-Proxy true; rewrite ^/API/?(.*) /$1 break; proxy_redirect off; } # CDN Proxy location ~ ^/cdn/(.*) { proxy_pass http://192.168.0.110:9000; rewrite ^/cdn/(.*) /$1 break; } # This is the configuration that fix the problem with WebSocket # WebSocket Proxy location /ws { proxy_pass http://192.168.0.120:30090; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \”upgrade\”; proxy_set_header Host $http_host; proxy_set_header Access-Control-Allow-Origin 192.168.0.120; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Nginx-Proxy true; } } }
总结
以上是内存溢出为你收集整理的Nginx反向代理Websocket身份validation – HTTP 403全部内容,希望文章能够帮你解决Nginx反向代理Websocket身份validation – HTTP 403所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容