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

2023-11-30

我正在尝试找到实施授权的最佳方法。此时,我唯一需要的是一个简单的免费帐户,但稍后我可能会包含使用 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 REST)或像这样的整体应用程序默恩的例子通过您组织的内部或私人登录,您的授权策略可能非常简单:

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

现代要求

现代大型组织需要:

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

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

  • Web 应用程序(React、Vue、Angular、LinkStart 等)
  • apirest(node js +express、java、python 等)
  • 身份验证/授权:oauth2 平台/提供商、身份/访问平台等

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

Oauth2

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

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

  • auth0
  • 钥匙斗篷等

更多详细信息请参见此处:https://stackoverflow.com/a/62049409

你的问题

  • which method you think is better?
    • 我认为如果您使用 auth0,您会节省时间和精力。使用 auth0,您只需要一个简单的 Express 应用程序,带有一些端点,例如 /login、/callback 等。或者,如果您使用 auth0 + Passport.js,这些端点由 Passport.js 管理
    • 我建议您在使用带/不带护照的 auth0 之前先回顾一下 OAUTH2 流程的工作原理。这link对我帮助很大。
  • What is the difference between 2 and 3,
    • 据我所知,auth0 和其他平台提供用户管理服务,或者它可以连接到您的用户服务(AD/LDAP、数据库、api 等)。所以
  • Is there a way to implement rules in passport (e.g. redirect new users on first login)
    • 是的。无论有或没有护照,您都可以在 Nodejs 中重定向回调时添加一些逻辑。
  • If I implement Passport with MongoDB, and my database has hundreds of users, how can I manage them?
    • 如今数据库支持很多行。因此,对于您的生产数据库,请尝试优化或监控它。另一种选择是聘请数据库管理员来执行这些任务。

参考

  • https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2
  • https://auth0.com/用户管理
  • 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-struct-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/
  • 使用 Passport-facebook 的 Facebook OAuth 安全性
  • 异步 Django、Ajax、Jquery 信息
  • 关系模型
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对 MERN Stack 等 Web 和 API 解决方案进行身份验证和授权的最佳方式是什么? 的相关文章

