Node.js 获取客户端用户';在每次api调用时从数据库中删除数据?

Node.js 获取客户端用户';在每次api调用时从数据库中删除数据?,node.js,django,spring,rest,flask,Node.js,Django,Spring,Rest,Flask,对于RESTAPI中的身份验证,我使用JWTs,它只包含客户端用户的UUID 为了检查用户是否被阻止或有权执行特定端点,我使用JWT的UUID从PostgreSQL数据库中获取用户的数据,并验证是否允许用户执行 为保护每个API调用执行数据库操作是否是一种好的做法 还考虑了在JWTs中存储角色和权限,但是如果这些角色和权限在数据库中更改,并且JWTs数据变得陈旧,该怎么办?是否有解决陈旧数据的方法?您必须使用JWT检查一些数据存储是否陈旧 如果您通过性能测试和测量得出结论,认为为每个请求访问Po

对于RESTAPI中的身份验证,我使用JWTs,它只包含客户端用户的UUID

为了检查用户是否被阻止或有权执行特定端点,我使用JWT的UUID从PostgreSQL数据库中获取用户的数据,并验证是否允许用户执行

为保护每个API调用执行数据库操作是否是一种好的做法

还考虑了在JWTs中存储角色和权限,但是如果这些角色和权限在数据库中更改,并且JWTs数据变得陈旧,该怎么办?是否有解决陈旧数据的方法?

您必须使用JWT检查一些数据存储是否陈旧

如果您通过性能测试和测量得出结论,认为为每个请求访问PostgreSQL数据库的速度太慢,那么您可以优化该部分。可能通过更改数据结构或配置来优化数据库性能。或者为此目的使用完全不同的数据库。不好的做法是过早地对此进行优化

这里有一篇文章谈到,它描述了一个使用Redis的示例:

一个实现可能是,存储一个所谓的“黑名单”,其中包含所有不再有效且尚未过期的令牌。您可以在文档上使用具有TTL选项的DB,该选项将设置为令牌过期之前的剩余时间量。Redis是一个很好的选择,它允许在内存中快速访问列表。然后,在对每个授权请求运行的某种中间件中,您应该检查提供的令牌是否在黑名单中

TL DR:不,不是:-)

一般来说,JWT不是您描述的场景中最合适的解决方案,您现在已经面临了它的第一个问题

因为最好在JWT中存储无状态信息,否则最好使用其他身份验证解决方案

结论

无状态JWT令牌不能失效或更新,并且将根据存储位置引入大小问题或安全问题。有状态JWT令牌在功能上与会话cookie相同,但没有经过战斗测试和充分审查的实现或客户端支持

除非您在Reddit规模的应用程序上工作,否则没有理由将JWT令牌用作会话机制。只需使用会话

资料来源:

以及其他一些相关职位:

我采访过的大多数安全顾问/审计人员在关于JWT的陈述中也非常强烈,他们被广泛滥用,并且有一个特定的问题域

但如果你真的想/需要,我会遵循@ekuusela的答案,特别是考虑到:

不好的做法是过早地对此进行优化


谢谢,我会查一查。使用JWTs来验证这些东西并不是最好的做法,结果是你仍然需要回到D'n去验证,在这种情况下,你为什么需要一个“签名会话ID”?另见