场景:考虑一个登录系统 ( Node.js + Express + Socket.IO ),它匹配用户名和密码并允许用户访问经过身份验证的页面。登录系统将 session ID 作为 cookie 存储在客户端,并在服务器上对每个经过身份验证的页面请求进行验证,并相应地允许/禁止。
问题:现在,假设同一用户从不同的计算机或浏览器登录,我希望以前的用户推送到 session 过期页面并显示信息,例如:“您可能从不同的浏览器或机器登录。请不要共享密码。有关更多信息,请访问:SomeLinkHere"
注意:我只是不想使用户登录 session 无效,当用户从不同的浏览器或计算机登录时,我想将用户推送到 session 过期页面,即使用户是不点击任何链接或请求任何进一步验证的页面。
这背后的主要意图:避免出现以下情况:“如果用户正在观看一些敏感数据,例如实时报告(即 socket.io 上的仪表板)并共享其密码给其他人。”
问题:由于socket.io已经用于报告实时数据,如何在不使现有socket.io连接重载的情况下实现这一点?
最佳答案
这可以通过使用来完成。
当应用程序中的用户经过身份验证时,客户端在进行连接时也会通过 connect 函数调用传递用户 ID(或任何其他唯一标识符)。 喜欢:
socket.on('connect', function(){ socket.emit('adduser', userID); });
在服务器上保留一个 JSON 数组,用于保存与用户 ID 信息关联的套接字。 喜欢:
[{'USERID1':'SOCKETID1'},{'USERID2':'SOCKETID2'}....,{'USERIDN':'SOCKETIDN'}]
当新用户进行套接字连接时,我们检查用户 ID 是否已存在于数组中。 喜欢
socket.on('adduser', checking function here);
如果已经存在,则强制现有的断开连接 并将 JSON 数组中的 socketid 更新为新的。
这是一个reference
关于node.js - 如果同一用户从不同的浏览器或计算机登录,则强制注销。 Node.js + Express + Socket.IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15220324/