看起来很容易添加自定义HTTP头到你的websocket客户端与任何HTTP头客户端支持这一点,但我不知道如何与web平台的websocket API。
有人知道怎么做到吗?
var ws = new WebSocket("ws://example.com/service");
具体来说,我需要能够发送HTTP授权标头。
看起来很容易添加自定义HTTP头到你的websocket客户端与任何HTTP头客户端支持这一点,但我不知道如何与web平台的websocket API。
有人知道怎么做到吗?
var ws = new WebSocket("ws://example.com/service");
具体来说,我需要能够发送HTTP授权标头。
当前回答
多亏了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...
其他回答
你不能添加头,但是,如果你只需要在连接的时候向服务器传递值,你可以在url上指定一个查询字符串部分:
var ws = new WebSocket("ws://example.com/service?key1=value1&key2=value2");
该URL是有效的,但当然,您需要修改服务器代码来解析它。
从技术上讲,您将在协议升级阶段之前通过connect函数发送这些头文件。这在我的一个nodejs项目中是有效的:
var WebSocketClient = require('websocket').client;
var ws = new WebSocketClient();
ws.connect(url, '', headers);
HTTP授权头问题可以通过以下方式解决:
var ws = new WebSocket("ws://username:password@example.com/service");
然后,将使用提供的用户名和密码设置一个正确的基本授权HTTP报头。如果您需要基本授权,那么您就万事俱备了。
我想使用承载,但是,我采取了以下技巧:我连接到服务器如下:
var ws = new WebSocket("ws://my_token@example.com/service");
当我的代码在服务器端接收到基本授权头非空用户名和空密码时,它将用户名解释为令牌。
您可以在对象的第三个参数(选项)中将头作为键值传递。 使用授权令牌的示例。将协议(第二个参数)保留为空
ws = new WebSocket(‘ws://localhost’, null, { headers: { Authorization: token }})
编辑:这种方法似乎只适用于nodejs库,不适用于标准的浏览器实现。因为它可能对某些人有用。
我的情况:
我想连接到一个生产WS服务器www.mycompany.com/api/ws… 使用真实凭证(会话cookie)… 从本地页面(localhost:8000)。
设置文档。Cookie = "sessionid=foobar;path=/"不会有帮助,因为域不匹配。
解决方案:
将127.0.0.1 wsdev.company.com添加到/etc/hosts.
这样,当您从有效的子域wsdev.company.com连接到www.mycompany.com/api/ws时,浏览器将使用来自mycompany.com的cookie。