Vue和Node WebSockets-如何在建立连接之前对用户进行身份验证?

时间:2020-05-04 19:16:34

标签: node.js http vue.js websocket electron

在客户端应用程序可以成功建立与Node服务器(例如,Electron应用程序)的连接之前进行检查的最佳方法是什么。

建议从websocket / ws库中的

Ipinca 建议使用server.on('upgrade',...)事件侦听器,但是使用此方法,我们只能检查客户端当前发送的数据。

const http = require('http');
const WebSocket = require('ws');

const server = http.createServer();
const wss = new WebSocket.Server({ noServer: true });

wss.on('connection', function connection(ws, request, ...args) {
  // ...
});

server.on('upgrade', async function upgrade(request, socket, head) {
  // Do what you normally do in `verifyClient()` here and then use
  // `WebSocketServer.prototype.handleUpgrade()`.
  let args;

  try {
    args = await getDataAsync();
  } catch (e) {
    socket.destroy();
    return;
  }

  wss.handleUpgrade(request, socket, head, function done(ws) {
    wss.emit('connection', ws, request, ...args);
  });
});

server.listen(8080);

但是,如果我们要检查用户是否已经通过身份验证,而在这种情况下,我们不想再次对他进行身份验证,该怎么办?在打开WebSocket连接进行这些检查之前,我们是否需要发送一些http请求,并且将Ws和Http协议使用相同的端口是一种好习惯吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

如果用户通过身份验证但建立新连接,此代码可帮助您建立连接。 我认为在你的情况下,如果用户已经通过身份验证,那么你会尝试做,如果没有,则建立连接,然后让他注册。

答案 1 :(得分:0)

如果您之前已经对用户进行了身份验证,并且他们携带了标识他们的 cookie,则您可以从 requestserver.on('upgrade'... 事件处理程序的 wss.on('connection'... 参数中访问该数据作为节点的 http.IncomingMessage 类的实例(或类似的东西,无论如何)。

您可以将请求对象本身或来自 request.headers.cookie 的 cookie 问题与您的身份验证解决方案(无论是中间件还是自行开发)一起使用,以验证用户应该能够继续,就像您在一个 HTTP 路由。