看起来很容易使用任何支持此功能的HTTP标头客户端向您的websocket客户端添加自定义HTTP标头,但是我找不到如何使用JSON API进行操作。
但是,似乎应该在规范中。任何人都知道如何实现它?
var ws = new WebSocket("ws://example.com/service");
具体来说,我需要能够发送HTTP授权标头。
更新了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中可能无法使用)。