随机推荐

  • Linux 中是否有可以唯一标识 VM 实例的 UUID 类型值?

    我有一个在 Linux 中运行的应用程序 每个人都会尝试从操作系统获取 UUID 并向中央服务器报告 我想确保所有实例都使用全局唯一的 UUID 运行 如果 Linux 位于裸机上 则它只能读取 UUID 例如 从 dmidecode 命令
  • 解析 Coldfusion 字符串内的变量

    我的客户有一个电子邮件正文数据库表 这些电子邮件正文在特定时间发送给客户 电子邮件的文本包含 ColdFusion 表达式 例如 Dear firstName 等 这些电子邮件是 HTML 它们还包含各种 HTML 标记 我想做的是将数据库
  • 展平嵌套元组

    我有一个元组列表 其中一些是嵌套的 name 6 9 0 2 4 link name 7 8 9 0 5 link 我想取消列表中每个项目的内部元组的嵌套 但保留外部元组 name 6 9 0 2 4 link name 7 8 9 0 5
  • 使用 Android Studio 构建简单的 Android 应用程序时出现 java.security.NoSuchAlgorithmException

    我下载了 Android Studio 并尝试构建一个简单的登录活动 但 Make 项目因此错误而失败 Environment Windows 7 64 bit 摇篮 写入输出时遇到问题 java security NoSuchAlgori
  • Vista/7 UAC:如何降低进程权限

    进程是否可以将自身从提升的 UAC 权限降低回标准用户 如果不是 提升的进程是否可以使用标准用户令牌启动其副本 然后自行终止 有代码示例吗 C 优先 Details 问题 用户安装我的产品 用 C 编写 安装程序将其 UAC 权限提升为管理
  • 如何杀死Android中当前正在运行的任务

    我正在尝试在 Android 中构建一个任务杀手类型的应用程序 我可以使用显示当前正在运行的任务列表活动管理器但在杀死任务时面临问题 这是我正在做的获取当前正在运行的任务列表的操作 ActivityManager am ActivityMa
  • 无需按 CTRL 键即可多选列表框

    我认为这很容易做到 但我找不到方法 我有一个列表框 选择模式设置为多个 但用户希望能够选择多个项目而不必按 CTRL 有谁知道一个简单的方法来做到这一点 谷歌了一下 发现以下内容 http www erichynds com jquery
  • 使用 jquery.append 时如何防止 XSS/注入?

    我正在为我网站上的用户制作一个 JavaScript 代码编辑器 我构建的功能之一是自定义控制台 用户可以在代码中编写 console log 记录的字符串将附加到页面上的 div 中 执行如下操作 function toConsole s
  • 如何在 Swift 3 中将核心数据导出到 CSV?

    我想导出我的实体 Log 的所有数据 我找到了这个代码示例 https gist github com kenechilearnscode 2d5d35f550f593332319但这对我不起作用 它不添加核心数据的数据 我得到的唯一输出是
  • 在登录时将多个身份验证提供商与 Firebase 链接

    我希望在用户登录应用程序时链接多个身份验证提供商 Firebase 文档提供了一种将新的身份验证提供程序与已登录的身份验证提供程序链接的方法 但我希望在登录 注册时进行链接 以便用户可以选择任何身份验证提供程序 而无需手动链接它们 对此有何
  • Python正则表达式匹配所有5位数字但不匹配更大的数字

    我正在尝试将分布在 HTML 网页中的 5 位优惠券代码进行字符串匹配 例如 53232 21032 40021等等 我可以处理任何 5 位数字符串的简单情况 0 9 5 尽管这也匹配 6 7 8 n 位数字 有人可以建议我如何修改这个正则
  • 重新运行不稳定的 JUnit 测试,以防失败

    我在 Jenkins 中有一个工作 A 用于我的自动化测试 如果另一个工作 B 构建成功 就会触发该测试 作业 A 运行多个测试 有些测试很不稳定 所以我想再次运行它们几次 让它们有机会通过 这样我的构建就不会不稳定 失败 有什么插件我可以
  • gdb 失败并出现“无法找到进程 ID 的 Mach 任务端口”错误

    我的应用程序运行良好 但 gdb 无法调试它并出现以下错误 gdb run Starting program path to app Unable to find Mach task port for process id 83767 os
  • BLE 连接后未调用 didDiscoverServices

    我正在使用需要验证的 BLE 设备 我使用的BLE代码如下 Pragma Bluetooth Methods func centralManagerDidUpdateState central CBCentralManager if cen
  • alamofire multipartformdata 使用 urlrequest

    我想使用Alamo火多部分表单数据使用请求 例如我使用上传API let profile self photoView imageView image let parameters String String homePageUrl web
  • 如何用CSS将图像放入div中?

    我希望将所有图像都放在 CSS 中 我知道的唯一方法是将它们作为背景图像放入 但这个解决方案的问题是你永远不能让 div 占据图像的大小 所以我的问题是 最好的方法是什么 div img src div in CSS 这个答案由Jaap d
  • R 中的等值线地图 - TIGER Shapefile 问题

    有一个关于使用 R 进行绘图的问题 特别是有关 R 中的分区统计图的问题 我有一个分配给某个区域的邮政编码数据集和一些相关数据 数据集是here 我的最终数据格式是 区域 ID 邮政编码 概率值 客户计数 区域概率和区域客户总数 我试图通过
  • CakePHP HABTM 表单提交

    我有两张桌子 questions and tags 具有 HABTM 关系 添加问题时 我希望能够为问题指定一个标签 这只是第一个标签 以后可以添加更多标签 标签是从他们的桌子上拉出来的 如何配置我的应用程序 以便在添加问题并指定标签时 连
  • Django 模型中的任意类型数据

    我有一个模型 比如说 Item 我想在其上存储任意数量的属性 例如标题 描述 发布日期 我希望它们不仅仅是字符串 还有 python 类型 所以字符串 布尔值 日期时间等 我在这里有什么选择 由于所有值的数据库类型相同 因此具有单独的名称
  • 对 MERN Stack 等 Web 和 API 解决方案进行身份验证和授权的最佳方式是什么?

    我正在尝试找到实施授权的最佳方法 此时 我唯一需要的是一个简单的免费帐户 但稍后我可能会包含使用 Stripe 等支付系统的 高级 帐户的用户角色 我已经开始阅读和尝试 Auth0 但后来发现了一些其他方法可以做到这一点 Passport