3. Obtaining Authorization Server Metadata (获取授权服务器元数据)
支持元数据的授权服务器必须 (MUST) 在通过将众所周知的 URI 字符串插入授权服务器的发行者标识符的主机组件和路径组件 (如果有) 之间形成的路径上,提供一个包含第 2 节中指定的元数据的 JSON 文档. 默认情况下,使用的众所周知的 URI 字符串是 /.well-known/oauth-authorization-server. 此路径必须 (MUST) 使用 "https" 方案. ".well-known" 的语法和语义在 RFC 5785 [RFC5785] 中定义. 使用的众所周知的 URI 后缀必须 (MUST) 在 IANA "Well-Known URIs" 注册表 [IANA.well-known] 中注册.
以特定于应用程序的方式使用 OAuth 授权服务器的不同应用程序可以定义和注册不同的众所周知的 URI 后缀,用于发布这些应用程序使用的授权服务器元数据. 例如,如果示例应用程序以特定于示例的方式使用 OAuth 授权服务器,并且需要发布特定于示例的元数据值,则它可能会注册并使用 "example-configuration" URI 后缀,并通过在授权服务器的发行者标识符的主机和路径组件之间插入 /.well-known/example-configuration 来发布元数据文档. 或者,许多此类应用程序将使用默认的众所周知的 URI 字符串 /.well-known/oauth-authorization-server,这是通用 OAuth 授权服务器的正确选择,而不注册特定于应用程序的字符串.
使用本规范的 OAuth 2.0 应用程序必须 (MUST) 指定它将为此目的使用哪个众所周知的 URI 后缀. 同一授权服务器可以 (MAY) 选择在从其发行者标识符派生的多个众所周知的位置发布其元数据,例如,在 /.well-known/example-configuration 和 /.well-known/oauth-authorization-server 两处发布元数据.
一些 OAuth 应用程序将选择使用众所周知的 URI 后缀 "openid-configuration". 如第 5 节所述,尽管标识符 /.well-known/openid-configuration 看起来是 OpenID 特定的,但它在本规范中的使用实际上是指一般的 OAuth 2.0 功能,而不是特定于 OpenID Connect 的.
3.1. Authorization Server Metadata Request (授权服务器元数据请求)
授权服务器元数据文档必须 (MUST) 使用 HTTP "GET" 请求在先前指定的路径上查询.
当发行者标识符为 https://example.com 且众所周知的 URI 后缀为 "oauth-authorization-server" 时,客户端将发出以下请求以获取元数据,因为发行者标识符不包含路径组件:
GET /.well-known/oauth-authorization-server HTTP/1.1
Host: example.com
如果发行者标识符值包含路径组件,则在主机组件和路径组件之间插入 /.well-known/ 和众所周知的 URI 后缀之前,必须 (MUST) 删除任何终止的 "/". 当发行者标识符为 https://example.com/issuer1 且众所周知的 URI 后缀为 "oauth-authorization-server" 时,客户端将发出以下请求以获取元数据,因为发行者标识符包含路径组件:
GET /.well-known/oauth-authorization-server/issuer1 HTTP/1.1
Host: example.com
使用路径组件可以支持每个主机多个发行者. 在某些多租户托管配置中这是必需的. ".well-known" 的这种使用是为了支持每个主机多个发行者; 与其在 RFC 5785 [RFC5785] 中的使用不同,它不提供关于主机的一般信息.
3.2. Authorization Server Metadata Response (授权服务器元数据响应)
响应是一组关于授权服务器配置的声明,包括所有必要的端点和公钥位置信息. 成功的响应必须 (MUST) 使用 200 OK HTTP 状态码,并返回一个使用 "application/json" 内容类型的 JSON 对象,该对象包含一组声明作为其成员,这些声明是第 2 节中定义的元数据值的子集. 也可以 (MAY) 返回其他声明.
返回多个值的声明表示为 JSON 数组. 具有零个元素的声明必须 (MUST) 从响应中省略.
错误响应使用适用的 HTTP 状态码值.
以下是非规范性的示例响应:
HTTP/1.1 200 OK
Content-Type: application/json
{
"issuer":
"https://server.example.com",
"authorization_endpoint":
"https://server.example.com/authorize",
"token_endpoint":
"https://server.example.com/token",
"token_endpoint_auth_methods_supported":
["client_secret_basic", "private_key_jwt"],
"token_endpoint_auth_signing_alg_values_supported":
["RS256", "ES256"],
"userinfo_endpoint":
"https://server.example.com/userinfo",
"jwks_uri":
"https://server.example.com/jwks.json",
"registration_endpoint":
"https://server.example.com/register",
"scopes_supported":
["openid", "profile", "email", "address",
"phone", "offline_access"],
"response_types_supported":
["code", "code token"],
"service_documentation":
"http://server.example.com/service_documentation.html",
"ui_locales_supported":
["en-US", "en-GB", "en-CA", "fr-FR", "fr-CA"]
}
3.3. Authorization Server Metadata Validation (授权服务器元数据验证)
返回的 "issuer" 值必须 (MUST) 与授权服务器的发行者标识符值完全相同,该值被插入众所周知的 URI 字符串以创建用于检索元数据的 URL. 如果这些值不完全相同,则禁止 (MUST NOT) 使用响应中包含的数据.