2017-05-31 182 views
8

大多数JWT(JSON Web令牌)教程(例如:thisthis)都表示,验证后,您可以使用传入令牌获取客户端信息,而无需从数据库验证它。JSON Web令牌到期

我的问题是,用户情况如何保持无效呢?我的意思是,可以说一个客户刚刚得到一个在一周内到期的JWT令牌。但出于非常具体的原因,可以说我们决定让用户无效,并且不希望用户访问我们的API。但仍然该用户有一个有效的令牌,用户可以访问该API。

当然,如果我们为每个请求往返DB,那么我们可以验证该帐户是有效还是无效。我的问题是,对于长寿命的令牌来说,处理这种情况的最好方法是什么?

在此先感谢。

回答

0

RFC 7009指定OAuth 2.0令牌撤销。基本上你有一个可以撤销access_tokens的端点。

+1

你可以有一个端点来撤销访问令牌,但我的问题是你如何知道撤销哪个访问令牌?由于我们没有前往数据库。 –

0

您不清楚您使用的OAuth流程来自您的问题,还是您指的是OpenID Connect而不是Oauth。

考虑使用刷新令牌并在访问令牌上有一个更短的到期时间 - 例如, 30分钟。

在这种情况下,用户(resource owner)不必保持身份验证,并且您的API(Resource Server)不必检查用户在每个请求中仍然有效。

一旦访问令牌到期,您的client(调用您的API的应用程序)应联系您的数据库(Authorisation Server)并交换其刷新令牌以获取新的访问令牌 - 通常为新的令牌刷新 - 提供用户仍然有效用户在您的数据库中,并且用户尚未撤销客户端应用程序访问其API数据的权限。

如果您的授权服务器允许,您也可以使用另一个答案中建议的令牌撤销,但我会尝试刷新令牌和短期访问令牌,因为它更容易实现,并且不会污染您的API以及用户验证/授权问题 - 这项工作最好由Auth服务器完成。

+0

iandayman:关于使用哪种OAuth流程,您可以在JWT规范中找到它(链接在主文章中给出)。 我想知道的是,它是如何在现实生活中得到解决的。我的意思是来自FB我得到一个有效期为一年的令牌。现在,如果我的帐户在一周后被删除,那么令牌不应该有效一年。 我的问题是,如何进行此检查(如果用户存在或有效)而无需往返DB? –

0

这是使用智威汤逊时的主要问题。所以基本上最好的方法就是在网关上创建黑名单。从安全的角度来看,这不是最好的解决方案,但如果您使用JWT,这只是一个很好的解决方案。

3

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

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

  1. 作为一个没有意义的随机字符串。与访问令牌关联的信息存储在授权服务器后面的数据库表中。
  2. 作为一个自包含的字符串,它是由base64url或类似的东西编码访问令牌信息的结果。

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

enter image description here

“7.访问令牌”Full-Scratch Implementor of OAuth and OpenID Connect Talks About Findings的优点和访问令牌表示的方式利弊。

如果您的访问令牌是基于JWT的,您的系统必须(1)记得撤销访问令牌,直到它们到期。另一个折衷方案是(2)使访问令牌的生命周期足够短并放弃撤回它们

就我个人而言,在考虑之后,我在实施授权服务器(Authlete)时没有选择JWT作为访问令牌表示法,因为一旦发布它们就很难/不可能撤销和更新基于JWT的访问令牌。