本站(springdoc.cn)中的内容来源于 spring.io ,原始版权归属于 spring.io。由 springboot.io - Spring Boot中文社区 进行翻译,整理。可供个人学习、研究,未经许可,不得进行任何转载、商用或与之相关的行为。 商标声明:Spring 是 Pivotal Software, Inc. 在美国以及其他国家的商标。

OAuth2 授权端点

OAuth2AuthorizationEndpointConfigurer 提供了定制 OAuth2 授权端点 的能力。它定义了一些扩展点,让你自定义 OAuth2授权请求的预处理、主要处理和后处理逻辑。

OAuth2AuthorizationEndpointConfigurer 提供以下配置选项。

@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
	OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
		new OAuth2AuthorizationServerConfigurer();
	http.apply(authorizationServerConfigurer);

	authorizationServerConfigurer
		.authorizationEndpoint(authorizationEndpoint ->
			authorizationEndpoint
				.authorizationRequestConverter(authorizationRequestConverter)   (1)
				.authorizationRequestConverters(authorizationRequestConvertersConsumer) (2)
				.authenticationProvider(authenticationProvider) (3)
				.authenticationProviders(authenticationProvidersConsumer)   (4)
				.authorizationResponseHandler(authorizationResponseHandler) (5)
				.errorResponseHandler(errorResponseHandler) (6)
				.consentPage("/oauth2/v1/authorize")    (7)
		);

	return http.build();
}
1 authorizationRequestConverter(): 添加一个 AuthenticationConverter(预处理器),当试图从 HttpServletRequest 中提取 OAuth2授权请求(或consent)到 OAuth2AuthorizationCodeRequestAuthenticationTokenOAuth2AuthorizationConsentAuthenticationToken 的实例时使用。
2 authorizationRequestConverters(): 设置 Consumer,提供对默认和(可选)添加的 AuthenticationConverter List 的访问,允许添加、删除或定制特定的 AuthenticationConverter 的能力。
3 authenticationProvider(): 添加一个 AuthenticationProvider(主处理器),用于验证 OAuth2AuthorizationCodeRequestAuthenticationTokenOAuth2AuthorizationConsentAuthenticationToken
4 authenticationProviders(): 设置 Consumer,提供对默认和(可选)添加的 AuthenticationProvider List 的访问,允许添加、删除或定制特定的 AuthenticationProvider
5 authorizationResponseHandler(): AuthenticationSuccessHandler(后处理器),用于处理 "已认证" 的 OAuth2AuthorizationCodeRequestAuthenticationToken 并返回 OAuth2AuthorizationResponse
6 errorResponseHandler(): AuthenticationFailureHandler(后处理器),用于处理 OAuth2AuthorizationCodeRequestAuthenticationException,并返回 OAuth2Error 响应
7 consentPage(): 自定义同意(consent)页面的 URI,如果在授权请求流程中需要同意,则将资源所有者重定向至此。

OAuth2AuthorizationEndpointConfigurer 配置 OAuth2AuthorizationEndpointFilter,并将其与 OAuth2 授权服务器 SecurityFilterChain @Bean 注册。OAuth2AuthorizationEndpointFilter 是处理OAuth2 授权请求(和consent)的filter。

OAuth2AuthorizationEndpointFilter 配置的默认值如下。

  • AuthenticationConverter — 一个由 OAuth2AuthorizationCodeRequestAuthenticationConverterOAuth2AuthorizationConsentAuthenticationConverter 组成的 DelegatingAuthenticationConverter

  • AuthenticationManager — 一个由 OAuth2AuthorizationCodeRequestAuthenticationProviderOAuth2AuthorizationConsentAuthenticationProvider 组成的 AuthenticationManager

  • AuthenticationSuccessHandler — 一个内部实现,处理一个 "已认证" 的 OAuth2AuthorizationCodeRequestAuthenticationToken 并返回 OAuth2AuthorizationResponse

  • AuthenticationFailureHandler — 一个内部实现,使用与 OAuth2AuthorizationCodeRequestAuthenticationException 相关的 OAuth2Error,并返回 OAuth2Error 响应。

自定义授权请求验证

