具有基本访问身份验证的 Web 套接字连接

Bar*_*osz 7 javascript sockets authentication websocket node.js

我正在尝试与需要基本访问身份验证的 Web 套接字建立连接(客户端)。从文档中我知道我应该使用带有 base64 加密的用户名和密码。它是 node.js 应用程序,所以我决定使用 npm 包 SockJS-client。这似乎是一个很好的解决方案,因为:

在底层,SockJS 尝试首先使用原生 WebSockets。如果失败,它可以使用各种特定于浏览器的传输协议,并通过类似 WebSocket 的抽象来呈现它们。

但我不知道如何使用基本访问身份验证建立连接。我已经尝试过这里的解决方案,但是这个

var ws = new WebSocket("ws://username:password@example.com/service");
Run Code Online (Sandbox Code Playgroud)

不起作用,我收到如下错误:

语法错误:URL 的方案必须是“http:”或“https:”。'ws:' 是不允许的。

当我尝试使用http/https 时,我得到:

错误:InvalidStateError:尚未建立连接

当我试图打电话时

sock.send('test');
Run Code Online (Sandbox Code Playgroud)

另一个像下面这样的解决方案是不可能实现的,因为我无法访问 Web Socket 的服务器端。

var ws = new WebSocket("ws://example.com/service?key1=value1&key2=value2");
Run Code Online (Sandbox Code Playgroud)

我不知道如何正确建立与 Web Socket 的经过身份验证的连接,如果您知道任何解决方案,请告诉我。

Bar*_*osz 13

解决方案非常简单,但我认为值得将它放在这里供下一代使用。

最后,我通过ws实现了它,你可以在这里找到它。首先,我添加了带有字段 Authorization 的标头,其中包含编码的令牌。另一件事是将标志perMessageDeflate设置为false

只有在服务器支持和启用扩展时,客户端才会使用该扩展。

这就是代码的样子,对我来说非常好:

const WebSocket = require('ws');

const webSocket = new WebSocket(url, {
  perMessageDeflate: false,
  headers: {
    Authorization: `Basic ${encodedToken}`,
  },
});

webSocket.on('open', function open() {
  console.log('Connection has been established.');
});
Run Code Online (Sandbox Code Playgroud)

我希望它会为您节省很多时间。

  • 仅供参考其他遇到此问题的人,它不再起作用。您无法在 websocket 请求中传递其他标头,因为它实际上不是 HTTP。初始握手看起来像 HTTP(以便可以在同一端口号上处理 HTTP 请求),但规范明确指出它不是 HTTP,因此无法添加额外的标头(并且 websocket 服务器无论如何也不会看到它们,因为它们会丢弃HTTP 兼容的初始请求)。如果您想向 websocket 添加身份验证,则必须通过套接字本身发送消息来完成。 (5认同)