对像 MERN Stack 这样的 web 和 api 解决方案进行身份验证和授权的最佳方法是什么?

IT技术 node.js reactjs mongodb oauth-2.0 passport.js
2021-05-10 15:04:47

我正在努力寻找实现授权的最佳方式。目前,我只需要一个简单的免费帐户,但稍后我可能会使用像 Stripe 这样的支付系统为“高级”帐户添加用户角色。

我已经开始阅读和试验 Auth0,但后来找到了一些其他的方法。

  1. Passport.js + MongoDB,我看过一些示例并且效果很好,但我认为它缺少一种使用友好面板(如 Auth0)控制用户、规则等的方法
  2. 使用 Auth0 并设置自定义数据库 (mongoDB)。也似乎是在付费墙后面。
  3. 还找到了一种使用 Auth0 进行身份验证和使用 Mongoose 进行 MongoDB 数据库的方法。在这个中,除了密码之外,所有内容都保存在 mongoDB 中。这也是从 Auth0 中删除用户不会影响 MongoDB 的唯一设置(我猜这很糟糕)。

所以,有些问题是

  1. 你认为哪种方法更好?
  2. 2和3有什么区别,
  3. 有没有办法在护照中实施规则(例如在首次登录时重定向新用户)
  4. 如果我用 MongoDB 实现 Passport,并且我的数据库有数百个用户,我该如何管理它们?

有点混乱的问题,但任何帮助都会有所帮助

1个回答

最佳授权策略取决于您的应用程序的短期或长期范围。

带有私人登录的整体或简单的网络

例如,如果您只有一个简单的 (MERN) 网络和一个简单的后端 (api rest) 或像这个mern 示例这样的单体应用程序,在您的组织中有一个内部或私有登录,那么您的授权策略可能很简单:

  • (1*) /login 快速路由,它接收用户/密码,在数据库中验证它们并返回用户应该有权访问的经典 jwt 令牌和一组选项(react路由)
  • Web 应用程序(react)必须呈现其路由与接收到的路由匹配的页面
  • Web 应用程序必须将接收到的令牌发送到任何 api 休息端点调用
  • 当 api 收到来自 react web 的调用时,必须验证令牌是否存在作为标头。如果不存在,必须返回 403 错误。
  • (2*) 如果令牌存在,必须尝试验证它(格式正确、未过期、正确签名等)。
  • (3*)如果它是一个有效的令牌,您必须执行最后一次验证:是否允许具有“来宾”角色的用户DELETE对端点执行 a /user/100
  • (4*) 经典解决方案是在您的数据库中有一些表,例如:用户、角色、用户角色、角色权限、权限选项。选项表必须已注册所有 api 端点及其方法。这也可用于创建用户 <:> 网络路由之间的关系。检查这个

现代要求

现代和大型组织需要:

  • 社交网络登录
  • 内部/外部用户
  • 非交互式登录(机器人、调度程序等)
  • 几个网络应用程序
  • 几个移动应用程序
  • 很多 Api Rest

对于这种情况,MERN 应用程序不是一个好的选择,因为它是 ALL-IN-ONE。实现上述要求的常见策略是在多个服务器中部署多个工件:

  • 网络应用程序(react、vue、angular、linkstart 等)
  • apis rest(nodejs + expres、java、python 等)
  • 身份验证/授权:oauth2 平台/提供商、身份/访问平台等

如果是这种情况,您必须将您的 MERN 应用程序拆分为几个可部署的工件:Web、API 和安全性。

Oauth2

无论您是只关心登录,还是如何确保您的网站、apis 甚至您的移动应用程序的身份验证和授权,您都需要:OAUTH2

您可以考虑 (1*)、(2*)、(3*) y (4*) 或使用以下内容来开发自己的安全平台:

  • 验证码
  • 钥匙扣等

更多细节在这里:https : //stackoverflow.com/a/62049409

你的问题

  • 你认为哪种方法更好?
    • 我想如果你会使用auth0,你会节省时间和精力。使用 auth0,您只需要一个简单的 express 应用程序,带有一些端点,例如 /login、/callback 等。或者如果您使用 auth0 +passport.js,这些端点由passport.js 管理
    • 我建议您,在使用带/不带护照的 auth0 之前查看 OAUTH2 流程的工作原理。这个链接对我帮助很大。
  • 2和3有什么区别,
    • 正如我所读到的,auth0 和其他平台提供了用户管理服务,或者它可以连接到您的用户服务(AD/LDAP、数据库、api 等)。所以
  • 有没有办法在护照中实施规则(例如在首次登录时重定向新用户)
    • 是的。无论是否使用通行证,您都可以在 nodejs 中重定向回调时添加一些逻辑。
  • 如果我用 MongoDB 实现 Passport,并且我的数据库有数百个用户,我该如何管理它们?
    • 现在数据库支持很多行。因此,对于您的生产数据库,请尝试对其进行优化或监控。另一种选择是聘请数据库管理员来执行这些任务。

参考