阻止特定用户JWT令牌?

时间:2016-06-20 12:06:43

标签: session redis jwt

假设用户多次从不同设备登录,然后他们决定要退出 设备 ,我们无法删除 JWT 是否已提供给该设备?

这是我实施的内容,我不确定这是其他网站是如何做到的,或者它是否是一种体面的方式。

  1. 用户登录
  2. 我创建了一个redis会话令牌,其中包含与之关联的userId +设备名称
  3. 我将此redis令牌存储为 JWT
  4. 的主题
  5. 我传回 JWT
  6. 现在用户已经 JWT ,他们现在可以访问安全的api端点。假设用户想删除此 会话 ,这就是我所做的。

    1. 用户为特定的userId提取* redis会话令牌(当然他们需要一个有效的jwt来获取此数据)
    2. 他们选择要销毁的 redis会话 令牌。
    3. 他们将该令牌发送到/destroy/{token}端点
    4. 使用该标记作为主题的jwt将不再起作用。
    5. 这样做意味着每次请求时,我都要反编译jwt,获取redis令牌,看看它是否仍然存在。我想使用redis或内存DB中的任何其他内容都不是很昂贵的待办事项。

      这是一种坚实/有效的方法吗?有没有更好/更简单的方法呢?

1 个答案:

答案 0 :(得分:2)

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

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

这给了我两个好处:

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

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

所有这些检查(使用Redis作为数据库)只需不到10毫秒。

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

希望它有所帮助!