如何在nodejs聊天应用程序中防止同一用户多次登录?

时间:2013-03-10 21:16:46

标签: node.js express socket.io

我正在使用Socket.ioExpress来制作聊天应用程序。

聊天是匿名的,我不想在任何数据库中保存任何内容。我可以考虑检查用户的IP地址并阻止从同一IP地址再次登录,但我认为这不是一个好主意,因为人们在线使用共享IP地址。另一件事是会话ID,但即使用户从浏览器中的其他选项卡登录,这也会发生变化。没有使用任何数据库,有没有简单的方法可以做到这一点?最好不安装任何其他包/ lib?

2 个答案:

答案 0 :(得分:2)

express.session中间件使用基于cookie的会话,默认情况下只存储在内存中,而不是存储在数据库中。如果用户打开新选项卡,则基于cookie的会话不会更改。其他地方提到This article作为使用socket.io快速会话的一个很好的参考。一般情况下,您只需要在socket.io(sio.set('authorization', authCallback))中进行授权时检查会话,然而您的应用程序可以使用户连接到正确的房间。

更新(更具体地说明如何使用Cookie阻止用户)

// Var to save if the user is connected or not
var connectedUsers = [];

sio.authorization(function(data, next){
  var cookie = data.headers.cookie && data.headers.cookie.match(/auth=([^;]+)/);
  cookie = cookie && cookie[1] || null;

  if (cookie && connectedUsers.indexOf(cookie)){
    next(null, false);
  }
  else {
    connectedUsers.push(cookie);
    next(null, cookie);
  }
});

// Somewhere else
socket.on('disconnect', function (data) {
  var cookie = data.headers.cookie && data.headers.cookie.match(/auth=([^;]+)/);
  cookie = cookie && cookie[1] || null;

  if(cookie) {
    connectedUsers.splice(connectedUsers.indexOf(cookie), 1);
  }
});

这是获取cookie值的一种非常基本的方法,但它对我有用。请注意,我没有时间尝试这个解决方案,但原则应该有效。

答案 1 :(得分:2)

这就是我为我所做的工作。这与安德烈亚斯的回答没什么不同:

var MemoryStore = express.session.MemoryStore;
var sessionStore = new MemoryStore();
app.configure(function() {
    //app.use(express.logger());
    app.use(express.cookieParser());
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.session({ 
            store: sessionStore, 
            secret: 'someSecret',
            key: 'cookie.sid', maxAge: null }));
            });

var sessionID;
var sessionArray = new Array();
var sessionIDs = new Array();

在我的“登录”功能中,我有:

sessionArray = socket.handshake.headers.cookie.split(" ");
sessionID = sessionArray[0].split("express.sid=").pop();

if(sessionIDs.indexOf(sessionID) > -1) {
   io.sockets.socket(socket.id).emit('preventlogin', true);
}
else {
   sessionIDs.push(sessionID);
   // and do the rest
}

在'断开'我做:

var ind = sessionIDs.indexOf(sessionID);
sessionIDs.splice(ind, 1);