如何手动使 JWT 令牌过期?

Tha*_*cky 7 authentication authorization token node.js jwt

这个问题可能听起来很愚蠢,但我仍然想知道我还能做些什么来实现这个功能。

有一个作为REST API构建的库存系统,有两种类型的用户。

  1. users
  2. admins

假设当用户登录时,他会获得一个包含以下信息的 JWT 令牌。

email, user_id,user_level

该令牌在每个私有路由中被解码,并检查用户是否经过身份验证,并检查用户级别以确保用户有权访问该特定资源。

让我们考虑一个特殊的场景,管理员(管理员 A)登录并开始在系统上执行一些管理操作。突然,另一个管理员(SuperAdmin)出于某种原因想要将管理员 A降级为普通用户。然而,尽管现在管理员 A只是一个普通用户,但他的令牌仍然是管理员令牌。因此,他仍然可以执行管理操作,直到令牌在一小时后自动过期。

那么,在这种情况下,如何手动使令牌过期呢?系统是否应该使用数据库查询来检查每个管理路由的用户级别?或者还有其他方法可以实现这一目标吗?

希望你能清楚地明白这一点。

Tim*_*sen 10

处理此问题的一种可行方法是维护一个由 JWT/用户状态组成的缓存,这些用户的权限自初始 JWT 发布以来已发生更改。工作流程通常是这样的:

  • 您的系统向特定用户发出管理 JWT
  • 有一段时间,该管理员像往常一样使用他的 JWT
  • 然后超级管理员决定降级管理员。由于他无法撤销他的 JWT,因此他将一个条目写入黑名单缓存,记录该用户不再是管理员。
  • 从此时起,服务器将首先根据黑名单缓存检查所有传入请求,以决定使用哪些信息。在示例管理员的情况下,服务器会发现一个缓存条目,然后只授予该用户正常的非管理员权限。
  • 假设您的 JWT 有过期日期,缓存最终将删除过时的 JWT,使内存占用量尽可能小。

关于缓存的关键点是它速度快。访问缓存中的条目大约比访问数据库快 100 倍。至于缓存中过期的过时条目,许多缓存实现(例如 Redis)允许在写入条目时设置条目的过期时间。在这种情况下,服务器将仅使用exp原始 JWT 内的声明来设置过期时间。如果设置正确,缓存的内存需求可以保持在最低限度。