mongodb 通过JWT令牌验证用户请求的正确方法

h43kikqp  于 2023-06-29  发布在  Go
关注(0)|答案(2)|浏览(113)

在我所有需要登录用户的express节点路由中,初始中间件是一个解码JWT令牌的函数。
但是在令牌被解码之后,它会抓取存储在令牌中的_idemail,并进一步对我的数据库提供商mongoDB进行API调用,并试图找到与_idemail对应的用户。
这意味着每次用户发出请求时,我都必须查询数据库以确定用户是否存在。仅仅解码JWT是不够的,因为如果用户被删除了怎么办?
这是通过JWT令牌验证用户的正确方案吗?

lstz6jyr

lstz6jyr1#

对此没有一个通用的解决方案,但这应该适用于大多数基本情况:
1.使用MongoDB或Redis等持久存储来跟踪用户的会话。
1.假设它是MongoDB。您可以有一个sessions集合,在其中可以存储{ userId, token }文档。
1.现在,每当用户发出请求时,检查令牌是否已过期,如果已过期,则从集合中删除具有此令牌的所有文档。否则,检查具有该令牌的会话是否存在。如果没有,抛出一个错误。
1.当用户被删除时,使用userId删除该用户的所有会话。因此,如果该用户再次发出任何请求,它将在中间件中失败,因为会话对象不存在。

gg0vcinb

gg0vcinb2#

这是一个自定义索赔问题。首先为后端组件设计一个逻辑声明主体。最安全的设计使所有声明都可用于JWT中的后端,但避免将它们暴露给浏览器。在某些情况下,您可能有理由不将所有声明包含在JWT中:

  • 也许您对将包含个人数据的JWT返回到浏览器有顾虑
  • 也许授权服务器不支持从您自己的数据发出声明

在这种情况下,您可以在第一次接收到令牌时查找自定义声明,然后为使用相同令牌的后续请求缓存结果。代码有点棘手,但它很容易管理,并防止太多的数据库命中。更重要的是,它可以很好地设置您的代码,以便authorization所需的数据可以随时用于您的业务逻辑。
从一生的Angular 来看,这就是JWT的工作方式。应用程序使用来自JWT的值,直到它过期。如果您担心已删除的用户,请使用短期JWT或减少缓存声明的生存时间。

相关问题