OAuth2AuthorizationCodeRequestAuthenticationValidator 是默认的验证器,用于验证授权码授予中使用的特定OAuth2授权请求参数。默认的实现是验证 redirect_uriscope 参数。如果验证失败,会抛出一个 OAuth2AuthorizationCodeRequestAuthenticationException

OAuth2AuthorizationCodeRequestAuthenticationProvidersetAuthenticationValidator() 提供了覆盖默认授权请求验证的能力,即提供一个类型为 Consumer<OAuth2AuthorizationCodeRequestAuthenticationContext> 的自定义验证器。

OAuth2AuthorizationCodeRequestAuthenticationContext 持有 OAuth2AuthorizationCodeRequestAuthenticationToken,其中包含OAuth2授权请求参数。
如果验证失败,认证验证器 必须 抛出 OAuth2AuthorizationCodeRequestAuthenticationException

在开发阶段,一个常见的用例是在 redirect_uri 参数中允许使用 localhost

下面的例子显示了如何配置 OAuth2AuthorizationCodeRequestAuthenticationProvider 与一个自定义认证验证器,允许在 redirect_uri 参数中使用 localhost

@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
	OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
		new OAuth2AuthorizationServerConfigurer();
	http.apply(authorizationServerConfigurer);

	authorizationServerConfigurer
		.authorizationEndpoint(authorizationEndpoint ->
			authorizationEndpoint
				.authenticationProviders(configureAuthenticationValidator())
		);

	return http.build();
}

private Consumer<List<AuthenticationProvider>> configureAuthenticationValidator() {
	return (authenticationProviders) ->
		authenticationProviders.forEach((authenticationProvider) -> {
			if (authenticationProvider instanceof OAuth2AuthorizationCodeRequestAuthenticationProvider) {
				Consumer<OAuth2AuthorizationCodeRequestAuthenticationContext> authenticationValidator =
					// Override default redirect_uri validator
					new CustomRedirectUriValidator()
						// Reuse default scope validator
						.andThen(OAuth2AuthorizationCodeRequestAuthenticationValidator.DEFAULT_SCOPE_VALIDATOR);

				((OAuth2AuthorizationCodeRequestAuthenticationProvider) authenticationProvider)
					.setAuthenticationValidator(authenticationValidator);
			}
		});
}

static class CustomRedirectUriValidator implements Consumer<OAuth2AuthorizationCodeRequestAuthenticationContext> {

	@Override
	public void accept(OAuth2AuthorizationCodeRequestAuthenticationContext authenticationContext) {
		OAuth2AuthorizationCodeRequestAuthenticationToken authorizationCodeRequestAuthentication =
			authenticationContext.getAuthentication();
		RegisteredClient registeredClient = authenticationContext.getRegisteredClient();
		String requestedRedirectUri = authorizationCodeRequestAuthentication.getRedirectUri();

		// Use exact string matching when comparing client redirect URIs against pre-registered URIs
		if (!registeredClient.getRedirectUris().contains(requestedRedirectUri)) {
			OAuth2Error error = new OAuth2Error(OAuth2ErrorCodes.INVALID_REQUEST);
			throw new OAuth2AuthorizationCodeRequestAuthenticationException(error, null);
		}
	}
}

OAuth2 Token 端点

OAuth2TokenEndpointConfigurer 提供了定制 OAuth2 Token 端点 的能力。它定义了扩展点,让你自定义 OAuth2 access token 请求 的预处理、主处理和后处理逻辑。

OAuth2TokenEndpointConfigurer 提供以下配置选项。

