如何额外保护已使用 OAuth 2.0 访问令牌的 REST 服务?

2024-03-26

我有以下 REST 服务:

  • An 聚合器暴露于外界的服务。它由用户 OAuth 2.0 访问令牌保护。这聚合器称为Internal服务。
  • The Internal服务是在网络级别的not暴露于外界。它还由同一用户 OAuth 2.0 访问令牌保护。访问令牌是从聚合器 to the Internal服务。

现在我们来说说Internal服务意外地暴露于外界。理论上,用户可以对Internal不应允许的服务。

有没有办法额外保护Internal服务,以便用户无法访问它,即使它会意外暴露给他们?

是否可能或明智地同时使用机器对机器 (M2M) 令牌和用户令牌来保护Internal服务?


最正确的 OAuth 设计方法是使用范围和声明。这样做可以有效地允许访问令牌和用户身份在微服务之间流动,并提供正确的保护并且没有安全问题。最好通过一个例子来解释。

SCENARIO

考虑在线销售业务场景。客户端与订单服务交互,订单服务调用计费服务。客户端不调用计费服务,但用户启动的操作在那里执行。

访问代币流

OAuth 标准未定义范围的设计方式。通常它们是由架构师设计的,用于端到端的业务流程。此处显示了一个示例,其中每个 API 都会接收并验证每个请求的 JWT 访问令牌。请注意,有时客户端会发送不同的凭证,例如 cookie 或引用令牌,但这些凭证会转换为 JWT 访问令牌,然后传递给 API。

用户身份从 Orders API 流向 Billing API。由于它使用 JWT 格式,因此它仍然是可验证和可审计的。这两个 API 都会以零信任的方式验证每个请求的 JWT。

API 还会检查所需的范围。在此示例中,我使每个微服务的范围相同,因为它们都覆盖相同的业务领域。计费 API 可能只允许此范围用于创建发票操作。如果访问令牌发送到任何其他计费端点或范围不足的任何其他 API,则会立即拒绝并显示 403 禁止响应。为了创建发票,计费 API 可能会添加其他限制,例如与检查有效负载中的订单 ID 相关的限制。

JWT 验证后,API 信任令牌中的声明并将其用于业务授权。这将根据用户身份、角色和其他值锁定用户可以执行的操作。因此,如果用户能够使用浏览器工具提取其 API 凭据并使用 Postman 等工具重播它,他们应该获得与在 UI 会话中获得的 API 完全相同的访问权限。

更高权限的操作

这些 API 也将被其他用户和客户端使用,他们可能需要调用更高权限的操作。接下来考虑几个调用相同 API 的员工应用程序,这些应用程序也可能会暴露在互联网上。这些可能允许更高的权限并需要多重身份验证:

在这里,我也使用了层次范围,例如sales:payments,这是设计 API 端点访问的一种可能的技术。不过,范围仍然是高级别的,并且只管理入门级安全性。

其他选项

流动代币还有更高级的选项。例如,OAuth 令牌交换 https://datatracker.ietf.org/doc/html/rfc8693可用于在调用上游 API 之前为同一用户获取不同的令牌。最常见的是,这用于为同一用户获取范围缩小的另一个令牌。

可以为上游 API 获取具有完全不同范围的令牌,但这样做在某些情况下可能会削弱安全性。执行此操作的解决方案通常使用客户端凭据流来获取具有以下范围的令牌billing,然后在不可验证的标头或 URL 路径段中传递用户 ID。因此,令牌可能有权访问太多用户的数据,并且拥有此类令牌的恶意方可能会更改用户 ID。

单独的基础设施解决方案(例如计费 API 需要相互 TLS)也存在一些问题。他们可能会阻止真正的客户端访问该 API。这可能与企业主的愿望背道而驰。在上面的示例中,它将阻止财务应用程序调用 Billing API。

SUMMARY

如果您需要的话,基础设施解决方案可能是最好的短期战术解决方案。不过,作为未来的方向,目标是通过以最佳方式使用范围和声明来使用 OAuth 提供的零信任成分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何额外保护已使用 OAuth 2.0 访问令牌的 REST 服务? 的相关文章

