如何在不使用 websockets 加密的情况下在节点 js 中创建基本身份验证系统?

how to create a basic authentication system in node js without encryption using websockets?

使用 node.js 我一直在网上搜索创建简单客户端服务器模型的方法,在该模型中,客户端请求登录身份验证,同时在 json 中发送他们的信息。我看过很多关于该过程的文章和文档,但我看到的每个客户端服务器模型看起来都像这样:

服务器:

   const WebSocket = require('ws');

    // Set up server
    const wss = new WebSocket.Server({ port: 8080 });

    // Wire up some logic for the connection event (when a client connects) 
    wss.on('connection', function connection(ws) {

      // Wire up logic for the message event (when a client sends something)
      ws.on('message', function incoming(message) {
        console.log('received: %s', message);
      });

      // Send a message
      ws.send('Hello client!');
    });

客户:

// Create WebSocket connection.
const socket = new WebSocket('ws://localhost:8080');

// Connection opened
socket.addEventListener('open', function (event) {
    socket.send('Hello Server!');
});

// Listen for messages
socket.addEventListener('message', function (event) {
    console.log('Message from server ', event.data);
});

代码来自:Client-server communication in Node.js(upthecreek 的示例)

在上面的示例中,您将在客户端和服务器之间来回发送消息,但是如果我想将 json 作为“消息”(用户名和密码)从客户端发送到服务器怎么办?我如何让服务器知道: json 对象实际上是登录信息?(从我在示例中看到的,这个 websocket 模块中只有类型 'message' )我熟悉阻塞style ,我会在 client/server 之间发送消息并等待响应。像这样:

理想服务器:

  const WebSocket = require('ws');

    // Set up server
    const wss = new WebSocket.Server({ port: 8080 });

    // Wire up some logic for the connection event (when a client connects) 
    wss.on('connection', function connection(ws) {

      // Wire up logic for the message event (when a client sends something)
      ws.on('message', function incoming(message) {
        if (message) == "login"{ // if login was sent as the message type

            ws.on("credentials" , function check_credentials(json){ //wait on the user and password (blocking)
                //check credentials against database and update client
            })
        }
      });

      // Send a message
      ws.send('Hello client!');
    });

如您所见,服务器会阻止并等待用户的凭据与数据库匹配。我知道这可能不是一个有效的例子,只是目标。不散列和加密密码是个坏主意,但这只是为了理解目的。提前致谢。

有些库可以为您执行此操作,但最简单的方法 (imo) 是在您的消息中使用事件说明符。

客户

// do login
ws.send(JSON.stringify({t: 'login', username: 'username', password: 'password'}));

服务器

ws.on('message', function(message) {
  let data;
  try {
    data = JSON.parse(message);
  } catch {
    return;
  }
  switch(data.t) {
    case 'login': {
      // handle login and save state somewhere
      break;
    }
    case 'otherevent': {
      // Handle some other event
      break;
    }
  }
});