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



我正在努力寻找实现授权的最佳方式。在这个时候,我只需要一个简单的免费帐户,但稍后我可能会为一个"溢价;使用类似stripe的支付系统的账户。

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

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

所以,有些问题是

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

这是一个有点混乱的问题,但任何帮助都会对有所帮助

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

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

例如,如果您的组织中只有一个带有一个简单后端(api-rest)的简单(MERN)web,或者像本MERN示例这样的具有内部或私人登录的单片应用程序,那么您的授权策略可以简单到:

  • (1*)/login快速路由,接收用户/密码,在数据库中验证它们,并返回用户应该访问的分类jwt令牌和一系列选项(反应路由)
  • web应用程序(react)必须呈现路由与接收到的路由匹配的页面
  • web应用程序必须将接收到的令牌发送到任何api rest端点调用
  • 当api接收到来自reactweb的调用时,必须验证令牌作为头的存在。如果不存在,则必须返回403错误
  • (2*)如果存在令牌,则必须尝试验证它(格式正确、未过期、签名正确等)
  • (3*)如果它是一个有效的令牌,则必须执行最后一次验证:is user with"客人;允许执行CCD_ 1到端点CCD_
  • (4*)经典的解决方案是在数据库中有一些表,如:user、roles、user_roles、role_permission、permission_option。选项表必须已经注册了所有的api端点及其方法。此外,这可以用于创建用户<:>网络路由。检查这个

现代要求

现代和大型组织需要:

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

在这种情况下,MERN应用程序不是一个好选择,因为它是ALL-IN-ONE。实现先前需求的常见策略是在几个服务器中部署几个工件:

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

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

Oauth2

无论你是否只关心登录,或者如何确保你的网络、api和移动应用程序的身份验证和授权,你都需要:OAUTH2

您可以在考虑(1*)、(2*)、(3*)和(4*)的情况下开发自己的安全平台,或者使用类似的东西:

  • auth0
  • 钥匙扣等

此处提供更多详细信息:https://stackoverflow.com/a/62049409

您的问题

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

参考

  • https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2
  • https://auth0.com/user-management
  • https://stackoverflow.com/a/62049409
  • https://fiware-tutorials.readthedocs.io/en/latest/roles-permissions/index.html
  • https://dba.stackexchange.com/questions/36935/best-relational-database-structure-for-this-data
  • https://www.mind-it.info/2010/01/09/nist-rbac-data-model/
  • 使用passportjs为我自己的web应用程序管理单一登录-共享登录
  • https://aws.amazon.com/blogs/apn/how-to-integrate-rest-apis-with-single-page-apps-and-secure-them-using-auth0-part-1/
  • 脸书OAuth安全使用护照脸书
  • 异步Django、Ajax、Jquery信息
  • 关系模型

最新更新