【问题标题】:Spring Websockets with JWT使用 JWT 的 Spring Websockets
【发布时间】:2020-08-05 08:33:21
【问题描述】:

我正在使用Stomp 在 Spring 和 Angular 之间实现 websocket 通信。我没有使用基于会话的身份验证,而是JWT 身份验证。我遇到了SimpMessagingTemplate.convertAndSendToUser() 方法的问题。由于我没有基于会话的身份验证,因此 Spring 不知道如何找到将 simpSessionId 与目标用户登录连接的方法。我试过这个https://github.com/spring-projects/spring-framework/blob/master/src/docs/asciidoc/web/websocket.adoc#token-authentication 添加Authorization 标头,但我不能,因为它是Http 标头,而不是websocket。如何准备我的后端和前端应用程序以启用convertAndSendToUser() 机制?如何在建立 websocket 连接时传递Authorization 标头?我在Stackoverflow 上检查了几个主题,但实际上没有一个是解决方案。

【问题讨论】:

    标签: angular spring websocket jwt stomp


    【解决方案1】:

    您可以使用查询参数并将其添加到您的套接字 url。然后,您需要添加 JwtAuthorizationFilter,以在标头为空时查找 querparamter。这非常适合内部应用程序,但我不知道将 JWT 添加到 url 的风险,您应该考虑这一点!

        /**
         * Parses received jwt.
         *
         * @param req Http request from user.
         * @return Authentication token for the user.
         */
        private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest req) {
            String token = req.getHeader(HEADER_STRING);
            if (token == null) {
                String[] params = request.getParameterValues("token");
                if(params.length == 1){
                    token = TOKEN_TYPE + params[0];
                }
            }
    
    
            if (token != null) {
                try {
                    // [...]
                    }
                } catch (JwtException e) {
                    // In case token is expired or invalid. Prevents status 500.
                    logger.error(e.getMessage());
                    return null;
                }
                return null;
            }
            return null;
        }
    

    在我使用的角度方面:

    Stomp.client(`${this.url}?token=${this.jwt}`);
    

    【讨论】:

      猜你喜欢
      • 2017-08-23
      • 2016-12-26
      • 2018-03-30
      • 2015-08-16
      • 2018-03-17
      • 2022-08-04
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多