JSON Web Token 过期时间

18
大多数 JWT(JSON Web Token)教程(例如: 这个这个)都说,一旦验证成功,您可以使用传入的令牌获取客户端信息,而无需从数据库进行验证。
我的问题是,那么如何维护无效用户的情况呢?我的意思是,假设一个客户端刚刚获得了一个一周后过期的 JWT 令牌。但是由于某种非常特殊的原因,我们决定使该用户失效,并且不希望其访问我们的 API。但是该用户仍然有一个有效的令牌,可以访问 API。
当然,如果我们对每个请求都进行一次数据库往返以验证账户是否有效或无效,则可以解决此类问题。我的问题是,对于长期存活的令牌,最好的处理方式是什么。
谢谢。
4个回答

7

如果不是不可能的话,撤销基于JWT的访问令牌很困难。

访问令牌应该如何表示?有两种主要方式。

  1. 作为无意义的随机字符串。与访问令牌相关的信息存储在授权服务器后面的数据库表中。
  2. 作为自包含的字符串,这是通过使用base64url或类似方法对访问令牌信息进行编码的结果。

在这些方式之间选择将导致如下表格所述的差异。

enter image description here

请参阅《OAuth和OpenID Connect的全新实现者谈论发现》中的“7.访问令牌”,了解访问令牌表示方式的优缺点。
如果您的访问令牌基于JWT,则您的系统必须(1)记住吊销的访问令牌直到它们过期。另一个折衷方案是(2)使访问令牌的生命周期足够短,并放弃吊销它们
个人经过考虑,在我实现授权服务器(Authlete)时,我没有选择JWT作为访问令牌表示,因为一旦发行后,很难/不可能吊销和更新基于JWT的访问令牌。

0

RFC 7009 规定了OAuth 2.0 Token Revocation。基本上,您可以通过端点撤销访问令牌。


1
你可以拥有一个撤销访问令牌的端点,但我的问题是如何知道要撤销哪个访问令牌?因为我们没有往返到数据库。 - Jahid Shohel

0

从你的问题中无法确定你使用的是哪种OAuth流程,或者你是否指的是OpenID Connect而不是OAuth。

考虑使用刷新令牌,并将访问令牌的过期时间缩短 - 例如30分钟。

在这种情况下,用户(资源所有者)不必保持身份验证,您的API(资源服务器)也不必在每个请求上检查用户是否仍然有效。

一旦访问令牌过期,您的客户端(调用您的API的应用程序)应该联系您的DB(授权服务器),并交换其刷新令牌以获取新的访问令牌 - 通常还会提供新的刷新令牌 - 前提是用户仍然是您的DB上的有效用户,并且用户未撤销客户端应用程序对其在API上的数据的访问权限。

如果您的授权服务器允许,您还可以像另一个答案建议的那样使用令牌吊销,但我建议尝试使用刷新令牌和短期访问令牌,因为这样更容易实现,并且不会使您的API混杂着用户身份验证/授权问题 - 这项工作最好由Auth服务器完成。


iandayman:关于它使用的OAuth流程,您可以在JWT规范中找到(链接在主帖中给出)。我想知道的是,在现实生活中如何解决这个问题。我的意思是,从FB获取的令牌有效期为一年。现在,如果我的帐户在一周后被删除,则该令牌不应该有效期为一年。我的问题是,如何进行此检查(用户是否存在或有效),而不必往返于数据库? - Jahid Shohel

0

当你使用JWT时,这就是主要问题。因此,在这种情况下,最好的方法是在网关上创建黑名单。从安全角度来看,这不是最佳解决方案,但如果你正在使用JWT,这是唯一的好解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接