对 Web 和 api 解决方案(如 MERN Stack)进行身份验证和授权的最佳方式是什么?

What's the best way to authenticate and authorize a web and api solution like MERN Stack?

我正在尝试找到实现授权的最佳方式。目前,我只需要一个简单的免费帐户,但稍后我可能会使用像 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,并且我的数据库有数百个用户,我该如何管理他们?

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

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

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

例如,如果您只有一个简单的 (MERN) 网站和一个简单的后端(api 其余)或像这样的整体应用程序 mern example 具有内部或私人登录您的组织,您的授权策略可以像这样简单:

  • (1*) /login 接收 user/password 的快速路由,在数据库中验证它们并 returns 用户应该使用的经典 jwt 令牌和一组选项(反应路由)可以访问
  • Web 应用程序 (React) 必须呈现其路由与接收到的路由匹配的页面
  • 网络应用程序必须将收到的令牌发送到任何 api 其余端点调用
  • 当 api 收到来自 React web 的调用时,必须验证令牌是否存在 header。如果不存在,必须 return 403 错误。
  • (2*) 如果令牌存在,必须尝试验证它(well-formed、未过期、正确的签名等)。
  • (3*)如果它是有效令牌,您必须执行最后一次验证:是否允许具有“访客”角色的用户对端点 /user/100.[= 执行 DELETE 101=]
  • (4*) 经典解决方案是在您的数据库中包含一些 table,例如:用户、角色、user_roles、role_permission、permission_option。选项 table 必须已注册所有 api 端点及其方法。这也可用于创建用户 <:> 网络路由之间的关系。检查 this

现代要求

现代大型组织需要:

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

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

  • 网络应用程序(反应、vue、angular、linkstart 等)
  • apis rest (nodejs + expres, java, python, 等)
  • authentication/authorization:oauth2 platform/provider、Identity/Access 平台等

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

Oauth2

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

您可以开发自己的安全平台,同时考虑 (1*)、(2*)、(3*) y (4*) 或使用类似的东西:

  • auth0
  • keycloack 等

此处有更多详细信息:https://whosebug.com/a/62049409

您的问题

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

参考资料