看起来很容易添加自定义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授权标头。
当前回答
对于那些在2021年还在苦苦挣扎的人来说,Node JS全局web套接字类在构造函数中有一个额外的选项字段。如果你去WebSockets类的实现,你会发现这个变量声明。你可以看到它接受三个参数url,这是必需的,协议(可选),这是一个字符串,字符串数组或null。第三个参数是选项。我们的兴趣,一个对象和(仍然可选)。看到……
declare var WebSocket: {
prototype: WebSocket;
new (
uri: string,
protocols?: string | string[] | null,
options?: {
headers: { [headerName: string]: string };
[optionName: string]: any;
} | null,
): WebSocket;
readonly CLOSED: number;
readonly CLOSING: number;
readonly CONNECTING: number;
readonly OPEN: number;
};
如果你使用的是Node Js库,比如react,请使用react-native。这里有一个例子,你可以这样做。
const ws = new WebSocket(WEB_SOCKETS_URL, null, {
headers: {
['Set-Cookie']: cookie,
},
});
注意,对于协议,我传递了null。如果您正在使用jwt,您可以传递带有holder +令牌的授权标头
免责声明,这可能不支持所有的浏览器外的盒子,从MDN web文档中,你可以看到只有两个参数被记录。 看到https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/WebSocket语法
其他回答
所有未来调试器-直到今天,即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中是有效的。
不可能发送授权头。
附加令牌查询参数是一个选项。然而,在某些情况下,以纯文本作为查询参数发送主登录令牌可能是不可取的,因为它比使用报头更不透明,并且最终会被记录在任何地方。如果这引起了您的安全问题,另一种替代方法是仅为web套接字使用第二个JWT令牌。
创建一个REST端点来生成这个JWT,当然,只有使用主登录令牌(通过报头传输)进行身份验证的用户才能访问它。web套接字JWT可以配置不同于您的登录令牌,例如有一个更短的超时,所以它是更安全的发送作为您的升级请求的查询参数。
为注册SockJS eventbusHandler的同一路由创建一个单独的JwtAuthHandler。确保先注册了认证处理程序,这样你就可以根据数据库检查web套接字令牌(JWT应该在后端以某种方式链接到你的用户)。
推荐的方法是通过URL查询参数
// authorization: Basic abc123
// content-type: application/json
let ws = new WebSocket(
"ws://example.com/service?authorization=basic%20abc123&content-type=application%2Fjson"
);
这被认为是一个安全的最佳实践,因为:
WebSockets不支持头文件 在HTTP -> WebSocket升级期间,建议不要使用报头,因为CORS不是强制的 SSL加密查询参数 浏览器不会像缓存url那样缓存WebSocket连接
当你想使用JavaScript WebSockets API建立WebSockets连接时,你不能发送自定义头。 你可以通过使用第二个WebSocket类构造函数来使用Subprotocols头:
var ws = new WebSocket("ws://example.com/service", "soap");
然后你可以在服务器上使用Sec-WebSocket-Protocol密钥获取Subprotocols头。
还有一个限制,你的Subprotocols头值不能包含逗号(,)!
在我的情况下(Azure时间序列洞察wss://)
使用ReconnectingWebsocket包装器,并能够实现添加头与一个简单的解决方案:
socket.onopen = function(e) {
socket.send(payload);
};
本例中的有效载荷为:
{
"headers": {
"Authorization": "Bearer TOKEN",
"x-ms-client-request-id": "CLIENT_ID"
},
"content": {
"searchSpan": {
"from": "UTCDATETIME",
"to": "UTCDATETIME"
},
"top": {
"sort": [
{
"input": {"builtInProperty": "$ts"},
"order": "Asc"
}],
"count": 1000
}}}