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

时间:2017-10-29 09:45:37

标签: javascript node.js sockets authentication websocket

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

  

引擎盖下SockJS首先尝试使用本机WebSockets。如果失败,它可以使用各种特定于浏览器的传输协议,并通过类似WebSocket的抽象方式呈现它们。

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

var ws = new WebSocket("ws://username:password@example.com/service");

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

  

SyntaxError:网址的方案必须是' http:'或者' https:'。 ' WS:'是不允许的。

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

  

错误:InvalidStateError:尚未建立连接

当我试图打电话时

sock.send('test');

下面的其他解决方案无法实现,因为我无法访问Web Socket的服务器端。

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

我不知道如何正确建立与Web Socket的认证连接,如果您知道任何解决方案让我知道。

1 个答案:

答案 0 :(得分:2)

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

最后,我通过 ws 实现了它,你可以找到它here。 首先,我添加了包含编码令牌的字段授权标题。另一件事是标志 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.');
});

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