我有一个Spring MVC服务器,它提供了一堆REST端点以及websocket端点。除了登录端点之外的所有内容都需要身份验证。我使用JWT来验证来自客户端的请求。
当用户登录时,我返回一个X-AUTH-TOKEN报头,包含JWT令牌。然后,在每次向服务器发出请求时,都会在相同的标头中传递此令牌。这对于REST端点来说都很好,但是我不知道如何在websocket上做到这一点。
我使用SockJS,当我打开连接:
var socket = new SockJS('/socket/updates', null, {});
这会导致一个GET请求到/socket/updates/info?T =xxx返回一个403(因为默认情况下所有东西都需要授权)。
理想情况下,我会简单地发送我的X-AUTH-TOKEN头在任何XHR请求SockJS,但我看不到任何方式添加头看API。
最坏的情况下,我可以改变SockJS做到这一点,但我想知道这个功能是否被故意遗漏了?我知道SockJS出于安全原因不支持cookie,但这不是我想做的。
此外,为了测试,我确实允许info端点具有匿名访问,但随后在一堆其他端点上出现了403 -在这些请求中简单地传递认证细节比在我的服务器安全中戳洞更优雅。
感谢您的帮助。
欢呼
你不能从SockJS中设置标题。不是因为SockJS没有这个功能,而是因为浏览器制造商没有将这个API暴露给Javascript。看到:
https://github.com/sockjs/sockjs-client/issues/196关于解决方法,请参见JSON Web令牌(JWT)与基于Spring的SockJS/STOMP Web Socket。
客户端:
stompClient.connect({headername:header}, function () {
setConnected(true);
stompClient.subscribe(request.topic, function (message) {
output(message.body);
});
});
服务器端:
StompHeaderAccessor accessor
= MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
String headervalue= accessor.getNativeHeader("your header name").get(0);