在大多数JWT(JSON Web Token)教程(例如:this和this)上说,一旦经过验证,您可以使用传入令牌获取客户端信息,而无需从DB验证它
我的问题是,如何保持无效的用户状况呢?我的意思是,假设一个客户端只有一个JWT令牌,它在一周内到期。但由于非常具体的原因,我们可以说我们决定使用户无效,并且不希望用户访问我们的API。但该用户仍然有一个有效的令牌,用户可以访问该API。
当然,如果我们为每个请求往返数据库,那么我们可以验证该帐户是有效还是无效。我的问题是,对于长期存在的令牌,这种情况的最佳方法是什么。
提前致谢。
答案 0 :(得分:6)
如果不是不可能的话,很难撤销基于JWT的访问令牌。
如何表示访问令牌?有两种主要方式。
在这些方式之间进行选择将导致后续差异,如下表所述。
请参阅“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,这只是一个很好的解决方案。