看起来很容易使用任何支持此功能的 HTTP 标头客户端将自定义 HTTP 标头添加到您的 websocket 客户端,但我无法找到如何使用 Web 平台的WebSocketAPI 来做到这一点。
WebSocket
任何人都知道如何实现它?
var ws = new WebSocket("ws://example.com/service");
具体来说,我需要能够发送 HTTP 授权标头。
更新了 2 倍
简短回答: 不,只能指定路径和协议字段。
更长的答案:
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
基本身份验证以前是一个选项,但已被弃用,现代浏览器即使指定了标头也不会发送标头。
基本身份验证信息(已弃用 - 不再起作用) :
注意:以下信息在任何现代浏览器中都不再准确。
Authorization 标头是从 WebSocket URI 的用户名和密码(或只是用户名)字段生成的:
var ws = new WebSocket("ws://username:password@example.com")
上面的结果是带有字符串“username:password”base64编码的以下标头:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
我已经在 Chrome 55 和 Firefox 50 中测试了基本身份验证,并验证了基本身份验证信息确实是与服务器协商的(这在 Safari 中可能不起作用)。