看起来很容易添加自定义HTTP头到你的websocket客户端与任何HTTP头客户端支持这一点,但我不知道如何与web平台的websocket API。

有人知道怎么做到吗?

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

具体来说,我需要能够发送HTTP授权标头。


当前回答

当你想使用JavaScript WebSockets API建立WebSockets连接时,你不能发送自定义头。 你可以通过使用第二个WebSocket类构造函数来使用Subprotocols头:

var ws = new WebSocket("ws://example.com/service", "soap");

然后你可以在服务器上使用Sec-WebSocket-Protocol密钥获取Subprotocols头。

还有一个限制,你的Subprotocols头值不能包含逗号(,)!

其他回答

所有未来调试器-直到今天,即15-07-21

浏览器也不支持向服务器发送客户标头,因此任何此类代码

    import * as sock from 'websocket'
    const headers = {
        Authorization: "bearer " + token
    };
    console.log(headers);

    const wsclient = new sock.w3cwebsocket(
        'wss://' + 'myserver.com' + '/api/ws',
        '',
        '',
        headers,
        null
    );

这在浏览器中是行不通的。这背后的原因是浏览器原生Websocket构造函数不接受头文件。

正如我上面所示,w3cwebsocket承包商接受头文件,因此很容易被误导。然而,这在node.js中是有效的。

您可以在对象的第三个参数(选项)中将头作为键值传递。 使用授权令牌的示例。将协议(第二个参数)保留为空


ws = new WebSocket(‘ws://localhost’, null, { headers: { Authorization: token }})

编辑:这种方法似乎只适用于nodejs库,不适用于标准的浏览器实现。因为它可能对某些人有用。

你不能添加头,但是,如果你只需要在连接的时候向服务器传递值,你可以在url上指定一个查询字符串部分:

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

该URL是有效的,但当然,您需要修改服务器代码来解析它。

我的情况:

我想连接到一个生产WS服务器www.mycompany.com/api/ws… 使用真实凭证(会话cookie)… 从本地页面(localhost:8000)。

设置文档。Cookie = "sessionid=foobar;path=/"不会有帮助,因为域不匹配。

解决方案:

将127.0.0.1 wsdev.company.com添加到/etc/hosts.

这样,当您从有效的子域wsdev.company.com连接到www.mycompany.com/api/ws时,浏览器将使用来自mycompany.com的cookie。

我发现最好的方法是将jwt像常规消息一样发送到服务器。让服务器监听此消息并在此时进行验证。如果有效,则将其添加到存储的连接列表中。否则,返回一条消息,说该连接无效并关闭连接。下面是客户端代码。后台是一个使用Websockets的nestjs服务器。

  socket.send(
      JSON.stringify({
        event: 'auth',
        data: jwt
      })
    );