@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
	OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
		new OAuth2AuthorizationServerConfigurer();
	http.apply(authorizationServerConfigurer);

	authorizationServerConfigurer
		.tokenEndpoint(tokenEndpoint ->
			tokenEndpoint
				.accessTokenRequestConverter(accessTokenRequestConverter)   (1)
				.accessTokenRequestConverters(accessTokenRequestConvertersConsumer) (2)
				.authenticationProvider(authenticationProvider) (3)
				.authenticationProviders(authenticationProvidersConsumer)   (4)
				.accessTokenResponseHandler(accessTokenResponseHandler) (5)
				.errorResponseHandler(errorResponseHandler) (6)
		);

	return http.build();
}
1 accessTokenRequestConverter(): 添加一个 AuthenticationConverter(预处理器),当试图从 HttpServletRequest 中提取 OAuth2 access token 请求OAuth2AuthorizationGrantAuthenticationToken 的实例时使用。
2 accessTokenRequestConverters(): 设置 Consumer,提供对默认和(可选)添加的 AuthenticationConverter List 的访问,允许添加、删除或定制特定的 AuthenticationConverter 的能力。
3 authenticationProvider(): 添加一个用于认证 OAuth2AuthorizationGrantAuthenticationTokenAuthenticationProvider(主处理器)。
4 authenticationProviders(): 设置 Consumer,提供对默认和(可选)添加的 AuthenticationProvider List 的访问,允许添加、删除或定制特定的 AuthenticationProvider
5 accessTokenResponseHandler(): 用于处理 OAuth2AccessTokenAuthenticationToken 并返回 OAuth2AccessTokenResponseAuthenticationSuccessHandler(后处理器)。
6 errorResponseHandler(): AuthenticationFailureHandler(后处理程序),用于处理 OAuth2AuthenticationException 并返回 OAuth2Error 响应

OAuth2TokenEndpointConfigurer 配置 OAuth2TokenEndpointFilter 并将其注册到OAuth2授权服务器 SecurityFilterChain @BeanOAuth2TokenEndpointFilter 是处理OAuth2 access token 请求的 Filter

支持的 授权许可类型(authorization grant type)authorization_coderefresh_tokenclient_credentials

OAuth2TokenEndpointFilter 配置的默认值如下。

  • AuthenticationConverter — 由 OAuth2AuthorizationCodeAuthenticationConverterOAuth2RefreshTokenAuthenticationConverterOAuth2ClientCredentialsAuthenticationConverter 组成的 DelegatingAuthenticationConverter

  • AuthenticationManager — 一个由 OAuth2AuthorizationCodeAuthenticationProviderOAuth2RefreshTokenAuthenticationProviderOAuth2ClientCredentialsAuthenticationProvider 组成的 AuthenticationManager

  • AuthenticationSuccessHandler — 一个内部实现,处理 OAuth2AccessTokenAuthenticationToken 并返回 OAuth2AccessTokenResponse

  • AuthenticationFailureHandler — 一个内部实现,使用与 OAuth2AuthenticationException 相关的 OAuth2Error,并返回 OAuth2Error 响应。

OAuth2 Token 内省(Introspection)端点

OAuth2TokenIntrospectionEndpointConfigurer 提供了定制 OAuth2 Token Introspection 端点 的能力。它定义了一些扩展点,让你自定义 OAuth2 introspection 请求 的预处理、主处理和后处理逻辑。

OAuth2TokenIntrospectionEndpointConfigurer 提供以下配置选项。

@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
	OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
		new OAuth2AuthorizationServerConfigurer();
	http.apply(authorizationServerConfigurer);

	authorizationServerConfigurer
		.tokenIntrospectionEndpoint(tokenIntrospectionEndpoint ->
			tokenIntrospectionEndpoint
				.introspectionRequestConverter(introspectionRequestConverter)   (1)
				.introspectionRequestConverters(introspectionRequestConvertersConsumer) (2)
				.authenticationProvider(authenticationProvider) (3)
				.authenticationProviders(authenticationProvidersConsumer)   (4)
				.introspectionResponseHandler(introspectionResponseHandler) (5)
				.errorResponseHandler(errorResponseHandler) (6)
		);

	return http.build();
}
1 introspectionRequestConverter(): 添加一个 AuthenticationConverter(预处理器),当试图从 HttpServletRequest 中提取 OAuth2 introspection 请求OAuth2TokenIntrospectionAuthenticationToken 的实例时使用。
2 introspectionRequestConverters(): 设置 Consumer,提供对默认和(可选)添加的 AuthenticationConverter List 的访问,允许添加、删除或定制特定的 AuthenticationConverter 的能力。
3 authenticationProvider(): 添加一个用于认证 OAuth2TokenIntrospectionAuthenticationTokenAuthenticationProvider(主处理器)。
4 authenticationProviders(): 设置 Consumer,提供对默认和(可选)添加的 AuthenticationProvider List 的访问,允许添加、删除或定制特定的 AuthenticationProvider
5 introspectionResponseHandler(): AuthenticationSuccessHandler(后处理器),用于处理 "已认证" 的 OAuth2TokenIntrospectionAuthenticationToken 并返回 OAuth2TokenIntrospection 响应
6 errorResponseHandler(): AuthenticationFailureHandler(后处理程序),用于处理 OAuth2AuthenticationException 并返回 OAuth2Error 响应

