想象一下由OAuth2保护的DataProvider。此DataProvider接受来自多个OpenId Provider的OAuth2令牌。 当RP(客户端)使用访问令牌调用该数据提供程序时,数据提供程序如何知道该数据提供程序要联系以检查访问令牌?
答案 0 :(得分:1)
OAuth 2.0的设计环境是资源服务器(RS,您称为DataProvider)和授权服务器(AS,您称为OpenID Provider)位于同一安全域中。
使用提示从多个AS中查找AS是非标准行为。假设所有AS将使用相同的访问令牌类型,格式和声明,例如范围也是一个延伸。 UMA 2.0(Auth 2.0的配置文件)实际上可以在https://docs.kantarainitiative.org/uma/ed/uma-core-2.0-01.html处提供帮助,但并未得到广泛采用。
一种更好的体系结构方法是在您的域中设置一个AS服务器,该服务器发布从远程AS锁定的访问令牌。
或者,您也可以实现OAuth 2.0的OpenID Connect配置文件(OAuth 2.0之上的身份层),该配置文件允许进行多提供商设置,因为其中的id_token
可以通过{{ 1}}的声明中,对提供者的引用以及与提供者域中所谓的UserInfo端点的交互已标准化。
答案 1 :(得分:0)
创建一个可以接受来自多个发行者的OAuth令牌的后端是可行的。为此,您需要一个层来过滤掉请求并验证访问令牌。如果您来自JAVA EE,那么可以将其视为保护所有OAuth保护的端点(例如Servlet)的过滤器。
选择授权服务器(颁发OAuth令牌的一方)的选择有几种方法。
首先,请求发送者(可能是客户端)可以将带有OAuth令牌的提示传递给数据提供者。您可以在与客户和数据提供者(服务器端)事先达成协议的情况下使用专用报头。例如,auth-source:azure-ad
表示OAuth令牌是由azure广告授权服务器发布的。请注意,在这种方法中,您还需要就支持的标头值达成共识。
第二个方法是通过颁发者声明(iss
声明)检测授权服务器。为此,您的访问令牌必须为JWT格式。根据当前情况,许多服务都以JWT格式发布访问令牌(例如:A zure AD does this)。作为自包含令牌的JWT应该包含iss
声明,该声明表示JWT issuer,即授权服务器。