pra*_*nav 1 spring spring-security jwt spring-boot
我们正在尝试为基于Spring REST的应用程序遵循此代码库。 弹簧靴jwts
问题是我们无法从服务器注销期间删除JWT令牌。当我们在网上检查时,我们才知道唯一的解决方法是将此JWT令牌列入黑名单。是这样吗?
我们是基于令牌的身份验证的新手,请告诉我们是否存在诸如在注销调用中使令牌过期之类的解决方案。
长话短说short,您必须建立一种manually在注销时删除令牌或使令牌无效的机制。
您应该问自己的问题是
上面的问题将不一定解决您的logout问题,因为您仍然需要一种机制来invalidate存储或不存储在中的令牌database。
not storing数据库中令牌的好处之一是您无需担心deleting它们(无需维护或某些清理过程)
password流量,我们别讨论其他flows角色),并且权限在数据库中已降级或升级,因此jwt中的内容已过时我确定您使用的是verify端点,其目的是验证令牌是否存在,valid但是不必检查上述所有情况,这意味着您必须
verify工作流程以添加更多custom checks或verified用于signature validity,expiry time和其他令牌之前,default checks您可以自己运行custom checks,如果custom checks通过,则继续进行you shall not pass! 好吧,除了blacklisting你可以做以下的事情
只需将uniquely-identifying-metadataJWT令牌的密钥作为密钥存储到redis中,并为其提供一个expiry time与JWT令牌到期时间相同的时间,以便令牌到期self-destruct时使用。
set key {replace_with_jwt_unique_identifier} ex {jwt_expiry_timestamp}
Run Code Online (Sandbox Code Playgroud)
风险:Redis在内存中,并且条目不会保留。
不要使用Redis或不想冒险。您可以将数据库与自定义数据库表一起使用。一个单独的表是
ON DELETE CASCADE 发出令牌时,也会填充此新数据库表。
当normalJWT发出请求时,请使用JWT查询in-memory存储或database表以查看记录是否存在。如果有in-memory商店,简单的existence检查就足够了。如果database table您需要执行更多检查(即存在且未过期等),并且如果检查通过让请求通过,则否则you shall not pass!
当一个logout request进来时,在in-memory存储的情况下,只需删除key和继续(如果找到),在存储的情况下,database您可以删除JWT将级联到新表的记录。
好吧,你可以做到
verify端点工作流来执行这些额外的检查我使用的项目不需要使令牌失效,logout因此我不必跨过这座桥。我确实必须扩展verify端点以确保如果我的所有令牌custom checks都通过了,则令牌是有效的。
除了您指出的教程。还有其他一些SO问题也讨论了类似的问题。看到
如果JWT被盗怎么办?
如何在注销时销毁JWT?
更多如何删除JWT令牌?
更改密码后
如何使JWT失效Github问题-如何使JWT 最终失效
最后一个最好的-失效JWT Web令牌
我们遇到了类似的问题,并使用以下方法解决了它 -
现在,检查数据库中的请求 ID 成本很高,因此我们也使用内存缓存。
| 归档时间: |
|
| 查看次数: |
4769 次 |
| 最近记录: |