OAuth2TokenIntrospectionEndpointConfigurer 配置 OAuth2TokenIntrospectionEndpointFilter,并将其注册到OAuth2授权服务器 SecurityFilterChain @BeanOAuth2TokenIntrospectionEndpointFilter 是处理OAuth2内省(introspection)请求的 Filter

OAuth2TokenIntrospectionEndpointFilter 配置的默认值如下。

  • AuthenticationConverter — 一个 OAuth2TokenIntrospectionAuthenticationConverter

  • AuthenticationManager — 一个由 OAuth2TokenIntrospectionAuthenticationProvider 组成的 AuthenticationManager

  • AuthenticationSuccessHandler — 一个内部实现,处理一个 "已认证" 的 OAuth2TokenIntrospectionAuthenticationToken,并返回 OAuth2TokenIntrospection 响应。

  • AuthenticationFailureHandler — 一个内部实现,使用与 OAuth2AuthenticationException 相关的 OAuth2Error,并返回 OAuth2Error 响应。

OAuth2 Token 撤销(Revocation)端点

OAuth2TokenRevocationEndpointConfigurer 提供了定制 OAuth2 Token Revocation 端点 的能力。它定义了一些扩展点,让你自定义 OAuth2 Revocation 请求 的预处理、主处理和后处理逻辑。

OAuth2TokenRevocationEndpointConfigurer 提供以下配置选项。

@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
	OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
		new OAuth2AuthorizationServerConfigurer();
	http.apply(authorizationServerConfigurer);

	authorizationServerConfigurer
		.tokenRevocationEndpoint(tokenRevocationEndpoint ->
			tokenRevocationEndpoint
				.revocationRequestConverter(revocationRequestConverter) (1)
				.revocationRequestConverters(revocationRequestConvertersConsumer)   (2)
				.authenticationProvider(authenticationProvider) (3)
				.authenticationProviders(authenticationProvidersConsumer)   (4)
				.revocationResponseHandler(revocationResponseHandler)   (5)
				.errorResponseHandler(errorResponseHandler) (6)
		);

	return http.build();
}
1 revocationRequestConverter(): 添加一个 AuthenticationConverter(预处理器),在试图从 HttpServletRequest 中提取 OAuth2 revocation 请求OAuth2TokenRevocationAuthenticationToken 的实例时使用。
2 revocationRequestConverters(): 设置 Consumer ,提供对默认和(可选)添加的 AuthenticationConverter List 的访问,允许添加、删除或定制特定的 AuthenticationConverter 的能力。
3 authenticationProvider(): 添加一个用于认证 OAuth2TokenRevocationAuthenticationToken 的`AuthenticationProvider`(主处理器)。
4 authenticationProviders(): 设置 Consumer,提供对默认和(可选)添加的 AuthenticationProvider List 的访问,允许添加、删除或定制特定的 AuthenticationProvider
5 revocationResponseHandler(): AuthenticationSuccessHandler(后处理器),用于处理 "已认证" 的 OAuth2TokenRevocationAuthenticationToken,并返回 OAuth2 revocation 响应
6 errorResponseHandler(): AuthenticationFailureHandler(后处理程序),用于处理 OAuth2AuthenticationException 并返回 OAuth2Error 响应

OAuth2TokenRevocationEndpointConfigurer 配置 OAuth2TokenRevocationEndpointFilter,并将其注册到OAuth2授权服务器 SecurityFilterChain @BeanOAuth2TokenRevocationEndpointFilter 是处理OAuth2 revocation 请求的 Filter

