通过基于令牌的身份验证(JWT)使用Spring Websockets(sockJS + Stomp)的最佳方法

时间:2018-10-29 00:49:20

标签: java spring websocket jwt sockjs

我想在具有通过sockJS with Stomp(JWT)进行基于令牌的身份验证的Spring Boot应用程序中使用websockets(Json Web Token)。在服务器上,有一个验证JWT令牌的过滤器。此令牌发送给请求标头,但SockJS客户端api不支持标头。这意味着,当SockJS客户端api尝试与服务器进行websocket握手时,例如:

new SockJS("http://localhost:8080/websocket")

JWT授权过滤器将拦截HTTP请求,并且握手将失败,因为请求上没有标头,因此过滤器将拒绝请求。我已经在论坛中看到了几种建议的解决方法,但是似乎没有一种方法适合这种情况:

  • HandshakeInterceptor:此解决方案不起作用,因为过滤器始终在拦截器之前执行。
  • 在STOMP标头上发送身份验证标头也不起作用,因为STOMP连接自然发生在握手之后。

我发现here可以通过查询参数在SockJS握手URL上发送令牌,而且我必须更改身份验证过滤器以查找查询参数,而不仅仅是标头。出于安全原因,我真的不喜欢在查询参数上发送令牌的解决方案。有更好的替代方法还是真的是最好的方法?

1 个答案:

答案 0 :(得分:0)

  

HandshakeInterceptor:此解决方案无效,因为过滤器   总是在拦截器之前执行。

这就是我对与您完全相同的设置所做的。

您需要将websocket endpoint添加到

@Override public void configure(WebSecurity registry)

喜欢

registry.ignoring().antMatchers("/websocket/**");

这将告诉Spring安全性不会触发套接字端点,因此不会为jwt设置过滤器。