【问题标题】:Blocking specific user JWT tokens?阻止特定用户 JWT 令牌?
【发布时间】:2016-10-21 16:33:12
【问题描述】:

假设用户从不同设备多次登录,然后他们决定退出设备a,我们无法删除 JWT 是提供给那个设备的吧?

这是我已经实现的,我不确定其他网站是否这样做,或者这是一种体面的方式。

  1. 用户登录
  2. 我创建了一个 redis 会话令牌,它具有与之关联的 userId + 设备名称
  3. 我将此 redis 令牌存储为 JWT 的主题
  4. 我将 JWT 传回。

现在用户有了 JWT,他们现在可以访问安全的 api 端点。假设用户想要删除此 会话,这就是我所做的。

  1. 用户获取特定 userId 的 * redis 会话令牌(当然,他们需要有效的 jwt 来获取此数据)
  2. 他们选择要销毁的 redis 会话令牌。
  3. 他们将该令牌发送到/destroy/{token} 端点
  4. 使用该令牌作为主题的 jwt 将不再起作用。

这样做意味着对于每个请求,我都必须反编译 jwt,获取 redis 令牌,然后查看它是否仍然存在。我想这对于使用 redis 或任何其他内存数据库来说并不昂贵。

这是一种可靠/有效的方法吗?有没有更好/更简单的方法来做到这一点?

【问题讨论】:

  • 通过此设置,您是完全使用刷新令牌还是仅使用 JWT 访问令牌?

标签: session redis jwt


【解决方案1】:

在几个应用程序中实现 JWT 身份验证/授权时,我也有同样的问题,如果不是非常相似的话,我也得到了相同的解决方案:

在我的例子中,我会将 JWT + UserID + DeviceName 存储在数据库中,然后我会有一个 HTTP 请求 DELETE /logout/DeviceName 带有标题 Authorization: JWTGoesHere

这给了我两个好处:

  • 我现在可以使用有效的 JWT 从任何设备上注销用户(它不需要是完全相同的 JWT,它只需要是 那个 用户的 JWT)。
  • 可以实现“注销除此之外的所有会话”。

在速度方面,我们开发的应用程序每秒接收数百个请求。 超过 90% 的请求需要授权,这意味着检查 JWT 在语法上是否有效,检查数据库是否存在,最后但并非最不重要的是检查它是否已过期。

所有这些检查(使用 Redis 作为数据库)花费的时间不到 10 毫秒。

底线是:对其进行基准测试,如果不需要很长时间,则不需要任何优化。

希望对你有帮助!

【讨论】:

  • 很高兴听到其他人的想法和我一样。所以你实际上并没有创建一个 redis 会话令牌并将其存储在 JWT 中,你实际上只是将整个 JWT 存储在一个 redis 缓存中,这很有趣。我正在考虑这样做,但得出的结论是,使用会话令牌并验证每个请求的有效性将为我免费提供一些额外的好处。当我有时间时,很高兴在问题中列出它们。
  • @Franco 感谢您分享您的方法,确实有帮助:) 我想知道,您如何获得 DeviceName(它是像计算机、iPhone 等之类的东西。还是它有什么除了基本字符串之外还有额外的)?设备检测是否发生在服务器端?你推荐什么包?抱歉所有问题,但这将对我和其他人有所帮助:)
  • @franco 这不与 JWT 的目的相矛盾吗?使用 JWT 的全部意义在于我可以在没有服务器往返的情况下验证它,现在往返又回到了游戏中。如果我理解正确,您的方法也适用于不透明的令牌,并且不适用于 JWT。
猜你喜欢
  • 2021-02-24
  • 2020-10-20
  • 2021-03-03
  • 1970-01-01
  • 2020-06-02
  • 2020-01-15
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多