OAuth2TokenRevocationEndpointFilter 配置的默认值如下。

  • AuthenticationConverter — 一个 OAuth2TokenRevocationAuthenticationConverter

  • AuthenticationManager — 一个由 OAuth2TokenRevocationAuthenticationProvider 组成的 AuthenticationManager

  • AuthenticationSuccessHandler — 一个内部实现,处理一个 "已认证" 的 OAuth2TokenRevocationAuthenticationToken,并返回OAuth2 revocation 响应。

  • AuthenticationFailureHandler — 一个内部实现,使用与 OAuth2AuthenticationException 相关的 OAuth2Error,并返回 OAuth2Error 响应。

OAuth2 授权服务器元数据(Metadata)端点

OAuth2AuthorizationServerMetadataEndpointConfigurer 提供了定制 OAuth2授权服务器元数据端点 的能力。它定义了一个扩展点,让你定制 OAuth2授权服务器元数据响应

OAuth2AuthorizationServerMetadataEndpointConfigurer 提供以下配置选项。

@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
	OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
		new OAuth2AuthorizationServerConfigurer();
	http.apply(authorizationServerConfigurer);

	authorizationServerConfigurer
		.authorizationServerMetadataEndpoint(authorizationServerMetadataEndpoint ->
			authorizationServerMetadataEndpoint
				.authorizationServerMetadataCustomizer(authorizationServerMetadataCustomizer));   (1)

	return http.build();
}
1 authorizationServerMetadataCustomizer(): 提供访问 OAuth2AuthorizationServerMetadata.BuilderConsumer,允许自定义授权服务器的配置 claim 的能力。

OAuth2AuthorizationServerMetadataEndpointConfigurer 配置 OAuth2AuthorizationServerMetadataEndpointFilter,并将其与 OAuth2授权服务器 SecurityFilterChain @Bean 注册。 OAuth2AuthorizationServerMetadataEndpointFilter 是返回 OAuth2AuthorizationServerMetadata 响应Filter

JWK Set 端点

OAuth2AuthorizationServerConfigurer 为 provides support for the JWK Set 端点提供支持。

OAuth2AuthorizationServerConfigurer 配置 NimbusJwkSetEndpointFilter 并将其注册到OAuth2授权服务器 SecurityFilterChain @BeanNimbusJwkSetEndpointFilter 是返回 JWK SetFilter

只有在注册了 JWKSource<SecurityContext> @Bean 时,才会配置 JWK Set 端点。

OpenID Connect 1.0 Provider 配置端点

OidcProviderConfigurationEndpointConfigurer 提供了定制 OpenID Connect 1.0 Provider 配置端点的能力。它定义了一个扩展点,使你能够定制 OpenID Provider 配置响应

OidcProviderConfigurationEndpointConfigurer 提供以下配置选项。

@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
	OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
		new OAuth2AuthorizationServerConfigurer();
	http.apply(authorizationServerConfigurer);

	authorizationServerConfigurer
		.oidc(oidc ->
			oidc
				.providerConfigurationEndpoint(providerConfigurationEndpoint ->
					providerConfigurationEndpoint
						.providerConfigurationCustomizer(providerConfigurationCustomizer)   (1)
				)
		);

	return http.build();
}
1 providerConfigurationCustomizer(): Consumer 提供对 OidcProviderConfiguration.Builder 的访问,允许自定义 OpenID Provider 的配置 claim 的能力。

OidcProviderConfigurationEndpointConfigurer 配置 OidcProviderConfigurationEndpointFilter,并将其与OAuth2授权服务器 SecurityFilterChain @Bean 注册。OidcProviderConfigurationEndpointFilter 是返回 OidcProviderConfiguration 响应Filter

OpenID Connect 1.0 UserInfo 端点

OidcUserInfoEndpointConfigurer 提供了定制 OpenID Connect 1.0 UserInfo 端点 的能力。它定义了一些扩展点,让你可以定制 UserInfo 请求的预处理、主要处理和后处理逻辑。

OidcUserInfoEndpointConfigurer 提供以下配置选项。

