为 WebSocket 连接配置身份验证 headers

Configuring authentication headers for WebSocket connection

IIUC,当我创建 WebSocket 时,一个 HTTP 请求被发送到指定的 URL,其中包含一个升级请求。通常是随此升级请求一起传递身份验证信息,还是应该单独执行?

var websocket = new WebSocket("ws://domain:port/foo"); // Can I include authentication headers with the initial upgrade HTTP request?

WebSocket RFC standard 没有定义任何协议特定的客户端身份验证机制,但提到 HTTP 身份验证是一个可能的选项:

10.5. WebSocket Client Authentication

This protocol doesn't prescribe any particular way that servers can authenticate clients during the WebSocket handshake. The WebSocket
server can use any client authentication mechanism available to a
generic HTTP server, such as cookies, HTTP authentication, or TLS
authentication.

http URLs 的标准规定了一种形式,其中包括 URL 中的登录凭据。形式为http://username:password@www.example.com/file。但并非所有浏览器都支持此语法,因为坦率地说,这是一个非常糟糕的主意。

The WebSocket API 不公开任何用于 HTTP 客户端身份验证的功能。这意味着网络浏览器应该以他们通常的方式提供身份验证:当他们决定支持它时使用上面的 URL 语法,或者通过向用户显示一个弹出窗口,让他们输入他们的登录凭据。

你应该通过web认证,return一个cookie,然后再次连接到websocket服务器,携带cookie。 WS 服务器可以验证 cookie

如果没有基于 cookie 的身份验证或根本不可能(如另一个域中的 WS 服务器),您将必须创建自己的登录请求-响应消息。