协议端点

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 授权请求(或同意)到 OAuth2AuthorizationCodeRequestAuthenticationTokenOAuth2AuthorizationConsentAuthenticationToken 的实例。
2 authorizationRequestConverters():设置 Consumer,提供对默认和(可选)添加的 AuthenticationConverterList 的访问,从而能够添加、删除或自定义特定的 AuthenticationConverter
3 authenticationProvider():添加 AuthenticationProvider主处理器),用于对 OAuth2AuthorizationCodeRequestAuthenticationTokenOAuth2AuthorizationConsentAuthenticationToken 进行身份验证。
4 authenticationProviders():设置 Consumer,提供对默认和(可选)添加的 AuthenticationProviderList 的访问,从而能够添加、删除或自定义特定的 AuthenticationProvider
5 authorizationResponseHandler():用于处理“已验证”的 OAuth2AuthorizationCodeRequestAuthenticationToken 和返回 OAuth2AuthorizationResponseAuthenticationSuccessHandler后处理器)。
6 errorResponseHandler():用于处理 OAuth2AuthorizationCodeRequestAuthenticationException 和返回 OAuth2Error 响应AuthenticationFailureHandler后处理器)。
7 consentPage():如果在授权请求流程期间需要同意,则将资源所有者重定向到的自定义同意页面的 URI

OAuth2AuthorizationEndpointConfigurer 配置 OAuth2AuthorizationEndpointFilter,并使用 OAuth2 授权服务器 SecurityFilterChain @Bean 注册它。OAuth2AuthorizationEndpointFilter 是处理 OAuth2 授权请求(和同意)的 Filter

OAuth2AuthorizationEndpointFilter 配置了以下默认值

  • AuthenticationConverter — 由 OAuth2AuthorizationCodeRequestAuthenticationConverterOAuth2AuthorizationConsentAuthenticationConverter 组成的 DelegatingAuthenticationConverter

  • AuthenticationManager — 由 OAuth2AuthorizationCodeRequestAuthenticationProviderOAuth2AuthorizationConsentAuthenticationProvider 组成的 AuthenticationManager

  • AuthenticationSuccessHandler — 处理“已认证”的 OAuth2AuthorizationCodeRequestAuthenticationToken 并返回 OAuth2AuthorizationResponse 的内部实现。

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

自定义授权请求验证

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

OAuth2AuthorizationCodeRequestAuthenticationProvider 提供了通过向 setAuthenticationValidator() 提供类型为 Consumer<OAuth2AuthorizationCodeRequestAuthenticationContext> 的自定义身份验证验证器来覆盖默认授权请求验证的功能。

OAuth2AuthorizationCodeRequestAuthenticationContext 保存 OAuth2AuthorizationCodeRequestAuthenticationToken,其中包含 OAuth2 授权请求参数。
如果验证失败,则身份验证验证器必须抛出 OAuth2AuthorizationCodeRequestAuthenticationException

开发生命周期阶段的常见用例是在 redirect_uri 参数中允许 localhost

以下示例展示了如何使用允许在 redirect_uri 参数中使用 localhost 的自定义身份验证验证器来配置 OAuth2AuthorizationCodeRequestAuthenticationProvider

@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 设备授权端点

OAuth2DeviceAuthorizationEndpointConfigurer 提供自定义 OAuth2 设备授权端点 的功能。它定义了扩展点,让你可以自定义 OAuth2 设备授权请求的预处理、主处理和后处理逻辑。

