JSON Web令牌过期

时间:2017-05-31 09:23:08

标签: security spring-security oauth oauth-2.0 jwt

在大多数JWT(JSON Web Token)教程(例如:thisthis)上说,一旦经过验证,您可以使用传入令牌获取客户端信息,而无需从DB验证它

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

当然,如果我们为每个请求往返数据库,那么我们可以验证该帐户是有效还是无效。我的问题是,对于长期存在的令牌,这种情况的最佳方法是什么。

提前致谢。

4 个答案:

答案 0 :(得分:6)

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

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

  1. 作为无意义的随机字符串。与访问令牌关联的信息存储在授权服务器后面的数据库表中。
  2. 作为一个自包含的字符串,它是通过base64url或类似的东西对访问令牌信息进行编码的结果。
  3. 在这些方式之间进行选择将导致后续差异,如下表所述。

    enter image description here

    请参阅Full-Scratch Implementor of OAuth and OpenID Connect Talks About Findings中的“7.访问令牌”,了解访问令牌表示方式的优缺点。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您不清楚您在问题中使用哪个OAuth流,或者您是指OpenID Connect而不是Oauth。

考虑使用刷新令牌,并且访问令牌的到期时间要短得多 - 例如30分钟

在这种情况下,用户( public function __construct(){ $uri = $_SERVER["REQUEST_URI"]; $uri = preg_replace("#".BASE_PATH_PATTERN."#i", "", $uri, 1); $this->uriExploded = explode("/", trim($uri, "/") ); /*Check if there is another folder */ $check = preg_match("/something/i", $uri); if($check != false) { /*instruction... */ } )不必进行身份验证,并且您的API(resource owner)不必检查用户是否仍然有效每一个请求。

访问令牌过期后,您的Resource Server(调用您的API的应用程序)应该与您的数据库(client)联系并交换其刷新令牌以获取新的访问令牌 - 通常是新的刷新令牌 - 提供用户仍然是您的数据库上的有效用户,并且用户尚未撤消客户端应用程序对其API上的数据的访问权限。

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

答案 3 :(得分:0)

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