【问题标题】:managing user sessions for multiple devices node js using JWT使用 JWT 管理多个设备节点 js 的用户会话
【发布时间】:2016-12-28 22:42:27
【问题描述】:

我正在制作一个使用 JWT 维护会话的应用程序。当任何新用户注册时,我会向用户提供 JWT 令牌并将其存储在我的数据库以及用户浏览器中。当用户注销时,我会从浏览器和我的数据库中删除该令牌。

但是我希望如果用户从多个设备登录,那么它将从一个设备注销,它也不会从其他设备注销。我如何实现这一目标?

【问题讨论】:

标签: node.js session jwt


【解决方案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
  }
);

【讨论】:

    猜你喜欢
    • 2018-06-21
    • 2011-03-24
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 2022-01-03
    • 2015-01-13
    相关资源
    最近更新 更多