看起来很容易添加自定义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授权标头。
当前回答
从技术上讲,您将在协议升级阶段之前通过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");
当我的代码在服务器端接收到基本授权头非空用户名和空密码时,它将用户名解释为令牌。
不可能发送授权头。
附加令牌查询参数是一个选项。然而,在某些情况下,以纯文本作为查询参数发送主登录令牌可能是不可取的,因为它比使用报头更不透明,并且最终会被记录在任何地方。如果这引起了您的安全问题,另一种替代方法是仅为web套接字使用第二个JWT令牌。
创建一个REST端点来生成这个JWT,当然,只有使用主登录令牌(通过报头传输)进行身份验证的用户才能访问它。web套接字JWT可以配置不同于您的登录令牌,例如有一个更短的超时,所以它是更安全的发送作为您的升级请求的查询参数。
为注册SockJS eventbusHandler的同一路由创建一个单独的JwtAuthHandler。确保先注册了认证处理程序,这样你就可以根据数据库检查web套接字令牌(JWT应该在后端以某种方式链接到你的用户)。
更多的替代解决方案,但所有现代浏览器发送域cookie随着连接,所以使用:
var authToken = 'R3YKZFKBVi';
document.cookie = 'X-Authorization=' + authToken + '; path=/';
var ws = new WebSocket(
'wss://localhost:9000/wss/'
);
以请求连接头结束:
Cookie: X-Authorization=R3YKZFKBVi
当你想使用JavaScript WebSockets API建立WebSockets连接时,你不能发送自定义头。 你可以通过使用第二个WebSocket类构造函数来使用Subprotocols头:
var ws = new WebSocket("ws://example.com/service", "soap");
然后你可以在服务器上使用Sec-WebSocket-Protocol密钥获取Subprotocols头。
还有一个限制,你的Subprotocols头值不能包含逗号(,)!
所有未来调试器-直到今天,即15-07-21
浏览器也不支持向服务器发送客户标头,因此任何此类代码
import * as sock from 'websocket'
const headers = {
Authorization: "bearer " + token
};
console.log(headers);
const wsclient = new sock.w3cwebsocket(
'wss://' + 'myserver.com' + '/api/ws',
'',
'',
headers,
null
);
这在浏览器中是行不通的。这背后的原因是浏览器原生Websocket构造函数不接受头文件。
正如我上面所示,w3cwebsocket承包商接受头文件,因此很容易被误导。然而,这在node.js中是有效的。