使用 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 的用户会话的主要内容,如果未能解决你的问题,请参考以下文章

Node js、JWT 令牌和背后的逻辑

Springboot + JWT +OAuth2 + AngularJS 无状态会话

谷歌分析会话范围的字段返回多个值

使用节点 js、AngularJs 和 JWT 使用用户名和密码进行身份验证

使用jwt完成sso单点登录

节点js jwt认证