如果不是不可能的话,撤销基于JWT的访问令牌很困难。
访问令牌应该如何表示?有两种主要方式。
在这些方式之间选择将导致如下表格所述的差异。
请参阅《OAuth和OpenID Connect的全新实现者谈论发现》中的“7.访问令牌”,了解访问令牌表示方式的优缺点。RFC 7009 规定了OAuth 2.0 Token Revocation。基本上,您可以通过端点撤销访问令牌。
从你的问题中无法确定你使用的是哪种OAuth流程,或者你是否指的是OpenID Connect而不是OAuth。
考虑使用刷新令牌,并将访问令牌的过期时间缩短 - 例如30分钟。
在这种情况下,用户(资源所有者
)不必保持身份验证,您的API(资源服务器
)也不必在每个请求上检查用户是否仍然有效。
一旦访问令牌过期,您的客户端
(调用您的API的应用程序)应该联系您的DB(授权服务器
),并交换其刷新令牌以获取新的访问令牌 - 通常还会提供新的刷新令牌 - 前提是用户仍然是您的DB上的有效用户,并且用户未撤销客户端应用程序对其在API上的数据的访问权限。
如果您的授权服务器允许,您还可以像另一个答案建议的那样使用令牌吊销,但我建议尝试使用刷新令牌和短期访问令牌,因为这样更容易实现,并且不会使您的API混杂着用户身份验证/授权问题 - 这项工作最好由Auth服务器完成。
当你使用JWT时,这就是主要问题。因此,在这种情况下,最好的方法是在网关上创建黑名单。从安全角度来看,这不是最佳解决方案,但如果你正在使用JWT,这是唯一的好解决方案。