Node.js JWT令牌

时间:2019-06-08 15:23:43

标签: node.js jwt express-jwt

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

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

我正确吗?

3 个答案:

答案 0 :(得分:2)

此答案旨在仅介绍Web应用程序中通常如何使用JWT的高级基础知识。你说:

  

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

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

接下来你问:

  

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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