有些业务场景需要对 Websocket 连接做认证,那么可以用 JS 给 Websocket 添加 Authorization
一类的自定义请求头吗?
先说结论:不可以,只有 path
和 protocol
可以被指定。
在 JavaScript WebSockets API 中没有为浏览器或 (Node) cli 添加额外请求头的方法。 只有请求路径 (“GET /xyz”) 和协议 (“Sec-WebSocket-Protocol”) 可以在 WebSocket 构造函数中指定。
1 | var ws = new WebSocket("ws://example.com/path", "protocol"); |
上面代码得到的请求头分别是:
1 | Sec-WebSocket-Protocol: protocol |
为 WebSocket 做认证的常规方案是:服务端实现一个 ticket
,客户端在建立连接后,发送第一条信息时,在 URL 或 query string
中传递这个 ticket
,服务端检查其是否有效。关于 WebSocket 安全相关的信息还可以查看这篇文章。
Basic authentication
(Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=) 在以前是可以实现的,但现代浏览器逐渐抛弃了这个特性。
1 | // 已废弃的用法 |
评论