使用 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 标头变量

Spring Boot SockJS应用例子

我可以使用 Spring SockJs websocket 实现添加 cookie

解决vue一直出现sockjs-node问题

通过身份验证从动态内容提供者加载 html5 音频

通过身份验证从动态内容提供程序加载html5音频