Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何手动使JWT令牌过期?_Node.js_Authentication_Jwt_Authorization_Token - Fatal编程技术网

Node.js 如何手动使JWT令牌过期?

Node.js 如何手动使JWT令牌过期?,node.js,authentication,jwt,authorization,token,Node.js,Authentication,Jwt,Authorization,Token,这个问题可能听起来很愚蠢,但我仍然想知道我还能做些什么来实现这个功能 有一个作为RESTAPI构建的库存系统,有两种类型的用户 用户 管理员 假设当用户登录时,他得到了一个包含以下信息的JWT令牌 电子邮件,用户id,用户级别 该令牌在每个私有路由中解码,并检查用户是否经过身份验证,还检查用户级别以确保用户有权访问该特定资源 让我们考虑一个特殊的场景,一个管理员(管理员A /强>)登录并开始在系统上执行一些管理操作。突然,另一个管理员(SuperAdmin)出于某种原因想要将管理员A降级为普通用

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

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

  • 用户
  • 管理员
  • 假设当用户登录时,他得到了一个包含以下信息的JWT令牌

    电子邮件
    用户id
    用户级别

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

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

    那么,在这样的场景中,如何手动使令牌过期?系统是否应该使用DB查询来检查每个管理路由的用户级别?或者有没有其他方法来实现这一点


    希望你明白这一点

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

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

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

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