node.js - 为什么每个人都使用 MongoDB 与 Node.Js 和 Express 进行用户身份验证

标签 node.js authentication express redis passport.js

我找到的几乎所有结合 Node.Js/Express.Js 和 Passport(或其他流行模块)的本地身份验证策略示例都使用 MongoDB。

我想知道是否有人可以回答我这种组合的优点是什么,以及是否还有其他更轻便的数据库可供使用。例如,任何人使用 Redis 做这类事情的例子吗?或者为什么不直接使用 MySQL 进行用户管理?

最佳答案

虽然将 Redis 用作用户数据库本身没有任何问题(是的,它是一个生产数据库,而不是“只是一个缓存”),但这并不意味着它是一个好主意 - 至少不是没有额外的工作。

您的应用用于与 Redis 服务器通信的协议(protocol)是纯文本、未加密的协议(protocol)。因此,默认情况下,您将通过网络明文发送用户身份验证信息。

您可以而且应该通过加密用户凭据来稍微解决这个问题 - 包括用户名,然后再将它们存储在 Redis 中。或者,您需要设置一个隧道层来完全加密传输(尽管仍然建议您在数据库中加密用户密码,无论解决方案如何)。

这样做是可能的,但很复杂。在我看来,这首先会否定 Redis 的自然简单性。它还增加了一个故障点 - channel 设置。

也就是说,如果您仍然要走这样的路线,使用 Redis 会带来一些不错的好处,例如简单易用的用户指标跟踪、 session 存储等,使用相同的层和基础设施。您甚至可以集成 Redis 的发布/订阅功能,以在用户登录尝试时触发事件。当然,您可以实现所有这些并仍然使用专用的身份验证系统进行用户身份验证,例如 LDAP、基于 PAM 的设置、使用带有 SSL 的 PotsgreSQL 等。

至于 Redis 中的数据结构是什么样的,我的脑海里浮现出一些类似于每个用户的散列线的东西,其中用户名是 key 、密码(当然是加密的)、诸如此类的项目如名字、姓氏、电子邮件地址、上次登录时间等,每个都是哈希中的字段。您甚至可以使用 [HINCRBY][1] 在用户哈希中包含登录尝试和失败的登录尝试值。

如果您需要创建组或角色,您可以为组或角色定义一个散列,然后使用 set处理组/角色成员。

有关在 Redis 中使用哈希的文档,请参阅 Redis Hash Documentation .要在服务器和代理之间使用 channel 层设置 Redis,请尝试 this tutorial .

关于node.js - 为什么每个人都使用 MongoDB 与 Node.Js 和 Express 进行用户身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22023046/

相关文章:

node.js - 错误请求 - Node js ajax 发布

javascript - 从 docker 容器内的 Node 服务器访问 ubuntu localhost

java - 使用 Google 和 Facebook 等身份提供商在 Keycloak 上进行 Android 身份验证

javascript - Mongoose - 转换为 ObjectId 失败

java - 注册后自动登录

linux - linux上的登录时间问题

node.js - 使用 Handlebars 访问数组中所有对象的特定元素时出现问题

javascript - 使用 Gulp 和 Babel 错误进行导入

javascript - Sailsjs 更改本地化

node.js - 如何在通过 soket.io 获取客户端后从 redis 中删除数据?