如何最大程度地减少对用户进行身份验证所需的数据库调用次数?

时间:2019-11-16 00:44:23

标签: node.js express session socket.io express-session

我需要对尝试连接到我的服务器的用户进行身份验证。

我的第一个架构对数据库进行了三遍查询,以识别任何给定的用户:

  • 首先.card检查了与之相关的有效会话 用户提供的会话ID
  • 然后再次height查询 数据库反序列化用户并检查特殊特权
  • express-session需要将新套接字与用户ID相关联(不需要其他数据),从而再次检查有效会话

我的第一个直觉是废弃passport.js并编写一个自定义socket.io存储库,以将前两个步骤合并为一个对数据库的单个调用。

但是现在我不禁要问是否还有任何方法可以重用相同的调用来标识套接字,从而潜在地提供了多种好处(减少了数据库流量,单一身份验证逻辑等)。

我有一个主意: 完全切换到JSON Web令牌以存储用户ID以及客户端的到期日期。这样,即使不查询数据库(通过对JWT签名),也可以标识套接字。用户反序列化只需要一个数据库调用。

这是一种安全可行的选择吗?

潜在的缺点让我担忧不已:

  • 没有会话管理:我看不到有选择地记录某人的任何方法 关闭(而不是简单地passport.js添加会话表中的行 与特定的用户ID相关联)
  • 如何确保与所连接的用户关联的插座最多为一个?
  • 意图不佳的人只需要加密的Web令牌的副本即可劫持某人的会话
  • 它仍然需要与数据库进行某种形式的交互,例如检查用户是否被禁止

还有其他有效的方法可以跨多个渠道对用户进行身份验证吗?

0 个答案:

没有答案