Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Session 阻止特定用户JWT令牌?_Session_Redis_Jwt - Fatal编程技术网

Session 阻止特定用户JWT令牌?

Session 阻止特定用户JWT令牌?,session,redis,jwt,Session,Redis,Jwt,假设一个用户从不同的设备多次登录,然后他们决定退出设备a,我们无法删除提供给该设备的JWT,对吗 这就是我所实现的,我不确定其他网站是这样做的,还是这样做是一种体面的方式 用户登录 我创建了一个redis会话令牌,它具有与之关联的userId+设备名 我将此redis令牌存储为JWT的主题 我传回JWT 既然用户有了JWT,他们现在就可以访问安全的api端点了。假设用户想要删除此会话,下面是我所做的 用户获取特定用户ID的*redis会话令牌(当然,他们需要有效的jwt来获取此数据) 他们选择要

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

这就是我所实现的,我不确定其他网站是这样做的,还是这样做是一种体面的方式

  • 用户登录
  • 我创建了一个redis会话令牌,它具有与之关联的userId+设备名
  • 我将此redis令牌存储为JWT的主题
  • 我传回JWT
  • 既然用户有了JWT,他们现在就可以访问安全的api端点了。假设用户想要删除此会话,下面是我所做的

  • 用户获取特定用户ID的*redis会话令牌(当然,他们需要有效的jwt来获取此数据)
  • 他们选择要销毁的redis会话令牌
  • 他们将该令牌发送到
    /destroy/{token}
    端点
  • 使用该标记作为主题的jwt将不再工作
  • 这样做意味着每次请求时,我都必须对jwt进行反编译,获取redis令牌,并查看它是否仍然存在。我想使用redis或任何其他内存中的DB来做这件事一点也不贵


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

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

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

    这给了我两个好处:

    • 我现在可以使用有效的JWT从任何设备注销用户(它不需要完全相同的JWT,只需要是该用户的JWT)
    • 使“注销除此之外的所有会话”的实现成为可能
    就速度而言,我们开发的应用程序每秒接收数百个请求。 这些请求中有90%以上需要授权,这意味着检查JWT在语法上是否有效,检查数据库是否存在,最后检查是否过期

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

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


    希望有帮助

    很高兴听到别人和我的想法一样。所以你实际上没有创建redis会话令牌并将其存储在JWT中,你实际上只是将整个JWT存储在redis缓存中,这很有趣。我曾想过这样做,但得出的结论是,使用会话令牌并验证每个请求的有效性将给我带来额外的免费好处。当我有时间的时候,很高兴在问题中列出它们。@Franco感谢你分享你的方法,确实很有帮助:)不过,我想知道,你是如何获得DeviceName的(它是类似于计算机、iPhone等的东西,还是除了基本字符串之外还有什么额外的东西)?设备检测是否发生在服务器端?你推荐什么套餐?很抱歉问了这么多问题,但这将帮助我和其他人:)@franco这不违背JWT的目的吗?使用JWT的全部意义在于,我可以在不使用服务器往返的情况下验证它,现在往返又回到了游戏中。如果我理解正确,您的方法也适用于不透明令牌,而不是特定于JWT。在这种设置中,您是使用刷新令牌还是仅使用JWT访问令牌?