OAuth2DeviceAuthorizationEndpointConfigurer 提供以下配置选项

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

	authorizationServerConfigurer
		.deviceAuthorizationEndpoint(deviceAuthorizationEndpoint ->
			deviceAuthorizationEndpoint
				.deviceAuthorizationRequestConverter(deviceAuthorizationRequestConverter) (1)
				.deviceAuthorizationRequestConverters(deviceAuthorizationRequestConvertersConsumer) (2)
				.authenticationProvider(authenticationProvider) (3)
				.authenticationProviders(authenticationProvidersConsumer) (4)
				.deviceAuthorizationResponseHandler(deviceAuthorizationResponseHandler) (5)
				.errorResponseHandler(errorResponseHandler) (6)
				.verificationUri("/oauth2/v1/device_verification") (7)
		);

	return http.build();
}
1 deviceAuthorizationRequestConverter():添加一个 AuthenticationConverter预处理器),用于尝试从 HttpServletRequest 提取 OAuth2 设备授权请求OAuth2DeviceAuthorizationRequestAuthenticationToken 的实例。
2 deviceAuthorizationRequestConverters():设置 Consumer,提供对 List 的访问,其中包含默认和(可选)添加的 AuthenticationConverter,允许添加、删除或自定义特定的 AuthenticationConverter
3 authenticationProvider():添加一个 AuthenticationProvider主处理器),用于对 OAuth2DeviceAuthorizationRequestAuthenticationToken 进行身份验证。
4 authenticationProviders():设置 Consumer,提供对默认和(可选)添加的 AuthenticationProviderList 的访问,从而能够添加、删除或自定义特定的 AuthenticationProvider
5 deviceAuthorizationResponseHandler()AuthenticationSuccessHandler后处理器),用于处理“已验证”的 OAuth2DeviceAuthorizationRequestAuthenticationToken 并返回 OAuth2DeviceAuthorizationResponse
6 errorResponseHandler()AuthenticationFailureHandler后处理器),用于处理 OAuth2AuthenticationException 并返回 OAuth2Error 响应
7 verificationUri():自定义最终用户验证页面的 URI,用于将资源所有者定向到辅助设备。

OAuth2DeviceAuthorizationEndpointConfigurer 配置 OAuth2DeviceAuthorizationEndpointFilter,并使用 OAuth2 授权服务器 SecurityFilterChain @Bean 注册它。OAuth2DeviceAuthorizationEndpointFilter 是处理 OAuth2 设备授权请求的 Filter

OAuth2DeviceAuthorizationEndpointFilter 配置了以下默认值

  • AuthenticationConverter — 一个 OAuth2DeviceAuthorizationRequestAuthenticationConverter

  • AuthenticationManager — 一个由 OAuth2DeviceAuthorizationRequestAuthenticationProvider 组成的 AuthenticationManager

  • AuthenticationSuccessHandler — 一个内部实现,用于处理“已验证”的 OAuth2DeviceAuthorizationRequestAuthenticationToken 并返回 OAuth2DeviceAuthorizationResponse

  • AuthenticationFailureHandler — 一个 OAuth2ErrorAuthenticationFailureHandler

OAuth2 设备验证端点

OAuth2DeviceVerificationEndpointConfigurer 提供自定义 OAuth2 设备验证端点(或“用户交互”)的功能。它定义了扩展点,让你可以自定义 OAuth2 设备验证请求的预处理、主处理和后处理逻辑。

OAuth2DeviceVerificationEndpointConfigurer 提供以下配置选项

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

	authorizationServerConfigurer
		.deviceVerificationEndpoint(deviceVerificationEndpoint ->
			deviceVerificationEndpoint
				.deviceVerificationRequestConverter(deviceVerificationRequestConverter) (1)
				.deviceVerificationRequestConverters(deviceVerificationRequestConvertersConsumer) (2)
				.authenticationProvider(authenticationProvider) (3)
				.authenticationProviders(authenticationProvidersConsumer) (4)
				.deviceVerificationResponseHandler(deviceVerificationResponseHandler) (5)
				.errorResponseHandler(errorResponseHandler) (6)
				.consentPage("/oauth2/v1/consent") (7)
		);

	return http.build();
}
1 deviceVerificationRequestConverter():添加一个 AuthenticationConverter预处理器),用于在尝试从 HttpServletRequest 中提取 OAuth2 设备验证请求(或同意)到 OAuth2DeviceVerificationAuthenticationTokenOAuth2DeviceAuthorizationConsentAuthenticationToken 的实例时使用。
2 deviceVerificationRequestConverters():设置 Consumer,提供对默认和(可选)添加的 AuthenticationConverterList 的访问权限,允许添加、删除或自定义特定的 AuthenticationConverter
3 authenticationProvider():添加一个 AuthenticationProvider主处理器),用于对 OAuth2DeviceVerificationAuthenticationTokenOAuth2DeviceAuthorizationConsentAuthenticationToken 进行身份验证。
4 authenticationProviders():设置 Consumer,提供对默认和(可选)添加的 AuthenticationProviderList 的访问,从而能够添加、删除或自定义特定的 AuthenticationProvider
5 deviceVerificationResponseHandler()AuthenticationSuccessHandler后处理器),用于处理“已验证”的 OAuth2DeviceVerificationAuthenticationToken,并指示资源所有者返回到其设备。
6 errorResponseHandler()AuthenticationFailureHandler后处理器),用于处理 OAuth2AuthenticationException 并返回错误响应。
7 consentPage():如果在设备验证请求流程期间需要同意,则重定向资源所有者的自定义同意页面的 URI

OAuth2DeviceVerificationEndpointConfigurer 配置 OAuth2DeviceVerificationEndpointFilter,并将其注册到 OAuth2 授权服务器 SecurityFilterChain @BeanOAuth2DeviceVerificationEndpointFilter 是处理 OAuth2 设备验证请求(和同意)的 Filter

OAuth2DeviceVerificationEndpointFilter 配置了以下默认值

  • AuthenticationConverter — 由 OAuth2DeviceVerificationAuthenticationConverterOAuth2DeviceAuthorizationConsentAuthenticationConverter 组成的 DelegatingAuthenticationConverter

  • AuthenticationManager — 由 OAuth2DeviceVerificationAuthenticationProviderOAuth2DeviceAuthorizationConsentAuthenticationProvider 组成的 AuthenticationManager

  • AuthenticationSuccessHandler — 处理“已验证”的 OAuth2DeviceVerificationAuthenticationToken,并将用户重定向到成功页面(/?success)的 SimpleUrlAuthenticationSuccessHandler

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

OAuth2 令牌端点

OAuth2TokenEndpointConfigurer 提供自定义 OAuth2 令牌端点 的能力。它定义了扩展点,让你可以自定义 OAuth2 访问令牌请求 的预处理、主处理和后处理逻辑。

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 访问令牌请求OAuth2AuthorizationGrantAuthenticationToken 的实例时使用。
2 accessTokenRequestConverters():设置 Consumer,提供对默认和(可选)添加的 AuthenticationConverterList 的访问权限,允许添加、删除或自定义特定的 AuthenticationConverter
3 authenticationProvider():添加一个 AuthenticationProvider主处理器),用于对 OAuth2AuthorizationGrantAuthenticationToken 进行身份验证。
4 authenticationProviders():设置 Consumer,提供对默认和(可选)添加的 AuthenticationProviderList 的访问,从而能够添加、删除或自定义特定的 AuthenticationProvider
5 accessTokenResponseHandler():用于处理 OAuth2AccessTokenAuthenticationToken 并返回 OAuth2AccessTokenResponseAuthenticationSuccessHandler后处理器)。
6 errorResponseHandler()AuthenticationFailureHandler后处理器),用于处理 OAuth2AuthenticationException 并返回 OAuth2Error 响应

OAuth2TokenEndpointConfigurer 配置 OAuth2TokenEndpointFilter,并将其注册到 OAuth2 授权服务器 SecurityFilterChain @BeanOAuth2TokenEndpointFilter 是处理 OAuth2 访问令牌请求的 Filter

受支持的 授权授予类型authorization_coderefresh_tokenclient_credentialsurn:ietf:params:oauth:grant-type:device_codeurn:ietf:params:oauth:grant-type:token-exchange

OAuth2TokenEndpointFilter 配置了以下默认值

  • AuthenticationConverter — 由 OAuth2AuthorizationCodeAuthenticationConverterOAuth2RefreshTokenAuthenticationConverterOAuth2ClientCredentialsAuthenticationConverterOAuth2DeviceCodeAuthenticationConverterOAuth2TokenExchangeAuthenticationConverter 组成的 DelegatingAuthenticationConverter

  • AuthenticationManager — 由 OAuth2AuthorizationCodeAuthenticationProviderOAuth2RefreshTokenAuthenticationProviderOAuth2ClientCredentialsAuthenticationProviderOAuth2DeviceCodeAuthenticationProviderOAuth2TokenExchangeAuthenticationProvider 组成的 AuthenticationManager

  • AuthenticationSuccessHandler — OAuth2AccessTokenResponseAuthenticationSuccessHandler

  • AuthenticationFailureHandler — 一个 OAuth2ErrorAuthenticationFailureHandler

自定义客户端凭据授予请求验证

OAuth2ClientCredentialsAuthenticationValidator 是用于验证特定 OAuth2 客户端凭据授予请求参数的默认验证器。默认实现验证 scope 参数。如果验证失败,则会抛出 OAuth2AuthenticationException

OAuth2ClientCredentialsAuthenticationProvider 提供了通过向 setAuthenticationValidator() 提供类型为 Consumer<OAuth2ClientCredentialsAuthenticationContext> 的自定义身份验证验证器来覆盖默认请求验证的功能。

OAuth2ClientCredentialsAuthenticationContext 持有 OAuth2ClientCredentialsAuthenticationToken,其中包含 OAuth2 客户端凭据授予请求参数。
如果验证失败,身份验证验证器必须抛出 OAuth2AuthenticationException

以下示例展示了如何使用覆盖默认 scope 验证的自定义身份验证验证器来配置 OAuth2ClientCredentialsAuthenticationProvider

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

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

	return http.build();
}

private Consumer<List<AuthenticationProvider>> configureAuthenticationValidator() {
	return (authenticationProviders) ->
		authenticationProviders.forEach((authenticationProvider) -> {
			if (authenticationProvider instanceof OAuth2ClientCredentialsAuthenticationProvider) {
				Consumer<OAuth2ClientCredentialsAuthenticationContext> authenticationValidator =
					new CustomScopeValidator();

				// Override default scope validation
				((OAuth2ClientCredentialsAuthenticationProvider) authenticationProvider)
					.setAuthenticationValidator(authenticationValidator);
			}
		});
}

static class CustomScopeValidator implements Consumer<OAuth2ClientCredentialsAuthenticationContext> {

	@Override
	public void accept(OAuth2ClientCredentialsAuthenticationContext authenticationContext) {
		OAuth2ClientCredentialsAuthenticationToken clientCredentialsAuthentication =
			authenticationContext.getAuthentication();

		Set<String> requestedScopes = clientCredentialsAuthentication.getScopes();
		RegisteredClient registeredClient = authenticationContext.getRegisteredClient();
		Set<String> allowedScopes = registeredClient.getScopes();

        // TODO Implement scope validation

	}
}

OAuth2 令牌自省端点

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,提供对 List 的访问,其中包含默认的和(可选)添加的 AuthenticationConverter,允许添加、移除或自定义一个特定的 AuthenticationConverter
3 authenticationProvider():添加一个 AuthenticationProvider主处理器),用于对 OAuth2TokenIntrospectionAuthenticationToken 进行身份验证。
4 authenticationProviders():设置 Consumer,提供对默认和(可选)添加的 AuthenticationProviderList 的访问,从而能够添加、删除或自定义特定的 AuthenticationProvider
5 introspectionResponseHandler():用于处理“已验证”OAuth2TokenIntrospectionAuthenticationToken 并返回 OAuth2TokenIntrospection 响应AuthenticationSuccessHandler后处理器)。
6 errorResponseHandler():用于处理 OAuth2AuthenticationException 并返回 OAuth2Error 响应AuthenticationFailureHandler后处理器)。

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

OAuth2TokenIntrospectionEndpointFilter 配置有以下默认值

  • AuthenticationConverter — 一个 OAuth2TokenIntrospectionAuthenticationConverter

  • AuthenticationManager — 一个由 OAuth2TokenIntrospectionAuthenticationProvider 组成的 AuthenticationManager

  • AuthenticationSuccessHandler — 一个内部实现,用于处理“已验证”OAuth2TokenIntrospectionAuthenticationToken 并返回 OAuth2TokenIntrospection 响应。

  • AuthenticationFailureHandler — 一个 OAuth2ErrorAuthenticationFailureHandler

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 吊销请求OAuth2TokenRevocationAuthenticationToken 的实例。
2 revocationRequestConverters():设置 Consumer,提供对默认和(可选)添加的 AuthenticationConverterList 的访问,允许添加、删除或自定义特定的 AuthenticationConverter
3 authenticationProvider():添加一个 AuthenticationProvider主处理器),用于对 OAuth2TokenRevocationAuthenticationToken 进行身份验证。
4 authenticationProviders():设置 Consumer,提供对默认和(可选)添加的 AuthenticationProviderList 的访问,从而能够添加、删除或自定义特定的 AuthenticationProvider
5 revocationResponseHandler()AuthenticationSuccessHandler后处理器),用于处理“已验证”的 OAuth2TokenRevocationAuthenticationToken 并返回 OAuth2 吊销响应
6 errorResponseHandler()AuthenticationFailureHandler后处理器),用于处理 OAuth2AuthenticationException 并返回 OAuth2Error 响应

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

OAuth2TokenRevocationEndpointFilter 配置了以下默认值

  • AuthenticationConverter — 一个 OAuth2TokenRevocationAuthenticationConverter

  • AuthenticationManager — 一个由 OAuth2TokenRevocationAuthenticationProvider 组成的 AuthenticationManager

  • AuthenticationSuccessHandler — 一个内部实现,用于处理“已验证”的 OAuth2TokenRevocationAuthenticationToken 并返回 OAuth2 吊销响应。

  • AuthenticationFailureHandler — 一个 OAuth2ErrorAuthenticationFailureHandler

OAuth2 授权服务器元数据端点

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()Consumer,提供对 OAuth2AuthorizationServerMetadata.Builder 的访问,允许自定义授权服务器配置的声明。

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

JWK 集端点

OAuth2AuthorizationServerConfigurer 提供对 JWK 集端点 的支持。

OAuth2AuthorizationServerConfigurer 配置 NimbusJwkSetEndpointFilter 并通过 OAuth2 授权服务器 SecurityFilterChain @Bean 注册它。NimbusJwkSetEndpointFilter 是返回 JWK SetFilter

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

OpenID Connect 1.0 提供程序配置端点

OidcProviderConfigurationEndpointConfigurer 提供了自定义 OpenID Connect 1.0 提供程序配置端点 的功能。它定义了一个扩展点,允许你自定义 OpenID 提供程序配置响应

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():提供对 OidcProviderConfiguration.Builder 的访问权限的 Consumer,允许自定义 OpenID 提供程序配置的声明。

OidcProviderConfigurationEndpointConfigurer 配置 OidcProviderConfigurationEndpointFilter 并通过 OAuth2 授权服务器 SecurityFilterChain @Bean 注册它。OidcProviderConfigurationEndpointFilter 是返回 OidcProviderConfiguration 响应Filter

OpenID Connect 1.0 注销端点

OidcLogoutEndpointConfigurer 提供了自定义 OpenID Connect 1.0 注销端点 的功能。它定义了扩展点,允许你自定义 RP 发起的注销请求的预处理、主处理和后处理逻辑。

OidcLogoutEndpointConfigurer 提供以下配置选项

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

	authorizationServerConfigurer
		.oidc(oidc ->
			oidc
				.logoutEndpoint(logoutEndpoint ->
					logoutEndpoint
						.logoutRequestConverter(logoutRequestConverter) (1)
						.logoutRequestConverters(logoutRequestConvertersConsumer)   (2)
						.authenticationProvider(authenticationProvider) (3)
						.authenticationProviders(authenticationProvidersConsumer)   (4)
						.logoutResponseHandler(logoutResponseHandler)   (5)
						.errorResponseHandler(errorResponseHandler) (6)
				)
		);

	return http.build();
}
1 logoutRequestConverter():添加一个 AuthenticationConverter预处理器),用于尝试从 HttpServletRequest 中提取 注销请求OidcLogoutAuthenticationToken 的实例。
2 logoutRequestConverters():设置提供对默认和(可选)添加的 AuthenticationConverterList 的访问权限的 Consumer,允许添加、删除或自定义特定的 AuthenticationConverter
3 authenticationProvider():添加一个 AuthenticationProvider主处理器),用于对 OidcLogoutAuthenticationToken 进行身份验证。
4 authenticationProviders():设置 Consumer,提供对默认和(可选)添加的 AuthenticationProviderList 的访问,从而能够添加、删除或自定义特定的 AuthenticationProvider
5 logoutResponseHandler():用于处理“已验证”的 OidcLogoutAuthenticationToken 和执行注销的 AuthenticationSuccessHandler后处理器)。
6 errorResponseHandler()AuthenticationFailureHandler后处理器),用于处理 OAuth2AuthenticationException 并返回错误响应。

OidcLogoutEndpointConfigurer 配置 OidcLogoutEndpointFilter 并通过 OAuth2 授权服务器 SecurityFilterChain @Bean 注册它。OidcLogoutEndpointFilter 是处理 RP 发起的注销请求 并执行最终用户注销的 Filter

OidcLogoutEndpointFilter 配置了以下默认值

  • AuthenticationConverter — 一个 OidcLogoutAuthenticationConverter

  • AuthenticationManager — 一个由 OidcLogoutAuthenticationProvider 组成的 AuthenticationManager

  • AuthenticationSuccessHandler — 一个内部实现,用于处理“已认证”的 OidcLogoutAuthenticationToken 并执行注销。

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

OidcLogoutAuthenticationProvider 使用 SessionRegistry 查找与请求注销的最终用户关联的 SessionInformation 实例。
OidcClientInitiatedLogoutSuccessHandler 是 Spring Security 的 OAuth2 客户端支持中用于配置 OpenID Connect 1.0 RP 发起的注销 的相应配置。

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,提供对默认和(可选)添加的 AuthenticationConverterList 的访问,从而能够添加、删除或自定义特定的 AuthenticationConverter
3 authenticationProvider():添加一个 AuthenticationProvider主处理器),用于对 OidcUserInfoAuthenticationToken 进行身份验证。
4 authenticationProviders():设置 Consumer,提供对默认和(可选)添加的 AuthenticationProviderList 的访问,从而能够添加、删除或自定义特定的 AuthenticationProvider
5 userInfoResponseHandler()AuthenticationSuccessHandler后处理器),用于处理“已认证”的 OidcUserInfoAuthenticationToken 并返回 UserInfo 响应
6 errorResponseHandler()AuthenticationFailureHandler后处理器),用于处理 OAuth2AuthenticationException 并返回 UserInfo 错误响应
7 userInfoMapper()Function,用于从 OidcUserInfoAuthenticationContext 中提取声明到 OidcUserInfo 的实例。

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

OidcUserInfoEndpointFilter 配置了以下默认值

  • AuthenticationConverter — 从 SecurityContext 获取 Authentication 并使用主体创建一个 OidcUserInfoAuthenticationToken 的内部实现。

  • AuthenticationManager — 由 OidcUserInfoAuthenticationProvider 组成的 AuthenticationManager,它与 userInfoMapper 的内部实现相关联,该实现从 标准声明 中提取 ID 令牌,具体取决于授权期间 请求的范围

  • AuthenticationSuccessHandler — 处理“已验证”OidcUserInfoAuthenticationToken 并返回 OidcUserInfo 响应的内部实现。

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

您可以通过提供 OAuth2TokenCustomizer<JwtEncodingContext> @Bean 来自定义 ID 令牌。

OpenID Connect 1.0 UserInfo 端点是一个 OAuth2 受保护资源,需要UserInfo 请求 中将访问令牌作为持有者令牌发送。以下示例展示了如何启用 OAuth2 资源服务器配置

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

	...

	http.oauth2ResourceServer(resourceServer -> resourceServer.jwt(Customizer.withDefaults()));

	return http.build();
}

@Bean
public JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
	return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);
}
OpenID Connect 1.0 UserInfo 端点需要一个 JwtDecoder @Bean
指南 操作方法:自定义 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,提供对默认和(可选)添加的 AuthenticationConverterList 的访问权限,从而能够添加、删除或自定义特定的 AuthenticationConverter
3 authenticationProvider():添加一个 AuthenticationProvider主处理器),用于对 OidcClientRegistrationAuthenticationToken 进行身份验证。
4 authenticationProviders():设置 Consumer,提供对默认和(可选)添加的 AuthenticationProviderList 的访问,从而能够添加、删除或自定义特定的 AuthenticationProvider
5 clientRegistrationResponseHandler():用于处理“已验证”OidcClientRegistrationAuthenticationToken 并返回 客户端注册响应客户端读取响应AuthenticationSuccessHandler后处理器)。
6 errorResponseHandler():用于处理 OAuth2AuthenticationException 并返回 客户端注册错误响应客户端读取错误响应AuthenticationFailureHandler后置处理器)。
默认情况下,OpenID Connect 1.0 客户端注册端点处于禁用状态,因为很多部署不需要动态客户端注册。

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

OidcClientRegistrationEndpointFilter 还处理 客户端读取请求 并返回 OidcClientRegistration 响应

OidcClientRegistrationEndpointFilter 配置了以下默认值

  • AuthenticationConverter — 一个 OidcClientRegistrationAuthenticationConverter

  • AuthenticationManager — 一个由 OidcClientRegistrationAuthenticationProviderOidcClientConfigurationAuthenticationProvider 组成的 AuthenticationManager

  • AuthenticationSuccessHandler — 一个内部实现,用于处理“经过验证的”OidcClientRegistrationAuthenticationToken 并返回 OidcClientRegistration 响应。

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

OpenID Connect 1.0 客户端注册端点是一个 OAuth2 受保护资源需要在客户端注册(或客户端读取)请求中将访问令牌作为承载令牌发送。

客户端注册请求中的访问令牌需要OAuth2 作用域 client.create
客户端读取请求中的访问令牌需要OAuth2 作用域 client.read

以下示例展示了如何启用 OAuth2 资源服务器配置

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

	...

	http.oauth2ResourceServer(resourceServer -> resourceServer.jwt(Customizer.withDefaults()));

	return http.build();
}

@Bean
public JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
	return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);
}
OpenID Connect 1.0 客户端注册端点需要一个 JwtDecoder @Bean