我不确定我是否在这里遗漏了一些东西,但是我发现接受的答案比必要的更为复杂。
我看到必须为每个api请求命中db以验证或使令牌无效,但是正如我在此处看到的那样,整个过程可能更简单。
每当创建jwt时,即在登录或更改/重置密码期间,请将具有用户ID的jwt插入表中,并为每个jwt维护一个jti(基本上是uuid编号)。同样的jti也进入jwt有效负载。有效地,jti唯一地标识了jwt。从多个设备或浏览器访问帐户时,用户可以同时具有多个jwt,在这种情况下,jti会区分设备或用户代理。
因此,表模式将是jti |。用户身份。(以及课程的主要重点)
对于每个api,请检查jti是否在表中,这意味着jwt是有效的。
当用户更改或重置密码时,请从数据库中删除该userId的所有jti。创建一个新的jwt并将一个新的jti插入表中。这将使所有其他设备和浏览器的所有会话无效,但更改或重置密码的会话除外。
当用户注销时,删除该用户的特定jti,但不是全部。将只有一个登录,但没有一个注销。因此,当用户注销时,不应从所有设备注销该用户。但是,删除所有jtis也会从所有设备注销。
因此它将是一张表,没有日期比较。如果不使用刷新令牌,情况也将相同。
但是,为了最大程度地减少db干扰和可能的延迟,缓存的使用肯定会有助于减轻处理时间。
注意:如果您不赞成,请提出理由。