@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
	OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
		new OAuth2AuthorizationServerConfigurer();
	http.apply(authorizationServerConfigurer);

	authorizationServerConfigurer
		.oidc(oidc ->
			oidc
				.userInfoEndpoint(userInfoEndpoint ->
					userInfoEndpoint
						.userInfoRequestConverter(userInfoRequestConverter) (1)
						.userInfoRequestConverters(userInfoRequestConvertersConsumer) (2)
						.authenticationProvider(authenticationProvider) (3)
						.authenticationProviders(authenticationProvidersConsumer) (4)
						.userInfoResponseHandler(userInfoResponseHandler) (5)
						.errorResponseHandler(errorResponseHandler) (6)
						.userInfoMapper(userInfoMapper) (7)
				)
		);

	return http.build();
}
1 userInfoRequestConverter(): 添加一个 AuthenticationConverter(预处理器),当试图从 HttpServletRequest 中提取 UserInfo 请求OidcUserInfoAuthenticationToken 的一个实例时使用。
2 userInfoRequestConverters(): 设置 Consumer,提供对默认和(可选)添加的 AuthenticationConverter List 的访问,允许添加、删除或定制特定的 AuthenticationConverter 的能力。
3 authenticationProvider(): 添加一个用于认证 OidcUserInfoAuthenticationTokenAuthenticationProvider(主处理器)。
4 authenticationProviders(): 设置 Consumer,提供对默认和(可选)添加的 AuthenticationProvider List 的访问,允许添加、删除或定制特定的 AuthenticationProvider
5 userInfoResponseHandler(): AuthenticationSuccessHandler(后处理器),用于处理 "已认证" 的 OidcUserInfoAuthenticationToken 并返回 UserInfo 响应
6 errorResponseHandler(): AuthenticationFailureHandler(后处理器),用于处理 OAuth2AuthenticationException 并返回 UserInfo Error响应
7 userInfoMapper(): 用于从 OidcUserInfoAuthenticationContextOidcUserInfo 的实例提取 claim 的 Function

OidcUserInfoEndpointConfigurer 配置 OidcUserInfoEndpointFilter,并将其与OAuth2授权服务器 SecurityFilterChain @Bean 注册。 OidcUserInfoEndpointFilter 是处理 UserInfo 请求 并返回 OidcUserInfo 响应Filter

OidcUserInfoEndpointFilter 被配置为以下默认值。

  • AuthenticationConverter — 一个内部实现,它从 SecurityContext 获取 Authentication,并使用 principal 创建 OidcUserInfoAuthenticationToken

  • AuthenticationManager — 一个由 OidcUserInfoAuthenticationProvider 组成的 AuthenticationManager,它与 userInfoMapper 的内部实现相关联,在授权期间基于 scope 请求ID Token 中提取 标准 claim

  • AuthenticationSuccessHandler — 一个内部实现,处理 "已认证" 的 OidcUserInfoAuthenticationToken 并返回 OidcUserInfo 响应。

  • AuthenticationFailureHandler — 一个内部实现,使用与 OAuth2AuthenticationException 相关的 OAuth2Error,并返回 OAuth2Error 响应。

你可以通过提供一个 OAuth2TokenCustomizer<JwtEncodingContext> @Bean 来定制 ID Token。

OpenID Connect 1.0 UserInfo 端点是一个受 OAuth2 保护的资源,它要求在 UserInfo 请求 中作为 bearer token 发送一个 access token。下面的例子显示了如何启用OAuth2资源服务器配置。

@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
	OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
		new OAuth2AuthorizationServerConfigurer();
	http.apply(authorizationServerConfigurer);

	...

	http.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);

	return http.build();
}

@Bean
public JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
	return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);
}
对于 OpenID Connect 1.0 UserInfo 端点来说,JwtDecoder @Bean 是必须的。
指南 How-to:定制 OpenID Connect 1.0 UserInfo 响应 包含定制 UserInfo 端点的示例。

OpenID Connect 1.0 客户端注册端点

OidcClientRegistrationEndpointConfigurer 提供了定制 OpenID Connect 1.0客户端注册端点 的能力。它定义了一些扩展点,让你可以定制 客户端注册请求客户端读取请求 的预处理、主处理和后处理逻辑。

