是否可以通过 StompJS (ng2Stomp) 通过 websocket 捕获未经授权的错误?

Posted

技术标签:

【中文标题】是否可以通过 StompJS (ng2Stomp) 通过 websocket 捕获未经授权的错误?【英文标题】:Is it possible to catch unauthorized error through websocket via StompJS (ng2Stomp)? 【发布时间】:2021-03-09 17:49:25 【问题描述】:

我在 Angular 中使用 StompJS ng2-stompjs。请求通过 JWT 身份验证。

我编写了一个 HttpInterceptor,当任何 http 响应返回错误 401 时,它会注销用户。我想用 websocket 实现类似的行为。我的应用程序仅在某些页面上使用 websocket 通信,因此我无法跟踪它们的令牌是否过期。 我还必须使用 Stomp,因为我必须订阅主题,据我所知,通过标准 typescript 或 rxjs websockets 是不可能的。

所以问题如下: 当token出错时,我可以在控制台看到如下错误:

client.js:274 WebSocket 连接到“ws://...”失败:HTTP 身份验证失败;没有可用的有效凭据

如果我启用了调试模式,Stomp 还会在控制台中通知我连接被关闭。但是,当我收到此类身份验证错误时,我想知道代码级别。

在这个 ng2stomp 实现中,我只能找到一个 webSocketErrors$ 主题,该主题会在发生此错误时通知我,但它只发回一个打字稿 Event,没有相关数据。

从这个错误中我无法判断是突然失去连接,还是后端错误,或者用户实际上是未经授权的,因此当我发现这个错误时,我无法强制注销。

我还没有尝试过使用标准的 StompJS 库,但我不确定它是否可以捕捉到这个错误。除了使用 Stomp 之外,我也不知道是否有其他方式可以订阅主题,因为这是我目前找到的唯一解决方案。

感谢任何建议。

【问题讨论】:

【参考方案1】:

我试图在不编写工作代码的情况下回答。

有几点:

Websocket 连接,即使通过 HTTP 不使用与普通 HTTP 连接相同的 HTTP 堆栈。 Angular 的 HTTP 拦截器不会拦截这些调用。 没有将 HTTP 标头添加到 WebSocket 连接请求的记录方法。 添加身份验证凭据的可靠方法是 STOMP 连接标头 - https://stomp-js.github.io/api-docs/latest/classes/RxStompConfig.html#connectHeaders 如果您需要获取或刷新令牌,您可以使用https://stomp-js.github.io/api-docs/latest/classes/RxStompConfig.html#beforeConnect 如果您使用的是 SockJS,请同时参考 https://stomp-js.github.io/guide/stompjs/rx-stomp/ng2-stompjs/using-stomp-with-sockjs.html。

ng2-stompjs 是对 StompJs 的薄包装,因此,在能力方面两者不太可能有所不同。

【讨论】:

以上是关于是否可以通过 StompJS (ng2Stomp) 通过 websocket 捕获未经授权的错误?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Angular 应用程序使用 stompjs 的问题

Stompjs websocket vue

stompjs初探

没有 SockJS/StompJS 的 Spring STOMP 服务器

如何在 angular2-webpack 中导入“stompjs/lib/stomp.min”

在 React Native 中使用 @stomp/stompjs 的 Web 套接字连接