带有nginx wss的 Spring Boot 无法从Angular 工作

kyxcudwk  于 2022-11-21  发布在  Nginx
关注(0)|答案(1)|浏览(138)

我的spring Boot WebSocket(ws)端点在带Angular (rxstomp)的localhost上运行良好。
产品服务器使用nginx(https),我无法连接到WS。FE和BE在Docker中的同一服务器上,在不同的URL上。
Nginx配置:
第一个
请帮帮忙
谢谢

wj8zmpe1

wj8zmpe11#

首先,这是我们的解决方案,当然还有更好的,但它的工作。
问题在于:
BE(后端)和FE(前端)在同一个服务器上,但有不同的URL。(fe.app.com和be.app.com)还有一个nginx代理。
FE无法通过WebSocket连接到BE。
故怜曰:前端--〉nginx(be.app.com)--〉后端
主要的问题是授权(承载令牌),当我们想连接wss到Spring Boot 应用程序,因为不能发送自定义头在wss连接请求。
解决方案:
将令牌保存到Cookie并在后端TokenAuthorizationFilter中使用它

(Here the token cookie name is Authorization)
  if (request.getCookies() != null) {
    for (Cookie c : request.getCookies()) {
      if (Objects.equals(c.getName(), "Authorization")) {
        if (!c.getValue().startsWith("Bearer"))
          authorizationHeader = "Bearer " + c.getValue();
      }
    }
  }

并使用此参数代替requestHeader的Authorization参数。

This is the request header
String authorizationHeader = request.getHeader("Authorization");

因此,现在我们可以在Cookie中发送令牌,并由后端进行授权。
不错,但有一个其他的问题。重要的是要知道饼干是如何工作的!(Share cookie between subdomain and domain
nginx配置也应该转发cookie。在本例中,我们从FE(fe.app.com/wss)调用FE域,并在nginx配置中将proxy_pass设置为BE WebSocket位置(backendIp:port/ws)
因此,BE获取cookie并用于授权。
希望对你有帮助。:)

相关问题