Javascript 在将连接升级到websocket之前通过JWT对用户进行身份验证
我在服务器上使用的是NodeV8.6.0。我不会使用Socket.io 我希望用户通过GET请求发送一个JWT(即通过自定义头),该请求将被拒绝(他们未经授权)并阻止建立websocket,或者,如果他们发送有效的JWT,我希望GET请求升级到websocketJavascript 在将连接升级到websocket之前通过JWT对用户进行身份验证,javascript,node.js,websocket,jwt,Javascript,Node.js,Websocket,Jwt,我在服务器上使用的是NodeV8.6.0。我不会使用Socket.io 我希望用户通过GET请求发送一个JWT(即通过自定义头),该请求将被拒绝(他们未经授权)并阻止建立websocket,或者,如果他们发送有效的JWT,我希望GET请求升级到websocket axios.get('http://localhost:3001/upgrade', { headers: { Authorization: 'bearer jwtGoesHere', Upgra
axios.get('http://localhost:3001/upgrade', {
headers: {
Authorization: 'bearer jwtGoesHere',
Upgrade: 'websocket',
Connection: 'Upgrade',
'Sec-WebSocket-Key': 'dGhlIHNhbXBsZSBub25jZQ==',
'Sec-WebSocket-Version': 13
}
})
但是,无法发送自定义头。如果我试图发送升级到websocket所需的标题,我会收到一个错误:拒绝设置不安全的标题
。环顾web,我发现在尝试建立websocket连接时,可能有两种方法可以通过发送某种信息:和。然而,在我看来,它们似乎有点黑客化,或者至少是非标准的解决方案(通过这种方式发送JWT可以吗?)
目前,这是我的代码在服务器上的外观(使用TypeScript):
在客户端,我只是使用原生WebSocket
const webSockets: any = {};
const webSocketServer: any = new WebSocket.Server({ noServer: true });
server.on('upgrade', (request: any, socket: any, head: any) => {
webSocketServer.handleUpgrade(request, socket, head, (websocket: any) => {
let userID: any;
console.log('establishing websocket connection...');
websocket.send('plz send ID');
websocket.on('message', (message: any): any => {
if (JSON.parse(message).userId) {
userID = JSON.parse(message).userId;
if (!webSockets[userID]) {
console.log('preparing websocket user...');
webSockets[userID] = websocket;
}
console.log(`connected: ${userID}`);
}
});
websocket.on('close', (eventCode: any): any => {
if (eventCode === 1006) {
console.log('Websocket disconnected abnormally');
}
if (eventCode === 1000) {
console.log('Websocket successfully closed normally');
delete webSockets[userID];
console.log(`deleted: ${userID}`);
}
});
});
});