如何手动使 JWT 令牌过期?
How to expire a JWT token manually?
这个问题听起来可能很愚蠢,但我仍然想知道我还能做些什么来实现这个功能。
有一个作为 REST API 构建的库存系统,并且有两种类型的用户。
users
admins
假设当用户登录时,他获得了一个包含以下信息的 JWT 令牌。
email
、user_id
、user_level
此令牌在每个专用路由中解码,并检查用户是否经过身份验证,还检查用户级别以确保用户有权访问该特定资源。
让我们考虑一个特殊场景,管理员 (Admin A) 登录并开始在系统上执行一些管理操作。突然,另一个管理员 (SuperAdmin) 出于某种原因想要将 Admin A 降级为普通用户。
然而,尽管现在 Admin A 只是一个普通用户,他的令牌仍然是 Admin 令牌。因此,在令牌在一小时后自动过期之前,他仍然可以执行管理工作。
那么,在这种情况下,手动使该令牌过期的方法是什么?系统是否应该使用数据库查询来检查每个管理路由的用户级别?或者还有其他方法可以实现吗?
希望您清楚这一点。
处理此问题的一种可行方法是维护一个缓存,该缓存由 JWT/state 个用户组成,这些用户的权限自发布初始 JWT 以来已更改。工作流程通常是这样的:
- 您的系统向某个用户发布了一个管理员 JWT
- 有一段时间,该管理员照常使用他的 JWT
- 然后超级管理员决定降级管理员。由于他无法撤销他的 JWT,而是将一个条目写入黑名单缓存,记录该用户不再是管理员。
- 从现在开始,服务器将首先根据黑名单缓存检查所有传入请求,以决定使用哪些信息。在示例管理员的情况下,服务器会发现一个缓存条目,然后只授予该用户正常的非管理员权限。
- 假设您的 JWT 有一个到期日期,缓存最终会删除陈旧的 JWT,使内存占用尽可能小。
这里关于缓存的关键点是它很快。访问缓存中的条目应该比访问数据库快大约 100 倍。至于缓存中的过期条目,许多缓存实现(例如 Redis)允许在写入条目时设置条目的过期时间。在这种情况下,服务器只会使用原始 JWT 中的 exp
声明设置到期时间。如果设置正确,缓存的内存需求可以保持在最低水平。
这个问题听起来可能很愚蠢,但我仍然想知道我还能做些什么来实现这个功能。
有一个作为 REST API 构建的库存系统,并且有两种类型的用户。
users
admins
假设当用户登录时,他获得了一个包含以下信息的 JWT 令牌。
email
、user_id
、user_level
此令牌在每个专用路由中解码,并检查用户是否经过身份验证,还检查用户级别以确保用户有权访问该特定资源。
让我们考虑一个特殊场景,管理员 (Admin A) 登录并开始在系统上执行一些管理操作。突然,另一个管理员 (SuperAdmin) 出于某种原因想要将 Admin A 降级为普通用户。 然而,尽管现在 Admin A 只是一个普通用户,他的令牌仍然是 Admin 令牌。因此,在令牌在一小时后自动过期之前,他仍然可以执行管理工作。
那么,在这种情况下,手动使该令牌过期的方法是什么?系统是否应该使用数据库查询来检查每个管理路由的用户级别?或者还有其他方法可以实现吗?
希望您清楚这一点。
处理此问题的一种可行方法是维护一个缓存,该缓存由 JWT/state 个用户组成,这些用户的权限自发布初始 JWT 以来已更改。工作流程通常是这样的:
- 您的系统向某个用户发布了一个管理员 JWT
- 有一段时间,该管理员照常使用他的 JWT
- 然后超级管理员决定降级管理员。由于他无法撤销他的 JWT,而是将一个条目写入黑名单缓存,记录该用户不再是管理员。
- 从现在开始,服务器将首先根据黑名单缓存检查所有传入请求,以决定使用哪些信息。在示例管理员的情况下,服务器会发现一个缓存条目,然后只授予该用户正常的非管理员权限。
- 假设您的 JWT 有一个到期日期,缓存最终会删除陈旧的 JWT,使内存占用尽可能小。
这里关于缓存的关键点是它很快。访问缓存中的条目应该比访问数据库快大约 100 倍。至于缓存中的过期条目,许多缓存实现(例如 Redis)允许在写入条目时设置条目的过期时间。在这种情况下,服务器只会使用原始 JWT 中的 exp
声明设置到期时间。如果设置正确,缓存的内存需求可以保持在最低水平。