【发布时间】:2016-12-28 22:42:27
【问题描述】:
我正在制作一个使用 JWT 维护会话的应用程序。当任何新用户注册时,我会向用户提供 JWT 令牌并将其存储在我的数据库以及用户浏览器中。当用户注销时,我会从浏览器和我的数据库中删除该令牌。
但是我希望如果用户从多个设备登录,那么它将从一个设备注销,它也不会从其他设备注销。我如何实现这一目标?
【问题讨论】:
我正在制作一个使用 JWT 维护会话的应用程序。当任何新用户注册时,我会向用户提供 JWT 令牌并将其存储在我的数据库以及用户浏览器中。当用户注销时,我会从浏览器和我的数据库中删除该令牌。
但是我希望如果用户从多个设备登录,那么它将从一个设备注销,它也不会从其他设备注销。我如何实现这一目标?
【问题讨论】:
首先,JWT 不应该能够“注销”,而是自动过期,这就是为什么你应该设置短 expiresIn 次。
这是因为使用 JWT,会话由客户端处理,注销用户不是服务器的责任,只是用户丢弃了 JWT。
在您的情况下,我想您在允许用户之前检查您的数据库中是否存在 JWT,因此,您只需要搜索并删除与该帐户关联的其他 JWT。
但是,如果您想让事情变得干净,请采用 JWT 逻辑:只需设置较短的生命周期,然后等待它们过期。
【讨论】:
只需在数据库中使用一组标记。每个设备在令牌数组中都有自己的令牌(当用户首次从新设备登录时,每个令牌都添加到 db 中),当用户从该设备注销时,只有令牌数组中的关联令牌被删除。这是用户模式的示例:
var userSchema = new mongoose.Schema(
{
name: {
type: String,
require: true,
trim: true
},
.
.
.
tokens: [
{
token: {
type: String,
required: true
}
}
],
{
timestamps: true
}
);
【讨论】: