使用 JWT 管理多个设备节点 js 的用户会话
Posted
技术标签:
【中文标题】使用 JWT 管理多个设备节点 js 的用户会话【英文标题】:managing user sessions for multiple devices node js using JWT 【发布时间】:2016-12-28 22:42:27 【问题描述】:我正在制作一个使用 JWT 维护会话的应用程序。当任何新用户注册时,我会向用户提供 JWT 令牌并将其存储在我的数据库以及用户浏览器中。当用户注销时,我会从浏览器和我的数据库中删除该令牌。
但是我希望如果用户从多个设备登录,那么它将从一个设备注销,它也不会从其他设备注销。我如何实现这一目标?
【问题讨论】:
Invalidating JSON Web Tokens的可能重复 【参考方案1】:首先,JWT 不应该能够“注销”,而是自动过期,这就是为什么你应该设置短 expiresIn
次。
这是因为使用 JWT,会话由客户端处理,注销用户不是服务器的责任,只是用户丢弃了 JWT。
在您的情况下,我想您在允许用户之前检查您的数据库中是否存在 JWT,因此,您只需要搜索并删除与该帐户关联的其他 JWT。 但是,如果您想让事情变得干净,请采用 JWT 逻辑:只需设置较短的生命周期,然后等待它们过期。
【讨论】:
那么我应该将令牌存储在我的数据库中吗? 最好不要,但如果出于某种原因您更愿意存储它们,我为您提供了一种“注销”其他设备的方法。 使用 JWT,会话存储在 JWT 中。如果您需要经常更改会话的数据,JWT 不太适合,它们更适合 REST API。 好的,我明白了,你是说,我应该为不同的登录设备制作不同的令牌,当用户注销时,我应该删除该特定设备的令牌。如果他决定退出所有设备,则必须删除所有令牌 实际上我为所有设备制作了相同的令牌,因此当用户从一台设备注销时,他也会自动从其他设备注销。【参考方案2】:只需在数据库中使用一组标记。每个设备在令牌数组中都有自己的令牌(当用户首次从新设备登录时,每个令牌都添加到 db 中),当用户从该设备注销时,只有令牌数组中的关联令牌被删除。这是用户模式的示例:
var userSchema = new mongoose.Schema(
name:
type: String,
require: true,
trim: true
,
.
.
.
tokens: [
token:
type: String,
required: true
],
timestamps: true
);
【讨论】:
以上是关于使用 JWT 管理多个设备节点 js 的用户会话的主要内容,如果未能解决你的问题,请参考以下文章
Springboot + JWT +OAuth2 + AngularJS 无状态会话