authentication - 限制可以登录网站的用户设备的最佳方法是什么
问题描述
我正在用 Express 和 React 开发一个网站。我想限制每个用户最多登录 3 台设备。
起初,我试图找到获取Mac地址的方法,但我无法在浏览器中获取它。
所以下一次,我尝试为 cookie 生成一个随机字符串,每当更改它时,将其存储在数据库中,然后当我超过 3 行时,触发事件告诉用户无法登录。但在这种情况下,有一个缺点。如果用户手动清除 cookie 或更改浏览器,我无法检测到用户从一台设备登录。当然,我通过 crypto-js 对数据进行加密,这样用户就无法更改它,如果他这样做了,浏览器会生成一个新的 cookie。
let device = null;
try{
device = JSON.parse(CryptoJS.AES.decrypt(cookies.data, SECRET).toString(CryptoJS.enc.Utf8)).device;
}
catch{
console.log("JSON Parse error!");
// make a new string and store in cookie
device = randomString.generate(16);
const data = {device : device, createDate: new Date()}
setCookie('data', CryptoJS.AES.encrypt(JSON.stringify(data), SECRET).toString());
}
任何人都可以帮助我吗?请告诉我一个限制用户登录设备的好方法。谢谢。
解决方案
无论您保存在浏览器中要跟踪的任何数据,都可以由用户删除。无论是 cookie、本地存储还是索引数据库。因此,您需要一种机制来跟踪设备或实例。一个设备可以有多个浏览器,用户可以同时使用不同的浏览器。
如果您注意到 Gmail 中的一项功能,我们可以尝试类似的想法。Gmail 可以显示所有打开的会话,它允许踢出任何会话。他们是怎么做到的呢?
他们正在使用 Web Sockets。ASP.NET SignalR 或 Socket.IO 可用于此目的。
聊天应用程序使用网络套接字。当你打开你的应用程序时,它会连接到服务器,就像聊天一样,只有一个人可以控制实例。
我相信您需要网络套接字才能正确使用此功能。
推荐阅读
- python - 将字典项添加到列表并将具有相同键的值附加到较新的列表项
- robotframework - 库中的机器人框架关键字名称更改
- gruntjs - Grunt wont watch less
- serverless-framework - serverless framework and use key management service (KMS)
- c# - URI 中的版本不受支持的 API 版本——出了什么问题?
- ruby-on-rails - 提交表单时弹出/模态框,取决于表单中输入了什么信息
- html - How to use image inside a div without moving the other elements
- sql - How to handle getting a list of unique customers per product grouping
- python-3.x - How to train/extend an nltk vocabulary in a non-English language
- amazon-web-services - How to generate ListnerCertificate CertificateArn in loadbalancer