如何用 OIDC/OAuth 保护 API

How to secure an API with OIDC/OAuth

我试图更好地理解如何利用 OIDC/OAuth 来保护 restful API,但我总是迷失在术语中。此外,当我研究这个问题时,大多数答案都是针对单页应用程序的,因此出于这个问题的目的,假设 API 不会用于 SPA。

假设:

问题:

听起来这些是要求,如果我没有误会你的话。该解决方案不仅包含您自己的代码,而且更像是一个数据建模问题,而不是 OAuth 问题。

R1:贵公司向业务合作伙伴API提供

R2。业务合作伙伴从他们自己的应用程序中调用它,他们可以按照自己认为合适的方式开发这些应用程序

R3。用户身份验证将由每个业务合作伙伴管理,从而为每个用户提供唯一的 ID

R4。您需要将这些用户ID映射到您自己系统中的用户+资源

OAUTH

合作伙伴应用程序应使用客户端凭据流获取访问令牌以调用 API。每个业务合作伙伴都会为其用户组使用不同的凭据。

使用自己的 IDP 来存储用户似乎没有意义,因为您似乎与实际最终用户没有身份验证关系。

默认情况下,颁发给业务合作伙伴的访问令牌不会特定于用户。可以在访问令牌中包含用于标识用户的自定义声明 - 这必须以自定义方式开发,例如通过自定义 header,因为它不是客户端凭证流的一部分。

访问令牌将以标准的 OAuth 方式进行验证,以识别合作伙伴 - 可能还有最终用户。

数据

在您自己的系统中为用户建模以具有这些字段,然后存储资源(例如订单)映射到用户 ID:

  • 用户 ID(您生成的值)
  • 合作伙伴 ID(用户来自的公司)
  • 外部用户 ID(合作伙伴易于提供的 ID)

通常,每个合作伙伴在您的其中一个数据库表中也会有一个条目,其中包括客户 ID、姓名等。

如果您不能在访问令牌中包含自定义用户 ID 声明,合作伙伴必须在调用 API 时告诉您他们正在操作的用户,并提供外部用户 ID:

  • POST /users/2569/orders

您的 API 授权需要确保合作伙伴 A 的调用无法访问合作伙伴 B 的任何资源。在上面的数据中,您拥有启用此功能所需的所有字段。

摘要

所以感觉您需要为自己的 API 定义接口,这取决于它们将如何从合作伙伴应用程序的后端调用。希望以上提示对此有所帮助。