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

有人知道怎么做到吗?

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

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


当前回答

我的情况:

我想连接到一个生产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。

其他回答

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

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

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

所有未来调试器-直到今天,即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中是有效的。

从技术上讲,您将在协议升级阶段之前通过connect函数发送这些头文件。这在我的一个nodejs项目中是有效的:

var WebSocketClient = require('websocket').client;
var ws = new WebSocketClient();
ws.connect(url, '', headers);

HTTP授权头问题可以通过以下方式解决:

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

然后,将使用提供的用户名和密码设置一个正确的基本授权HTTP报头。如果您需要基本授权,那么您就万事俱备了。


我想使用承载,但是,我采取了以下技巧:我连接到服务器如下:

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

当我的代码在服务器端接收到基本授权头非空用户名和空密码时,它将用户名解释为令牌。

对于那些在2021年还在苦苦挣扎的人来说,Node JS全局web套接字类在构造函数中有一个额外的选项字段。如果你去WebSockets类的实现,你会发现这个变量声明。你可以看到它接受三个参数url,这是必需的,协议(可选),这是一个字符串,字符串数组或null。第三个参数是选项。我们的兴趣,一个对象和(仍然可选)。看到……

declare var WebSocket: {
    prototype: WebSocket;
    new (
        uri: string,
        protocols?: string | string[] | null,
        options?: {
            headers: { [headerName: string]: string };
            [optionName: string]: any;
        } | null,
    ): WebSocket;
    readonly CLOSED: number;
    readonly CLOSING: number;
    readonly CONNECTING: number;
    readonly OPEN: number;
};

如果你使用的是Node Js库,比如react,请使用react-native。这里有一个例子,你可以这样做。

 const ws = new WebSocket(WEB_SOCKETS_URL, null, {
    headers: {
      ['Set-Cookie']: cookie,
    },
  });

注意,对于协议,我传递了null。如果您正在使用jwt,您可以传递带有holder +令牌的授权标头

免责声明,这可能不支持所有的浏览器外的盒子,从MDN web文档中,你可以看到只有两个参数被记录。 看到https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/WebSocket语法