【问题标题】:What's the best way to authenticate and authorize a web and api solution like MERN Stack?对像 MERN Stack 这样的 Web 和 api 解决方案进行身份验证和授权的最佳方式是什么?
【发布时间】:2020-11-15 08:09:18
【问题描述】:

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

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

【问题讨论】:

    标签: node.js reactjs mongodb oauth-2.0 passport.js


    【解决方案1】:

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

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

    例如,如果您只有一个简单的 (MERN) Web 和一个简单的后端 (api rest),或者像 mern example 这样的单一应用程序,在您的组织中具有内部或私人登录,您的授权策略可以是很简单:

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

    现代要求

    现代和大型组织需要:

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

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

    • 网络应用(react、vue、angular、linkstart 等)
    • api 休息(nodejs + 表达式、java、python 等)
    • 身份验证/授权:oauth2 平台/提供者、身份/访问平台等

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

    Oauth2

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

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

    • auth0
    • 钥匙锁等

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

    您的问题

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

    参考文献

    【讨论】:

    • 哇!谢谢你的回答JRichardsz!因此,据我了解,使用 auth0 之类的服务可以确保我长期避免安全问题。至于免费限制是好的(我看到像 7k 用户)。现在,我目前使用 MERN 堆栈进行用户身份验证,而不是调用 api。该 api 是一个单独的 python api。因此,据我所知,我应该坚持这一点,而不是在 express.js 中重写它,以防我将来制作移动应用程序......并使用 auth0 令牌来访问 api。我还没有弄清楚的最后一件事是 auth0 是否足够,或者是否还需要 mongo db。
    • 您与您的 python api 相关。与数据库相关,使用 auth0,您不需要像 user、user_role 等经典表。也许在这个 sprint 中,您可以从 express + passport + auth0 + express-in-memory 数据库开始。并在明年春天使用 redis 作为您的快速会话的数据库。如果这有用和/或可以解决您的问题,请给我点赞:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 2016-09-23
    • 2015-05-24
    • 1970-01-01
    • 2012-05-20
    • 2012-08-29
    • 2017-05-17
    相关资源
    最近更新 更多