如何使命名空间仅对Socket.io中的登录用户可用?

时间:2018-12-14 02:47:46

标签: javascript websocket socket.io

所需的行为是:

  • 用户1登录,用户1进入名为“用户1”的名称空间。可以根据需要登录任意数量的设备。

  • User2,相同的处理。

  • User1和user2无法看到彼此的名称空间。

  • 任何数量的用户都应该能够这样做

一团糟,最好的还是惯用的方式是什么?或任何方式。如果有帮助,我正在使用Express-Session进行身份验证。

这是我到目前为止所拥有的。 “ socketio-auth”库是任何Websocket连接的中间件,而不管名称空间如何。但是那个lib不是必需的。只是想让它工作。

import { Server } from "http";
import socketio from "socket.io";
import socketioAuth from "socketio-auth";
const MongoStore = mongo(session);
dotenv.config({ path: ".env.example" });

// Create Express server
const app = express();

// Create new HTTP server for Websocket connections
const server = new Server(app);
const io = socketio(server);

server.listen(8080);

// Configure auth middleware for websocket\
socketioAuth(io, {
  authenticate: async (
    socket: SocketIO, 
    { username, password }: { username: string, password: string }, 
    callback: Function
  ) => {
    try {
      const user = db.findUser('User', { username }).exec();
      //inform the callback of auth success/failure
      if (!user) {
        throw new Error("User not found");
      }
      // socket.on(username, ())
      return callback(null, user.password === password);
    } catch (error) {
      return callback(new Error("User not found"));
    }
  },
  postAuthenticate: async (
    socket: SocketIO, 
    { username, password }: { username: string, password: string }
  ) => {
      // do some....thing
  }
});

0 个答案:

没有答案