一尘不染

Websockets客户端API中的HTTP标头

javascript

看起来很容易使用任何支持此功能的HTTP标头客户端向您的websocket客户端添加自定义HTTP标头,但是我找不到如何使用JSON API进行操作。

但是,似乎应该在规范中。任何人都知道如何实现它?

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

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


阅读 486

收藏
2020-04-25

共1个答案

一尘不染

更新了2倍

简短答案: 不,只能指定路径和协议字段。

更长的答案:

JavaScript WebSocketsAPI中没有用于指定客户端/浏览器要发送的其他标头的方法。可以在WebSocket构造函数中指定HTTP路径(“
GET / xyz”)和协议标头(“ Sec-WebSocket-Protocol”)。

Sec-WebSocket-Protocol标头(有时会扩展以用于特定于Websocket的身份验证)是从WebSocket构造函数的可选第二个参数生成的:

var ws = new WebSocket("ws://example.com/path", "protocol");
var ws = new WebSocket("ws://example.com/path", ["protocol1", "protocol2"]);

上面的结果产生以下标题:

Sec-WebSocket-Protocol: protocol

Sec-WebSocket-Protocol: protocol1, protocol2

实现WebSocket身份验证/授权的一种常见模式是实现一种票证系统,其中托管WebSocket客户端的页面从服务器请求票证,然后在WebSocket连接设置过程中的URL
/查询字符串中,在协议字段中传递该票证,或要求在建立连接后作为第一条消息。然后,服务器仅在票证有效时(存在,尚未使用,票证匹配中编码的客户端IP,票证中的时间戳是最近的等)允许连接继续。

基本身份验证以前是一个选项,但已弃用,即使指定了标头,现代浏览器也不会发送标头。

基本身份验证信息(不建议使用)

Authorization标头是从WebSocket URI的用户名和密码(或仅用户名)字段生成的:

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

上面的结果导致以下标头带有字符串“ username:password” base64编码:

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

我已经在Chrome 55和Firefox50中测试了基本身份验证,并验证了该基本身份验证信息确实是与服务器协商的(在Safari中可能无法使用)。

2020-04-25