【发布时间】:2019-10-23 17:58:45
【问题描述】:
我想在 node.js 中使用令牌 jwt 做一个 api。
- 我有一个用户使用登录名和密码登录,成功登录后我生成了一个令牌,我为这个用户写入数据库。
- 如果给定用户发送请求,例如GET /basic-data 我必须做中间件,它将检查标头中的令牌是否与数据库中的相同。
我说对了吗?
【问题讨论】:
标签: node.js jwt express-jwt
我想在 node.js 中使用令牌 jwt 做一个 api。
我说对了吗?
【问题讨论】:
标签: node.js jwt express-jwt
不,您没有使用 JWT 令牌。 您不需要将 JWT 令牌存储在数据库中。您生成的令牌带有您在创建令牌时指定的到期时间。 您只需要使用预定义的函数(在 jwt 库中提供)来验证令牌是否有效以及负载是否包含经过身份验证的数据。
要检查有效负载的真实性,您可以编写一个策略,该策略将在 URL 被命中时检查令牌,然后转发请求以进行进一步处理。
例如,您可以在创建 jwt 令牌时将用户数据转储到 jwt 有效负载中,一旦您在任何请求中获取令牌,您就可以检查资源是否由经过身份验证的用户请求(例如:用户角色 = 管理员或供应商)通过查看您的用户数据库。该策略将在此处用作中间件。
【讨论】:
此答案旨在仅涉及有关 JWT 通常如何在 Web 应用程序中使用的高级基础知识。你说:
成功登录后,我会生成一个令牌,并将其写入该用户的数据库中。
您是正确的,在成功登录后,您的 Node 应用程序应该生成一个新的 JWT,但将其写入数据库并不常见。使用 JWT 的全部意义在于从服务器端删除尽可能多的状态,并将其推送到使用应用程序的客户端。将会话状态存储在数据库中并不理想,原因有很多,包括与缓存等替代方案相比,数据库访问往往非常流畅。
接下来你问:
如果给定用户发送请求,例如GET /basic-data 我必须做中间件,它将检查标头中的令牌是否与数据库中的相同。
在理想情况下,您只需针对每个请求检查传入 JWT 的到期 (exp) 声明,即可决定是否接受该请求。您不需要检查数据库。在实践中,您可能需要维护 JWT 的白名单或黑名单缓存,但理想情况下,任何缓存的内存占用量都应该很小,并且访问时间会非常快。
【讨论】:
为什么要将 JWT 存储在数据库中。您如何发现同一用户正在发送您提供的此令牌。您可以使用其 verify() 方法验证令牌,然后检查数据库中解码的用户详细信息以了解该用户的有效性。
【讨论】: