首页 >web前端 >js教程 >如何在 JavaScript 中向 WebSocket 客户端连接添加自定义 HTTP 标头(例如授权)?

如何在 JavaScript 中向 WebSocket 客户端连接添加自定义 HTTP 标头(例如授权)?

Patricia Arquette
Patricia Arquette原创
2024-11-30 08:13:14648浏览

How Can I Add Custom HTTP Headers, Such as Authorization, to a WebSocket Client Connection in JavaScript?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn