Session 阻止特定用户JWT令牌?
假设一个用户从不同的设备多次登录,然后他们决定退出设备a,我们无法删除提供给该设备的JWT,对吗 这就是我所实现的,我不确定其他网站是这样做的,还是这样做是一种体面的方式Session 阻止特定用户JWT令牌?,session,redis,jwt,Session,Redis,Jwt,假设一个用户从不同的设备多次登录,然后他们决定退出设备a,我们无法删除提供给该设备的JWT,对吗 这就是我所实现的,我不确定其他网站是这样做的,还是这样做是一种体面的方式 用户登录 我创建了一个redis会话令牌,它具有与之关联的userId+设备名 我将此redis令牌存储为JWT的主题 我传回JWT 既然用户有了JWT,他们现在就可以访问安全的api端点了。假设用户想要删除此会话,下面是我所做的 用户获取特定用户ID的*redis会话令牌(当然,他们需要有效的jwt来获取此数据) 他们选择要
/destroy/{token}
端点这是一种可靠/有效的方法吗?有没有更好/更简单的方法可以做到这一点?在几个应用程序中实施JWT身份验证/授权时,我也遇到了同样的问题,并得出了相同的解决方案(如果不是非常相似的话): 在我的例子中,我将把JWT+UserID+DeviceName存储在数据库中,然后我将有一个HTTP请求
DELETE/logout/DeviceName
带有标题授权:jwtgoesher
这给了我两个好处:
- 我现在可以使用有效的JWT从任何设备注销用户(它不需要完全相同的JWT,只需要是该用户的JWT)李>
- 使“注销除此之外的所有会话”的实现成为可能
希望有帮助 很高兴听到别人和我的想法一样。所以你实际上没有创建redis会话令牌并将其存储在JWT中,你实际上只是将整个JWT存储在redis缓存中,这很有趣。我曾想过这样做,但得出的结论是,使用会话令牌并验证每个请求的有效性将给我带来额外的免费好处。当我有时间的时候,很高兴在问题中列出它们。@Franco感谢你分享你的方法,确实很有帮助:)不过,我想知道,你是如何获得DeviceName的(它是类似于计算机、iPhone等的东西,还是除了基本字符串之外还有什么额外的东西)?设备检测是否发生在服务器端?你推荐什么套餐?很抱歉问了这么多问题,但这将帮助我和其他人:)@franco这不违背JWT的目的吗?使用JWT的全部意义在于,我可以在不使用服务器往返的情况下验证它,现在往返又回到了游戏中。如果我理解正确,您的方法也适用于不透明令牌,而不是特定于JWT。在这种设置中,您是使用刷新令牌还是仅使用JWT访问令牌?