对 Web 和 api 解决方案(如 MERN Stack)进行身份验证和授权的最佳方式是什么?
What's the best way to authenticate and authorize a web and api solution like MERN Stack?
我正在尝试找到实现授权的最佳方式。目前,我只需要一个简单的免费帐户,但稍后我可能会使用像 stripe 这样的支付系统为“高级”帐户添加用户角色。
我已经开始阅读和试验 Auth0,但后来发现了一些其他方法。
- Passport.js + MongoDB,我看过一些示例并且效果很好,但我认为它缺少一种通过友好面板(如 Auth0)控制用户、规则等的方法
- 使用 Auth0 并设置自定义数据库 (mongoDB)。似乎也在付费专区后面。
- 还找到了一种既使用 Auth0 进行身份验证又使用 Mongoose 进行 MongoDB 数据库的方法。在这一个中,除密码外,所有内容都保存在 mongoDB 中。这也是从 Auth0 中删除用户不会影响 MongoDB 的唯一设置(我猜这很糟糕)。
所以,有些问题是
- 您认为哪种方法更好?
- 2和3有什么区别,
- 有没有办法在护照中实施规则(例如,在首次登录时重定向新用户)
- 如果我使用 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,并且我的数据库有数百个用户,我该如何管理他们?
- 现在的数据库支持很多行。因此,对于您的生产数据库,请尝试对其进行优化或监控。另一种选择是聘请数据库管理员来执行这些任务。
参考资料
- https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2
- https://auth0.com/user-management
- https://whosebug.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
我正在尝试找到实现授权的最佳方式。目前,我只需要一个简单的免费帐户,但稍后我可能会使用像 stripe 这样的支付系统为“高级”帐户添加用户角色。
我已经开始阅读和试验 Auth0,但后来发现了一些其他方法。
- Passport.js + MongoDB,我看过一些示例并且效果很好,但我认为它缺少一种通过友好面板(如 Auth0)控制用户、规则等的方法
- 使用 Auth0 并设置自定义数据库 (mongoDB)。似乎也在付费专区后面。
- 还找到了一种既使用 Auth0 进行身份验证又使用 Mongoose 进行 MongoDB 数据库的方法。在这一个中,除密码外,所有内容都保存在 mongoDB 中。这也是从 Auth0 中删除用户不会影响 MongoDB 的唯一设置(我猜这很糟糕)。
所以,有些问题是
- 您认为哪种方法更好?
- 2和3有什么区别,
- 有没有办法在护照中实施规则(例如,在首次登录时重定向新用户)
- 如果我使用 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,并且我的数据库有数百个用户,我该如何管理他们?
- 现在的数据库支持很多行。因此,对于您的生产数据库,请尝试对其进行优化或监控。另一种选择是聘请数据库管理员来执行这些任务。
参考资料
- https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2
- https://auth0.com/user-management
- https://whosebug.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