Websockets client API 中的 HTTP headers
看起来使用任何支持此功能的HTTP标头客户端将自定义HTTP标头添加到websocket客户端很容易,但是我找不到如何使用Web平台的API来做到这一点。WebSocket
有人知道如何实现它吗?
var ws = new WebSocket("ws://example.com/service");
具体来说,我需要能够发送HTTP授权标头。
看起来使用任何支持此功能的HTTP标头客户端将自定义HTTP标头添加到websocket客户端很容易,但是我找不到如何使用Web平台的API来做到这一点。WebSocket
有人知道如何实现它吗?
var ws = new WebSocket("ws://example.com/service");
具体来说,我需要能够发送HTTP授权标头。
更新 2x
简答:否,只能指定路径和协议字段。
更长的答案:
JavaScript WebSockets API 中没有一种方法可以指定客户端/浏览器要发送的其他标头。HTTP 路径(“GET /xyz”)和协议标头(“Sec-WebSocket-Protocol”)可以在 WebSocket 构造函数中指定。
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,票证中的时间戳是最近的等)。以下是 WebSocket 安全信息的摘要:https://devcenter.heroku.com/articles/websocket-security
基本身份验证以前是一个选项,但已被弃用,即使指定了标头,现代浏览器也不会发送标头。
基本身份验证信息(已弃用 - 不再起作用):
注意:以下信息在任何现代浏览器中都不再准确。
授权标头是从 WebSocket URI 的用户名和密码(或仅用户名)字段生成的:
var ws = new WebSocket("ws://username:password@example.com")
上述结果生成以下标头,其中字符串“用户名:密码”base64 编码:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
我已经在Chrome 55和Firefox 50中测试了基本身份验证,并验证了基本身份验证信息确实与服务器协商(这可能不适用于Safari)。
感谢德米特里·弗兰克(Dmitry Frank)的基本身份验证答案
更多的是替代解决方案,但所有现代浏览器都会将域cookie与连接一起发送,因此使用:
var authToken = 'R3YKZFKBVi';
document.cookie = 'X-Authorization=' + authToken + '; path=/';
var ws = new WebSocket(
'wss://localhost:9000/wss/'
);
最终得到请求连接标头:
Cookie: X-Authorization=R3YKZFKBVi