如何根据 Quarkus 中的需求使 JsonWebToken 无效?

问题描述

假设用户按下了 logout 并且她的令牌应该无效。

我读到,我不能按要求使令牌过期,并且应该实施一些黑名单或其他自定义检查(这是单独的荒谬)。好的,我将 GUID 放在令牌中,并且在用户记录中也有 GUID。当用户注销时,我正在删除她的 GUID,然后可以区分该令牌已失效。

但不幸的是,令牌仍在传递 Quarkus 注释。例如,

@GET
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@RolesAllowed({"MYROLE"})
@SecurityRequirement(name = "auth",scopes = {"auth"})
public Response getUserItems(...params...)  {
    /// my code

这里我的代码仍然被执行,因为 Quarkus 认为令牌没问题。我需要在每个端点中添加额外的检查以区分无效令牌。

如何让Quarkus知道令牌是坏的?

解决方法

Quarkus 的 JWT 身份验证扩展只关心基于 JWT 令牌的结构和签名的验证。正如您所提到的,即使您在自定义逻辑中将其标记为已过期,该令牌仍然有效(如果其过期日期是在未来)。令牌本身完全不受您决定将其视为无效这一事实的影响。 因此,必须由您的应用逻辑来检查技术上有效的令牌是否已被您的应用标记为拒绝。

如何使此检查相当通用的一种方法是为每个令牌分配唯一的 id(例如作为声明),并跟踪有效令牌,例如在一个简单的数据库表中。然后您可以创建一个 CDI 拦截器或 Jaxrs 过滤器来检查您的数据库表中是否存在令牌 ID,如果不存在,将使用 401 中止请求。(如果您的所有令牌仅分配给您,您当然可以使用您的用户表用户)。