首页 > 解决方案 > ReactJS - 什么而不是 JWT 来保持会话

问题描述

一段时间以来,我一直在根据本教程编写应用程序:

https://jasonwatmore.com/post/2019/04/06/react-jwt-authentication-tutorial-example

我的应用程序已经开发了很多,它使用了其他的 REST API 服务器等。目前,经过积极的身份验证后,一个 JWT 令牌被发送到客户端,该令牌存储在 localStorage 中。但!我需要添加这样的功能:假设一次只有一个用户可以使用一个帐户。

有两种解决方案:a)当用户登录时,他在另一个设备/浏览器上登录后在之前的地方注销。b)当用户尝试登录另一个设备/浏览器时,例如“客户端已经登录”

所以,据我所知,我不能使用 JWT 来做到这一点。我的问题是:

我可以用什么代替 JWT 来处理会话,因为我认为它是关于什么的?谢谢。

编辑:我在服务器端的身份验证功能:

async function authenticate({ username, password }) {
console.log(username + " " + password);
const user = await User.findOne({ username });
if (user && bcrypt.compareSync(password, user.hash)) {
    const { hash, ...userWithoutHash } = user.toObject();
    const token = jwt.sign({ sub: user.id }, config.secret, { expiresIn: 300 });
    return {
        ...userWithoutHash,
        token
    };
}

}

标签: javascriptreactjsauthenticationsession

解决方案


您可以使用更传统的基于会话 ID 的身份验证方法。当用户登录时,会生成一个会话 ID(类似于 UUID)。然后,使用用户 ID 作为键,会话 ID 存储在服务器上的哈希图中。在所有后续登录尝试中,映射中的会话 ID 将被同一用户覆盖。

出于可用性原因,我建议在后续登录期间退出任何其他会话。想象一下从某个设备登录到您的应用程序,但突然被拉到某个地方开会。现在,如果我们在登录期间不踢掉之前的会话,那么您从其他设备登录的任何尝试都会失败,您将被迫等待才能登录。

请注意,一旦新会话 ID 记录在哈希图中,第一个设备使用旧会话 ID 进行的任何访问尝试都将失败。


推荐阅读