在将连接升级到WebSocket之前,通过JWT对用户进行身份validation

我使用这个库的服务器上使用节点v8.6.0。 我不会使用Socket.io。

我希望用户通过GET请求发送(即通过自定义头)一个JWT,然后这个请求会被拒绝(他们没有被授权),并且阻止一个websocket被build立,或者在他们发送一个有效的智威汤逊,我想GET请求被升级到一个websocket。

axios.get('http://localhost:3001/upgrade', { headers: { Authorization: 'bearer jwtGoesHere', Upgrade: 'websocket', Connection: 'Upgrade', 'Sec-WebSocket-Key': 'dGhlIHNhbXBsZSBub25jZQ==', 'Sec-WebSocket-Version': 13 } }) 

但是,没有办法发送自定义标题。 如果我尝试发送所需的标题升级到websocket,我得到一个错误: Refused to set unsafe header 。 环顾networking,我发现当尝试build立websocket连接时,有两种方法可以发送某种信息: 这个和这个 。 然而,他们对我或者至less是非标准的解决scheme似乎有点不好意思(通过这种方式发送智威汤逊可以吗?)。

目前,这就是我的代码在服务器上的样子(使用TypeScript):

  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}`); } }); }); }); 

而在客户端,我只是使用本机WebSocket。