随机推荐

  • 在 PHP 中将十六进制转换为图像?

    我正在开发通过以下方式与服务器通信的移动应用程序PHP Webservice 这是我第一次使用 PHP 我设法将数据上传到数据库 现在我需要发送图像以将其存储在 ftp 服务器中 为此我转换了image gt hex并从我的应用程序发送 服
  • 如何在安装时强制 Chrome 扩展上的键盘快捷键

    我正在尝试实现一个使用键盘快捷键触发事件的 Chrome 扩展 快捷方式在这里声明 commands sample suggested key default Ctrl I windows Ctrl I description Refres
  • emacs autoloaded 中保证自动加载功能的机制是什么

    我知道所有标有 Autoload 行的函数都将是自动加载函数 但问题是执行此 自动加载函数 的底层机制是什么 还有为什么当从 elpa 安装软件包时 会出现一个名为 XXX autoload elc 的编译文件 当您安装 Elpa 软件包时
  • Php变量存储字符串时的大小限制是多少?

    情况是这样的 我有一个 2Gb 的转储文件 名为myDB sql 它是一个转储文件 可删除现有数据库并创建一个带有视图和触发器的新数据库 所以我有字符串myDB OLD分布在许多行代码中 我想将这些字符串的出现次数更改为myDB NEW 我
  • Google reCAPTCHA、405 错误和 CORS 问题

    我正在使用 AngularJS 并尝试使用 Google 的 reCAPTCHA 我正在使用 显式呈现 reCAPTCHA 小部件 在我的网页上显示 reCAPTCHA 的方法 HTML 代码
  • 如何使用 ListView 呈现具有多个行跨列的数据表

    我需要在 html 表中显示数据库中的数据 我目前正在使用 ListView 控件 我希望最终的 HTML 表呈现如下所示的内容 其中某些行有一个rowspan属性大于一 原因是有些字段有几行信息 但对应同一个逻辑条目 例如 data da
  • 实现 Win32 消息循环并使用 P/Invoke 创建 Window 对象

    我的主要目标是纯粹使用以下方法实现正确的消息循环P Invoke http en wikipedia org wiki Platform Invocation Services能够处理 USB HID 事件的调用 当然 它的功能应该与以下代
  • vis.js - 如何运行 getSeed() 方法

    我正在使用 vis js 创建一些数据地图 在文档中它说 理想情况下 你尝试使用未定义的种子 重新加载 直到你满意为止 与布局并使用getSeed 确定种子的方法 然而 对于我的一生 我无法弄清楚如何 使用getSeed 方法 我认为它是一
  • 了解 Deferred.pipe()

    我一直在阅读有关 jQuery 中的 deferreds 和 Promise 的内容 但我还没有使用过它 除了方法管道之外 我已经很好地理解了一切 我实在没明白那是什么 有人可以帮助我了解它的作用以及它可以在哪里使用吗 我知道有一个问题的标
  • Angular2 - 多个组件中的“监视”提供程序属性

    我来自 NG1 环境 目前我正在创建具有所有可用功能的 NG2 应用程序 在提出这个问题之前 我正在探索 google 和 stackoverflow 的问题 但没有运气 因为 Angular 2 的 api 架构发展得如此之快 而且大多数
  • ASP.NET Web 部署失败;项目中不存在 AddScheduledJob

    我有一个包含两个 WebJobs 的 ASP NET 项目 其中一个 WebJobs 可以正常发布 但第二个 WebJobs 无法发布 并且收到以下错误消息 项目中不存在目标 AddScheduledJob 两个 WebJobs 都设置为
  • R - 根据多个条件匹配来自 2 个数据帧的值(当查找 ID 的顺序是随机时)

    嗨我有两个数据框 df1 data frame PersonId1 c 1 2 3 4 5 6 7 8 9 10 1 PersonId2 c 11 12 13 14 15 16 17 18 19 20 11 Played together
  • 每条路由的 NancyFx 身份验证

    从我在源代码中看到的 RequiresAuthentication 对整个模块进行身份验证检查 有什么办法可以按路线执行此操作吗 我有同样的问题 然而事实证明RequiresAuthentication在模块级别和路由级别都有效 为了演示
  • CollapsingToolBarLayout 无法实例化

    在过去的几个月里 我一直在使用折叠工具栏布局 没有任何问题 然而今天 每当我打开 xml 文件时都会弹出此错误 确切的错误如下 以下类无法实例化 android support design widget CollapsingToolbar
  • Angular 通用 - 为客户端缓存的服务器端请求

    我看过很多关于在角度通用应用程序中缓存客户端数据的文章 因此它不会重复客户端上已在服务器上解析的请求 我只是不明白数据如何从服务器传输到客户端 我是否将 JSON 注入到预渲染的 HTML 中 还是缺少其他内容 从 Angular 5 开始
  • 如何获取已安装打印机的列表?

    我正在寻找获取已安装打印机列表的可能性 我在 Windows 操作系统中使用 JDK 1 6 有谁知道解决方案吗 先感谢您 只是想添加一个小片段 import javax print class Test public static voi
  • Xcode 4 - 一键构建多个设备?

    在 Xcode 4 中 是否可以通过某种方式进行设置 以便通过单击左上角的 运行 按钮 可以一键将 Xcode 构建到多个设备 这会节省很多时间 不断地点击 构建到iPhone 然后构建到 iPod 然后依次点击 构建到iPad 一键完成所
  • 等待 puppeteer 中的过渡结束

    我正在尝试使用 Puppeteer 测试网站 不幸的是 我在单击工具栏中的元素时遇到问题 工具栏使用 CSS 过渡来优雅地滑入页面 我的代码失败 因为我在页面仍在动画时单击元素将出现的位置 我使用超时作为解决方法 但必须有一个更优雅的解决方
  • 如何选择字段总和大于 MongoDB 中的值的位置

    使用 MongoDB 我将如何编写这个常规 SQL 语句 SELECT FROM table WHERE field1 field2 field3 gt 1 我一直在搞乱 group project add 等 我觉得我在围绕解决方案跳舞
  • 如何额外保护已使用 OAuth 2.0 访问令牌的 REST 服务?

    我有以下 REST 服务 An 聚合器暴露于外界的服务 它由用户 OAuth 2 0 访问令牌保护 这聚合器称为Internal服务 The Internal服务是在网络级别的not暴露于外界 它还由同一用户 OAuth 2 0 访问令牌保