如何手动使 JWT 令牌过期?

Posted

技术标签:

【中文标题】如何手动使 JWT 令牌过期?【英文标题】:How to expire a JWT token manually? 【发布时间】:2020-06-13 05:09:33 【问题描述】:

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

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

    users admins

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

emailuser_iduser_level

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

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

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

希望你明白这一点。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

谢谢。这就是我一直在寻找的。只是为了简化我的理解,这就像在 Redis 之类的地方存储降级用户列表及其更新的访问控制策略。对吧? 是的;您为此使用数据库的建议在逻辑上是正确的,除了数据库在实践中可能不够快。所以,像 Redis 这样的缓存可以代替。 在大多数情况下,除非有大量令牌要手动过期或真正的 subPar 表模式,否则数据库应该没问题。 @Joe 不一定,因为每个传入的请求都必须访问数据库。但对于流量较少的 Web 应用程序来说可能是这样。

以上是关于如何手动使 JWT 令牌过期?的主要内容,如果未能解决你的问题,请参考以下文章

Django rest framework JWT ,删除 jwt 令牌

当用户在nodeJS / Express和Angular中空闲一段时间(基于令牌的授权)时,我如何使我的JWT令牌过期

如果生成了新的 JWT,如何使 JWT 过期

JWT/Laravel 延长令牌有效期

其中 jsonwebtoken 存储在服务器 nodejs 中。用户注销后如何使 JWT 过期

强制过期 JWT