1

我是 JWT 的新手,想知道当用户退出应用程序时是否可以在服务器端使 JWT 无效/无效(我也想知道这样做是否有意义!)。想法是:

  1. 用户在其应用中单击退出链接
  2. 应用程序调用 POST https://api.myapp.example.com/auth/invalidate
  3. JWT(它是 HTTP 请求标头中的授权/承载令牌)以某种方式无效
  4. 现在,没有人可以再次使用那个 JWT

我不确定这是否是一种非正统的注销逻辑方法,或者即使在用户注销之后,让 JWT 仍然有效是否可以接受(我想我可以将 JWT 的有效期缩短到,比如说,60 分钟或其他时间)。

再说一遍:想知道是否可以使用 JJWT 进行这种“无效”(如果可以,怎么做?!)以及这样做是否有意义(如果没有,典型的注销流程是什么样的?!)。谢谢!

4

3 回答 3

1

您不会使 JWT 无效,JWT 是不可变的。令牌的有效性取决于到期时间和签名密钥,在严重的安全事件中,您可以更改签名密钥,然后已经颁发的令牌将失效。您也可以在数据库中使用令牌黑名单,但这将花费另一次访问数据库的费用,如果您使用它,身份验证流程将不再是无状态的。

一旦用户退出,则必须从存储令牌的客户端删除令牌,通常令牌的存储是浏览器的一个cookie或一个。localStorage

于 2018-07-10T19:38:52.733 回答
1

其他答案是正确的,因为您通常不需要注销/无效端点。用户从您的应用程序中退出意味着您只需从本地存储中删除他/她的令牌。

但是,如果您仍决定实施令牌失效端点,则可以通过跟踪包含失效令牌 ID 的“黑名单”来实现:

  • 当用户调用端点时,您将令牌的 ID 添加到黑名单中。
  • 对于每个经过身份验证的请求,您首先检查令牌的 ID 是否包含在黑名单中并相应地拒绝访问。
  • 确保自动清理旧/过时的黑名单条目,并且不会占用您的内存。
  • 但是,还要确保黑名单的条目time-to-live至少与令牌的有效期一样长。

对于实现,您不一定需要数据库,您可以使用内存中的自过期映射,如 fi guava 的 CacheBuilder此线程中讨论的替代方案之一。

于 2018-07-10T20:15:30.140 回答
0

这是 JWT 的核心缺点之一——它们是自包含的令牌,这意味着没有固有的方法可以使它们失效。最多,您可以创建一个令牌 ID ( UUID.randomUUID()) 并尝试维护一个撤销列表,但随后您又需要 JWT 应该让您摆脱的大部分基础设施。

于 2018-07-10T19:17:38.977 回答