2

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

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

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

这背后的主要意图:为了避免出现以下情况,例如:“如果用户正在观看一些敏感数据,例如实时报告(即socket.io上的仪表板)并将他的密码分享给其他人。”

问题:既然 socket.io 已经用于实时数据上报,如何在不重载现有 socket.io 连接的情况下实现呢?

4

1 回答 1

5

这可以使用来完成。

  1. 由于应用程序中的用户经过身份验证,当客户端进行连接时,它们还会通过 connect 函数调用传递用户 ID(或任何其他唯一标识符)。像:

    socket.on('connect', function(){
      socket.emit('adduser', userID);
    });
    
  2. 在服务器上保留一个 JSON 数组,用于保存与用户 ID 信息相关联的套接字。像:

    [{'USERID1':'SOCKETID1'},{'USERID2':'SOCKETID2'}....,{'USERIDN':'SOCKETIDN'}]
    
  3. 当新用户进行套接字连接时,我们检查用户 ID 是否已经存在于数组中。像

    socket.on('adduser', checking function here);
    
  4. 如果它已经存在,则强制现有的断开连接并使用新的更新 JSON 数组中的 socketid。

    这是一个参考

于 2013-03-05T09:59:41.357 回答