从一个 API 调用另一个 API
作为开发人员,如何在一个 API 需要调用另一个 API 时确保零信任? 在本文中,你将了解如何代表用户安全地开发应用程序。
当用户驱动应用的 UI 时,应用可能会使用委托的权限,以使 API 知道哪个用户代表应用工作。 它将检查应用在调用 API 时提供的访问令牌中的主题(子)声明或对象 ID (oid) 和租户 ID (tid) 声明。 API 不依赖不受信任的应用,这只是来自网络上某个位置的调用。 相反,它会验证令牌,以确保 API 仅代表 Microsoft Entra ID 已验证的应用用户工作。
当一个 API(我们将其称为“原始 API”)调用另一个 API 时,我们调用的 API(我们将其称为“下游 API”)必须遵循上述验证过程。 下游 API 不能依赖不受信任的网络来源。 它必须从经过正确验证的访问令牌获取用户标识。
如果下游 API 未遵循正确的验证流程,下游 API 必须依靠原始 API 以另一种方式提供用户的标识。 下游 API 可能会错误地使用应用程序权限执行该操作。 然后,原始 API 将成为用户对下游 API 可实现哪些结果的唯一授权。 原始 API 可以有意(或无意)地允许用户完成用户以其他方式无法完成的任务。 例如,一个用户可以更改另一个用户的详细信息,或者读取和更新用户无权访问的文档。 不正确的验证可能会导致严重的安全问题。
为了提高安全性,原始 API 获取委托的权限访问令牌,以便在原始 API 进行调用时提供给下游 API。 我们来看看如何执行。
客户端应用获取访问令牌以调用原始 API
下图显示了客户端应用和原始 API。
客户端应用程序获取了原始 API 的委托权限访问令牌(由带“a”标签的五边形表示)。 委托的权限访问令牌允许它代表用户调用需要授权的原始 API。
客户端应用向原始 API 提供访问令牌
以下动画显示了客户端应用向原始 API 提供访问令牌。 原始 API 完全验证并检查访问令牌,以确定客户端应用用户的标识。
原始 API 执行令牌验证和强制实施
下一个动画显示,在客户端应用向原始 API 提供访问令牌后,原始 API 将执行令牌验证和强制实施。 如果一切正常,API 会继续为客户端应用的请求提供服务。
原始 API 无法使用访问令牌调用下游 API
下面的动画显示原始 API 现在想要调用下游 API。 但是,原始 API 无法使用访问令牌调用下游 API。
原始 API 返回到 Microsoft Entra ID
在下面的动画中,原始 API 需要返回到 Microsoft Entra ID。 它需要访问令牌以代表用户调用下游 API。
下一个动画显示了原始 API,它可提供原始 API 从客户端应用接收的令牌以及原始 API 的客户端凭据。
Microsoft Entra ID 会检查同意或条件访问实施等事项。 你可能必须返回到调用方客户端,并提供无法获取令牌的原因。 通常使用声明质询流程返回到调用应用程序,并解释未收到同意(例如,与条件访问策略相关)。
Microsoft Entra ID 执行检查
在下面的动画中,Microsoft Entra ID 执行其检查。 如果一切正常,Microsoft Entra ID 会向原始 API 颁发访问令牌,以允许它代表用户调用下游 API。
原始 API 拥有代理流的用户上下文
下面的动画演示了代表流 (OBO) 过程,该过程允许该 API 在调用下游 API 时继续具有用户上下文。
原始 API 调用下游 API
在下一个动画中,我们调用下游 API。 下游 API 接收的令牌具有指示下游 API 的合适受众 (aud) 声明。
该令牌包括授予同意的范围和原始应用程序用户标识。 下游 API 可以正确实现有效权限,以确保已标识的用户有权完成请求的任务。 你希望使用代表流为一个 API 获取令牌来调用另一个 API,以确保用户上下文传递到所有下游 API。
最佳选项:原始 API 执行代理流
最后一个动画显示,最佳选项是让原始 API 执行代理流 (OBO)。 如果下游 API 收到正确的令牌,则它可以正确响应。
当 API 代表用户操作并需要调用另一个 API 时,API 必须使用 OBO 来获取委托的权限访问令牌,以代表用户调用下游 API。 当 API 代表用户执行操作时,API 绝不应使用应用程序权限来调用下游 API。
后续步骤
- Microsoft 标识平台身份验证流和应用方案介绍了身份验证流以及使用这些流的应用程序方案。
- API 保护描述了通过注册保护 API、定义权限和同意,以及强制实施访问权限,以实现零信任目标的最佳做法。
- 受 Microsoft 标识同意框架保护的 API 示例可帮助你设计最低特权应用程序权限策略,以获得最佳用户体验。
- 自定义令牌介绍了可以在 Microsoft Entra 令牌中接收的信息。 它说明了如何自定义令牌以提高灵活性和控制度,同时提高最低特权下的应用程序零信任安全性。
- 使用 Microsoft 标识保护自定义 API 学习模块介绍了如何使用 Microsoft 标识保护 Web API 以及如何从另一个应用程序调用它。
- 应用程序属性的安全最佳做法 介绍了重定向 URI、访问令牌、证书和机密、应用程序 ID URI 和应用程序所有权。
- Microsoft 标识平台身份验证库介绍了 Microsoft 身份验证库对多种应用程序类型的支持。