如果同一用户从不同的浏览器或计算机登录,则强制注销.Node.js + Express + Socket.IO

Amo*_*rni 2 authentication logout node.js express socket.io

场景:考虑一个与用户名和密码匹配的登录系统(Node.js + Express + Socket.IO),并允许用户访问经过身份验证的页面.登录系统将会话ID存储为客户端的cookie,并在服务器上对每个经过身份验证的页面请求进行验证,并相应地允许/禁止.

问题:现在,假设同一用户从不同的机器或浏览器登录,我希望以前的用户推送到会话过期页面并显示信息,例如:"您可能从不同的浏览器或机器登录.请不要分享密码.欲了解更多信息,请访问:SomeLinkHere"

注意:我只是不想让用户登录会话无效,当用户从其他浏览器或机器登录时,我想将用户推送到会话过期页面,即使用户没有点击任何链接或请求任何进一步的身份验证页面.

这背后的主要目的是:避免这样的情况,例如:"如果用户正在观看一些敏感数据,例如实时报告(即socket.io上的仪表板),并将密码分享给其他人."

问题:由于socket.io已经用于报告实时数据,如何在不重载现有socket.io连接的情况下实现这一点?

mit*_*esh 5

这可以使用.

  1. 由于应用程序中的用户已通过身份验证,而客户端进行连接时,他们还会通过connect Function调用传递userid(或任何其他唯一标识符).喜欢:

    socket.on('connect', function(){
      socket.emit('adduser', userID);
    });
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在服务器上保留一个JSON数组,用于保持与用户信息关联的套接字.喜欢:

    [{'USERID1':'SOCKETID1'},{'USERID2':'SOCKETID2'}....,{'USERIDN':'SOCKETIDN'}]
    
    Run Code Online (Sandbox Code Playgroud)
  3. 当新用户执行套接字连接时,我们检查用户ID是否已存在于数组中.喜欢

    socket.on('adduser', checking function here);
    
    Run Code Online (Sandbox Code Playgroud)
  4. 如果它已经存在,那么强制现有的断开连接并用新的SSONetid更新JSON数组中的socketid.

    这是一个参考