OidcClientRegistrationEndpointConfigurer 提供以下配置选项。

@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
	OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
		new OAuth2AuthorizationServerConfigurer();
	http.apply(authorizationServerConfigurer);

	authorizationServerConfigurer
		.oidc(oidc ->
			oidc
				.clientRegistrationEndpoint(clientRegistrationEndpoint ->
					clientRegistrationEndpoint
						.clientRegistrationRequestConverter(clientRegistrationRequestConverter) (1)
						.clientRegistrationRequestConverters(clientRegistrationRequestConvertersConsumers) (2)
						.authenticationProvider(authenticationProvider) (3)
						.authenticationProviders(authenticationProvidersConsumer) (4)
						.clientRegistrationResponseHandler(clientRegistrationResponseHandler) (5)
						.errorResponseHandler(errorResponseHandler) (6)
				)
		);

	return http.build();
}
1 clientRegistrationRequestConverter(): 添加一个 AuthenticationConverter(预处理器),当试图从 HttpServletRequest 中提取 客户端注册请求客户端读取请求OidcClientRegistrationAuthenticationToken 的一个实例时使用。
2 clientRegistrationRequestConverters(): 设置 Consumer,提供对默认和(可选)添加的 AuthenticationConverter List 的访问,允许添加、删除或定制特定的 AuthenticationConverter 的能力。
3 authenticationProvider(): 添加一个用于认证 OidcClientRegistrationAuthenticationTokenAuthenticationProvider(主处理器)。
4 authenticationProviders(): 设置 Consumer,提供对默认和(可选)添加的 AuthenticationProvider List 的访问,允许添加、删除或定制特定的 AuthenticationProvider
5 clientRegistrationResponseHandler(): AuthenticationSuccessHandler(后处理器)用于处理 "已认证" 的 OidcClientRegistrationAuthenticationToken 并返回 客户端注册响应客户端读取响应
6 errorResponseHandler(): AuthenticationFailureHandler(后处理器),用于处理 OAuth2AuthenticationException 并返回 客户端注册错误响应客户端读取错误响应
OpenID Connect 1.0客户端注册端点默认是禁用的,因为许多部署不需要动态客户端注册。

OidcClientRegistrationEndpointConfigurer 配置 OidcClientRegistrationEndpointFilter 并将其注册到OAuth2授权服务器 SecurityFilterChain @BeanOidcClientRegistrationEndpointFilter 是处理 客户端注册请求 并返回 OidcClientRegistration 响应Filter

OidcClientRegistrationEndpointFilter also processes Client Read requests and returns the OidcClientRegistration response.

OidcClientRegistrationEndpointFilter 配置的默认值如下。

  • AuthenticationConverter — 一个 OidcClientRegistrationAuthenticationConverter

  • AuthenticationManager — 一个由 OidcClientRegistrationAuthenticationProviderOidcClientConfigurationAuthenticationProvider 组成的 AuthenticationManager

  • AuthenticationSuccessHandler — 一个内部实现,处理一个 "已认证" 的 OidcClientRegistrationAuthenticationToken,并返回 OidcClientRegistration 响应。

  • AuthenticationFailureHandler — 一个内部实现,使用与 OAuth2AuthenticationException 相关的 OAuth2Error,并返回 OAuth2Error 响应。

OpenID Connect 1.0 客户端注册端点是一个受 OAuth2保护的资源,需要在客户端注册(或客户端读取)请求中发送一个 access token 作为 bearer token。

客户端注册请求中的 access token 必须是 OAuth2 scope client.create
客户端读取请求中的 access token 必须是 OAuth2 scope client.read

下面的例子显示了如何启用OAuth2资源服务器配置。

@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
	OAuth2AuthorizationServerConfigurer authorizationServerConfigurer =
		new OAuth2AuthorizationServerConfigurer();
	http.apply(authorizationServerConfigurer);

	...

	http.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);

	return http.build();
}

@Bean
public JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
	return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);
}
JwtDecoder @Bean 是 OpenID Connect 1.0 客户端注册端点的必要条件。