对像 MERN Stack 这样的 Web 和 api 解决方案进行身份验证和授权的最佳方式是啥?

Posted

技术标签:

【中文标题】对像 MERN Stack 这样的 Web 和 api 解决方案进行身份验证和授权的最佳方式是啥?【英文标题】: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,但后来发现了一些其他方法。

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

所以,有些问题是

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

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

【问题讨论】:

【参考方案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://***.com/a/62049409

您的问题

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

参考文献

https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2 https://auth0.com/user-management https://***.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/ Managing single sign on using passportjs for my own web applications - sharing login https://aws.amazon.com/blogs/apn/how-to-integrate-rest-apis-with-single-page-apps-and-secure-them-using-auth0-part-1/ Facebook OAuth security using passport-facebook Asynchronous Django, Ajax, Jquery Information relational models

【讨论】:

哇!谢谢你的回答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

以上是关于对像 MERN Stack 这样的 Web 和 api 解决方案进行身份验证和授权的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

MERN Stack 为所有用户显示相同的数据

单击卡片时如何调用函数 - MERN Stack

如何使用 Multer 在 MERN Stack 应用程序中上传图像文件

MERN-stack使用react-router用户身份验证而不使用redux

在 MERN 堆栈 Web 应用程序中存储图像的最佳方式

当同时使用 GraphQL 时,Nodejs 和 Express 在 MERN 堆栈 Web 应用程序中的作用是啥?