Websockets客户端API中的HTTP头
看起来很容易添加自定义HTTP标头到您的websocket客户端与任何支持这个HTTP头客户端,但我找不到如何使用JSON API做到这一点。
但是, 规范中似乎应该支持这些头文件 。
任何人都有如何实现它的线索?
var ws = new WebSocket("ws://example.com/service");
具体来说,我需要能够发送一个HTTP授权标头。
更新
简短的回答: 不,但基本身份validation的作品
较长的答案:
JavaScript WebSockets API中没有用于指定客户端/浏览器发送附加头文件的方法。 然而,可以在WebSocket构造函数中指定HTTPpath(“GET / xyz”),基本身份validation头(“授权”)和协议头(“Sec-WebSocket-Protocol”)。
授权标头是从WebSocket URI的用户名和密码(或只是用户名)字段生成的:
var ws = new WebSocket("ws://username:password@example.com")
以上结果在以下string中用“username:password”base64编码:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
我已经在Chrome 55和Firefox 50中testing了基本身份validation,并validation了基本的身份validation信息确实与服务器进行了协商(这在Safari中可能不起作用)。
Sec-WebSocket-Protocol头部(有时被扩展用于websocket特定的authentication)是从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
感谢德米特里弗兰克的基本authentication答案
HTTP授权标题问题可以通过以下方式解决:
var ws = new WebSocket("ws://username:password@example.com/service");
然后,将使用提供的username
和password
设置适当的基本授权HTTP标头。 如果你需要基本授权,那么你就全部设置好了。
然而,我想使用Bearer
,并且我使用了以下技巧:我连接到服务器如下:
var ws = new WebSocket("ws://my_token@example.com/service");
而当我在服务器端的代码接收到非空用户名和空密码的基本授权标头时,它将用户名解释为令牌。
你不能添加头文件,但是如果你只需要在连接的时候将值传递给服务器,你可以在url上指定一个查询string部分:
var ws = new WebSocket("ws://example.com/service?key1=value1&key2=value2");
该URL是有效的,但是 – 当然,你需要修改你的服务器代码来parsing它。
当您想使用JavaScript WebSockets APIbuild立WebSockets连接时,您不能发送自定义标题。 您可以使用第二个WebSocket类构造函数使用Subprotocols
标头:
var ws = new WebSocket("ws://example.com/service", "soap");
然后你可以在服务器上使用Sec-WebSocket-Protocol
密钥获得Subprotocols头文件。
还有一个限制,您的Subprotocols标题值不能包含逗号( ,
)!
我发现这个回购
特别是这条线 ,似乎工作。 我错过了什么?
完全的黑客这样,感谢kanaka的答案。
客户:
var ws = new WebSocket( 'ws://localhost:8080/connect/' + this.state.room.id, store('token') || cookie('token') );
服务器(在这个例子中使用Koa2,但应该在任何地方类似):
var url = ctx.websocket.upgradeReq.url; // can use to get url/query params var authToken = ctx.websocket.upgradeReq.headers['sec-websocket-protocol']; // Can then decode the auth token and do any session/user stuff...
从技术上说,在协议升级阶段之前,您将通过connect函数发送这些头文件。
var WebSocketClient = require('websocket').client; var ws = new WebSocketClient(); ws.connect(url, '', headers);