跳到主要内容

3. 获取授权服务器元数据

支持元数据的授权服务器必须 (MUST) 在一个路径上提供包含第 2 节所规定元数据的 JSON 文档; 该路径通过把知名 URI 字符串插入授权服务器的签发者标识符中, 位置在主机组件和路径组件 (如果有) 之间. 默认使用的知名 URI 字符串是 /.well-known/oauth-authorization-server. 该路径必须 (MUST) 使用 "https" 方案. ".well-known" 的语法和语义在 RFC 5785 [RFC5785] 中定义. 所使用的知名 URI 后缀必须 (MUST) 注册到 IANA "Well-Known URIs" 注册表 [IANA.well-known].

以应用特定方式使用 OAuth 授权服务器的不同应用可以 (MAY) 定义并注册不同的知名 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. 授权服务器元数据请求

授权服务器元数据文档必须 (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. 授权服务器元数据响应

响应是一组关于授权服务器配置的声明, 包括所有必要端点和公钥位置信息. 成功响应必须 (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. 授权服务器元数据验证

返回的 "issuer" 值必须 (MUST) 与授权服务器的签发者标识符值完全相同; 该标识符中插入了知名 URI 字符串, 用于创建获取元数据的 URL. 如果这些值不完全相同, 则不得 (MUST NOT) 使用响应中包含的数据.