javascript - Websockets 客户端 API 中的 HTTP header

标签 javascript http header websocket

看起来很容易使用任何支持此功能的 HTTP header 客户端将自定义 HTTP header 添加到您的 websocket 客户端,但我无法找到如何使用 Web 平台的 WebSocket API 来做到这一点。

有人知道如何实现吗?

var ws = new WebSocket("ws://example.com/service");

具体来说,我需要能够发送 HTTP 授权 header 。

最佳答案

更新了 2 倍

简答:不行,只能指定路径和协议(protocol)字段。

更长的答案:

JavaScript 中没有方法 WebSockets API用于指定客户端/浏览器发送的附加 header 。 HTTP 路径(“GET/xyz”)和协议(protocol)头(“Sec-WebSocket-Protocol”)可以在 WebSocket 构造函数中指定。

Sec-WebSocket-Protocol header (有时扩展为用于特定于 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/查询字符串中的协议(protocol)字段,或作为连接建立后的第一条消息所必需。然后,服务器仅在票证有效(存在、尚未使用、票证匹配中的客户端 IP 编码、票证中的时间戳是最近的等)时才允许连接继续。以下是 WebSocket 安全信息的摘要:https://devcenter.heroku.com/articles/websocket-security

基本身份验证以前是一个选项,但已被弃用,现代浏览器即使指定了 header 也不会发送。

基本身份验证信息(已弃用 - 不再起作用):

NOTE: the following information is no longer accurate in any modern browsers.

Authorization header 是从 WebSocket URI 的用户名和密码(或只是用户名)字段生成的:

var ws = new WebSocket("ws://username:password@example.com")

上面的结果是带有字符串“username:password”base64编码的以下 header :

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

我已经在 Chrome 55 和 Firefox 50 中测试了基本身份验证,并验证了基本身份验证信息确实是与服务器协商的(这在 Safari 中可能不起作用)。

感谢 Dmitry Frank 的基本身份验证 answer

关于javascript - Websockets 客户端 API 中的 HTTP header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4361173/

相关文章:

javascript - 遍历对象字面量和数组

javascript - 在Electronjs中获取值选择(JavaScript)和网格

rest - 如何在 Amazon S3 上传后触发 REST 调用

css - 删除标题上的左/右填充

javascript - 未捕获错误 : Syntax error, 无法识别的表达式:ajaxsample/update_agenda (CodeIgniter)

javascript - 转换为 map 对象

java - 来自网络浏览器的跨域调用

java - Netty Http Client : how to separate client-start,发送请求,和client-shutdown分为不同的方法

html - 向右浮动的标题项 = 向左浮动如何?

c++ - 如何处理带有变体的复杂 header 递归并使用