使用 SockJS 提供 auth 标头
Posted
技术标签:
【中文标题】使用 SockJS 提供 auth 标头【英文标题】:Providing auth header with SockJS 【发布时间】:2015-11-30 08:15:55 【问题描述】:我有一个 Spring MVC 服务器,它提供了一堆 REST 端点以及一个 websocket 端点。除登录端点外的所有内容都需要身份验证。我正在使用 JWT 对来自客户端的请求进行身份验证。
当用户登录时,我会返回一个 X-AUTH-TOKEN 标头,其中包含 JWT 令牌。然后,在对服务器的每个请求中,此令牌都会在相同的标头中传递。这一切都适用于 REST 端点,但我不知道如何在 websocket 上执行此操作。
我正在使用 SockJS,当我打开连接时:
var socket = new SockJS('/socket/updates', null, );
这会导致对 /socket/updates/info?t=xxx 的 GET 请求返回 403(因为默认情况下所有内容都需要身份验证)。
理想情况下,我只需在 SockJS 发出的任何 XHR 请求上发送我的 X-AUTH-TOKEN 标头,但我看不到任何添加标头的方式查看 API。
最坏的情况我可以改变 SockJS 来做到这一点,但我想知道这个功能是否被故意遗漏了?我知道 SockJS 出于安全原因不支持 cookie,但这不是我想要做的。
另外,为了进行测试,我确实允许 info 端点具有匿名访问权限,但随后它在一堆其他端点上是 403 - 简单地传递这些请求的身份验证详细信息比在我的服务器安全。
任何帮助表示赞赏。
干杯
【问题讨论】:
【参考方案1】:您不能从 SockJS 设置标题。不是因为 SockJS 没有这个功能,而是因为浏览器制造商没有将这个 API 暴露给 javascript。见:
https://github.com/sockjs/sockjs-client/issues/196
有关解决方法,请参阅JSON Web Token (JWT) with Spring based SockJS / STOMP Web Socket。
【讨论】:
到目前为止有什么变化吗? 2019年现在能用吗?我尝试了新的SockJS(url, headers : Authorization : 'Bearer <TOKEN>'
,当我在开发控制台选项卡网络中进行调试时,我看到请求没有授权标头(标头未考虑在内)【参考方案2】:
客户端:
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);
【讨论】:
这设置了 STOMP 标头,而不是 HTTP 标头,因此它可能是解决方法的一部分,它不能解决无法将自定义 HTTP 标头添加到 SockJS 握手请求的初始问题。 好吧,在没有维护 HttpSession 的情况下(即http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
时),看起来这种方法是 Spring 推荐的方法。 github.com/spring-projects/spring-framework/blob/master/src/…以上是关于使用 SockJS 提供 auth 标头的主要内容,如果未能解决你的问题,请参考以下文章
在 PHP curl 请求中使用 Auth Digest 标头变量