WebSocket 客户端 API 中的 HTTP 标头
使用支持此功能的任何 HTTP 标头客户端将自定义 HTTP 标头添加到 WebSocket 客户端似乎很容易,但无法找到如何使用网络平台的 WebSocket API 执行此操作。
有人知道如何实现它吗?
var ws = new WebSocket("ws://example.com/service");
具体来说,需要能够发送 HTTP 授权标头。
更新
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@")
以上代码生成带有 base64 编码字符串“username:password”的以下标头:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
已在 Chrome 55 和 Firefox 50 中测试了基本身份验证,并验证了确实与服务器协商了基本身份验证信息(这可能不适用于 Safari)。
感谢 Dmitry Frank 提供基本身份验证答案。
以上是如何在 JavaScript 中向 WebSocket 客户端连接添加自定义 HTTP 标头(例如授权)?的详细内容。更多信息请关注PHP中文网其他相关文章!