【问题标题】:Web Socket connection with Basic Access Authentication使用基本访问身份验证的 Web Socket 连接
【发布时间】:2018-04-10 11:03:11
【问题描述】:

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

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

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

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

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

SyntaxError:URL 的方案必须是“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 建立经过身份验证的连接,如果您知道任何解决方案,请告诉我。

【问题讨论】:

    标签: javascript node.js sockets authentication websocket


    【解决方案1】:

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

    最后我通过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.');
    });
    

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

    【讨论】:

    • 子协议对象无效
    猜你喜欢
    • 1970-01-01
    • 2011-09-10
    • 2010-11-10
    • 1970-01-01
    • 2014-12-17
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    相关资源
    最近更新 更多