繁体   English   中英

Node.js JWT令牌

[英]Node.js JWT token

我想使用令牌jwt在node.js中创建一个api。

  1. 我有一个使用登录名和密码登录的用户,成功登录后会生成一个令牌,并将该令牌写入该用户的数据库中。
  2. 如果给定的用户发送请求,例如GET / basic-data,则我必须执行中间件,该中间件将检查标头中的令牌是否与数据库中的令牌相同。

我说对了吗?

这个答案的目的只是涉及Web应用程序中通常如何使用JWT的高级基础知识。 你说:

成功登录后,我生成一个令牌,并将其写入该用户的数据库。

正确的做法是,成功登录后,您的Node应用程序应生成一个新的JWT,但是将其写入数据库中并不常见。 使用JWT的全部目的是从服务器端删除尽可能多的状态,然后使用应用程序将其推送给客户端。 由于多种原因,将会话状态存储在数据库中并不理想,其中包括与诸如高速缓存之类的替代方法相比,数据库访问往往非常流畅。

接下来,您问:

如果给定的用户发送请求,例如GET / basic-data,则我必须执行中间件,该中间件将检查标头中的令牌是否与数据库中的令牌相同。

在理想情况下,对于每个请求,您只需要检查传入的JWT的到期声明( exp ),即可决定是否满足该请求。 您无需检查数据库。 实际上,您可能必须维护JWT的白名单或黑名单缓存,但理想情况下,任何缓存的内存占用量都将很小,并且访问时间将非常快。

不,您没有利用JWT令牌的用途。 您无需将JWT令牌存储在数据库中。 您生成的令牌附带您在创建令牌时指定的到期时间。 您只需要使用预定义的函数(在jwt库中可用)就可以验证令牌是否有效以及有效负载是否包含已验证的数据。

要检查负载的真实性,您可以编写一个策略,该策略将在命中URL时检查令牌,然后转发请求以进行进一步处理。

例如,您可以在创建jwt令牌时将用户数据转储到jwt负载中,一旦在任何请求中获得了令牌,就可以通过以下方式检查资源是否由经过身份验证的用户请求(例如:user role = admin或vendor)调查您的用户数据库。 该策略将在此处充当中间件。

为什么将JWT存储在数据库中。如何找到同一用户正在向您提供的令牌发送此令牌。 您可以使用令牌的verify()方法验证令牌,然后在数据库中检查已解码的用户详细信息,以确认该用户的有效性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM