繁体   English   中英

OAuth2:客户端凭据流

[英]OAuth2: Client Credentials flow

问题:我目前正在致力于为客户端提供 REST Api(在这种情况下,客户端不是订购文章的普通最终用户,而是与我的系统通信的客户端的 Web Api)。 为了在我的系统中订购不同的产品,每个客户可能针对每个国家分别拥有多个帐户。 身份验证是通过将客户端的 WebApi 应用程序身份验证到我的系统(机器对机器)来完成的。 所以看起来这应该使用基于文章https://docs.microsoft.com/en-us/azure/active-directory/develop/authentication-flows-app-scenarios#scenarios- 的OAuth2 客户端凭据流来完成-supported-authentication-flows,但我对每个国家/地区的客户帐户问题分别表示怀疑。

问题:这应该通过为每个国家/地区的每个客户账户分别创建一个 ClientId 和 ClientSecret 来解决,或者,应该创建一个客户账户,而国家应该在每次请求 Api 或添加国家之前由客户发送作为访问令牌的范围或声明。 此外,我不确定在这种情况下 Client Credentials Flow 是否是一个不错的选择,因此我将非常感谢您提供任何建议。

客户

理想情况下,每个客户公司都应该拥有一个用于获取访问令牌的客户凭证。 在某些情况下,例如当有不同的法律细分时,这可以扩展。 默认情况下使用单个值,但您需要了解您的客户。

如果需要,公司之间的客户端凭据流可以涉及更强的凭据,例如 JWT 客户端断言或相互 TLS - 如本高级教程中所示

索赔

在您的系统中,您应该将授权所需的域特定数据映射到每个客户端 ID。 这可能包括对产品的特定国家/地区访问或对您的场景有意义的任何内容。

然后,该数据可以在发布时包含在访问令牌中,或者在首次收到访问令牌时进行查找,然后缓存以用于具有相同令牌的后续请求。 我的授权博客文章的第 3 步在这里解释了几个设计模式。

API 请求

客户端如何获取 API 请求中的数据很有趣:

  • 呼叫者是否拥有所有国家/地区的数据? 如果是这样,让他们在 API 请求期间通过国家/地区参数选择他们想要的数据。

  • 如果 API 客户端永远无法查看某个国家/地区的数据,则表明至少在某些情况下,每个国家/地区需要不同的客户端。

概括

根据对这些公司有意义的内容来定义客户。 避免客户端激增,以便管理同一数据所有者的访问权限。 确切的解决方案取决于您的领域特定要求。 OAuth 是一个旨在适应的框架。

如果您的整个现有数据模型孤岛都按照帐户的概念划分“国家/地区”,那么每个帐户的一组凭据可能是最简单的。

但在我看来,您的数据模型并没有完全捕捉到您的实际业务。 在我看来,您有一个“客户/客户”的概念,可以访问多个“帐户”中的一个,每个帐户代表一个国家/地区。

因此,一种更正确的建模方法可能是构建您的 API,以便单个 API 客户端可以访问所有相关帐户,并且您的 API 可能应该进行结构化,以便以某种方式传递accountId的想法(通常在 URL 中)用于 REST api)。 例如,每个 API 端点都可以以/account/123为前缀。

对我来说,这更像是一个数据建模和 API 架构问题,而不是任何特定于 OAuth2 的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM