此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Authorization Server 1.3.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Authorization Server 1.3.1Spring中文文档

默认配置

OAuth2AuthorizationServerConfiguration是为 OAuth2 授权服务器提供最低默认配置的。@ConfigurationSpring中文文档

OAuth2AuthorizationServerConfiguration使用 OAuth2AuthorizationServerConfigurer 应用默认配置,并注册一个由支持 OAuth2 授权服务器的所有基础结构组件组成的组件。SecurityFilterChain@BeanSpring中文文档

OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(HttpSecurity)是一种方便 () 实用工具方法,用于将默认 OAuth2 安全配置应用于 。staticHttpSecurity

OAuth2 授权服务器配置了以下默认协议终结点:SecurityFilterChain@BeanSpring中文文档

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

以下示例演示如何使用应用最小默认配置:OAuth2AuthorizationServerConfigurationSpring中文文档

@Configuration
@Import(OAuth2AuthorizationServerConfiguration.class)
public class AuthorizationServerConfig {

	@Bean
	public RegisteredClientRepository registeredClientRepository() {
		List<RegisteredClient> registrations = ...
		return new InMemoryRegisteredClientRepository(registrations);
	}

	@Bean
	public JWKSource<SecurityContext> jwkSource() {
		RSAKey rsaKey = ...
		JWKSet jwkSet = new JWKSet(rsaKey);
		return (jwkSelector, securityContext) -> jwkSelector.select(jwkSet);
	}

}
authorization_code授权要求对资源所有者进行身份验证。因此,除了默认的 OAuth2 安全配置之外,还必须配置用户身份验证机制。

OpenID Connect 1.0 在默认配置中处于禁用状态。以下示例演示如何通过初始化 OpenID Connect 1.0 来启用:OidcConfigurerSpring中文文档

@Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
	OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);

	http.getConfigurer(OAuth2AuthorizationServerConfigurer.class)
		.oidc(Customizer.withDefaults());	// Initialize `OidcConfigurer`

	return http.build();
}

除了默认协议端点外,OAuth2 授权服务器还配置了以下 OpenID Connect 1.0 协议端点:SecurityFilterChain@BeanSpring中文文档

默认情况下,OpenID Connect 1.0 客户端注册端点处于禁用状态,因为许多部署不需要动态客户端注册。
OAuth2AuthorizationServerConfiguration.jwtDecoder(JWKSource<SecurityContext>)是一种方便 () 实用工具方法,可用于注册 ,这是 OpenID Connect 1.0 UserInfo 端点OpenID Connect 1.0 客户端注册端点所必需的。staticJwtDecoder@Bean

以下示例演示如何注册:JwtDecoder@BeanSpring中文文档

@Bean
public JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
	return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);
}

其主要目的是提供一种方便的方法来应用 OAuth2 授权服务器的最小默认配置。但是,在大多数情况下,需要自定义配置。OAuth2AuthorizationServerConfigurationSpring中文文档

OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(HttpSecurity)是一种方便 () 实用工具方法,用于将默认 OAuth2 安全配置应用于 。staticHttpSecurity
当注册了 a 时,才会配置 JWK 集端点。JWKSource<SecurityContext>@Bean
authorization_code授权要求对资源所有者进行身份验证。因此,除了默认的 OAuth2 安全配置之外,还必须配置用户身份验证机制。
默认情况下,OpenID Connect 1.0 客户端注册端点处于禁用状态,因为许多部署不需要动态客户端注册。
OAuth2AuthorizationServerConfiguration.jwtDecoder(JWKSource<SecurityContext>)是一种方便 () 实用工具方法,可用于注册 ,这是 OpenID Connect 1.0 UserInfo 端点OpenID Connect 1.0 客户端注册端点所必需的。staticJwtDecoder@Bean

自定义配置

OAuth2AuthorizationServerConfigurer提供完全自定义 OAuth2 授权服务器的安全配置的功能。 它允许您指定要使用的核心组件 - 例如,RegisteredClientRepositoryOAuth2AuthorizationServiceOAuth2TokenGenerator 等。 此外,它还允许您自定义协议端点的请求处理逻辑,例如授权端点设备授权端点设备验证端点令牌端点、令牌自检端点等。Spring中文文档

OAuth2AuthorizationServerConfigurer提供以下配置选项:Spring中文文档

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

	authorizationServerConfigurer
		.registeredClientRepository(registeredClientRepository) (1)
		.authorizationService(authorizationService) (2)
		.authorizationConsentService(authorizationConsentService)   (3)
		.authorizationServerSettings(authorizationServerSettings) (4)
		.tokenGenerator(tokenGenerator) (5)
		.clientAuthentication(clientAuthentication -> { })  (6)
		.authorizationEndpoint(authorizationEndpoint -> { })    (7)
		.deviceAuthorizationEndpoint(deviceAuthorizationEndpoint -> { })    (8)
		.deviceVerificationEndpoint(deviceVerificationEndpoint -> { })  (9)
		.tokenEndpoint(tokenEndpoint -> { })    (10)
		.tokenIntrospectionEndpoint(tokenIntrospectionEndpoint -> { })  (11)
		.tokenRevocationEndpoint(tokenRevocationEndpoint -> { })    (12)
		.authorizationServerMetadataEndpoint(authorizationServerMetadataEndpoint -> { })    (13)
		.oidc(oidc -> oidc
			.providerConfigurationEndpoint(providerConfigurationEndpoint -> { })    (14)
			.logoutEndpoint(logoutEndpoint -> { })  (15)
			.userInfoEndpoint(userInfoEndpoint -> { })  (16)
			.clientRegistrationEndpoint(clientRegistrationEndpoint -> { })  (17)
		);

	return http.build();
}
1 registeredClientRepository():用于管理新客户端和现有客户端的 RegisteredClientRepositoryREQUIRED)。
2 authorizationService():用于管理新授权和现有授权的 OAuth2AuthorizationService
3 authorizationConsentService():用于管理新的和现有的授权许可的 OAuth2AuthorizationConsentService
4 authorizationServerSettings():用于自定义 OAuth2 授权服务器配置设置的 AuthorizationServerSettingsREQUIRED)。
5 tokenGenerator()OAuth2TokenGenerator,用于生成 OAuth2 授权服务器支持的令牌。
6 clientAuthentication()OAuth2 客户端身份验证的配置程序。
7 authorizationEndpoint()OAuth2 授权端点的配置程序。
8 deviceAuthorizationEndpoint()OAuth2 设备授权端点的配置者。
9 deviceVerificationEndpoint()OAuth2 设备验证端点的配置程序。
10 tokenEndpoint()OAuth2 令牌终端节点的配置程序。
11 tokenIntrospectionEndpoint()OAuth2 令牌侦测端点的配置者。
12 tokenRevocationEndpoint()OAuth2 令牌吊销终结点的配置者。
13 authorizationServerMetadataEndpoint()OAuth2 授权服务器元数据端点的配置程序。
14 providerConfigurationEndpoint()OpenID Connect 1.0 提供程序配置端点的配置程序。
15 logoutEndpoint()OpenID Connect 1.0 注销端点的配置程序。
16 userInfoEndpoint()OpenID Connect 1.0 UserInfo 端点的配置程序。
17 clientRegistrationEndpoint()OpenID Connect 1.0 客户端注册端点的配置程序。
1 registeredClientRepository():用于管理新客户端和现有客户端的 RegisteredClientRepositoryREQUIRED)。
2 authorizationService():用于管理新授权和现有授权的 OAuth2AuthorizationService
3 authorizationConsentService():用于管理新的和现有的授权许可的 OAuth2AuthorizationConsentService
4 authorizationServerSettings():用于自定义 OAuth2 授权服务器配置设置的 AuthorizationServerSettingsREQUIRED)。
5 tokenGenerator()OAuth2TokenGenerator,用于生成 OAuth2 授权服务器支持的令牌。
6 clientAuthentication()OAuth2 客户端身份验证的配置程序。
7 authorizationEndpoint()OAuth2 授权端点的配置程序。
8 deviceAuthorizationEndpoint()OAuth2 设备授权端点的配置者。
9 deviceVerificationEndpoint()OAuth2 设备验证端点的配置程序。
10 tokenEndpoint()OAuth2 令牌终端节点的配置程序。
11 tokenIntrospectionEndpoint()OAuth2 令牌侦测端点的配置者。
12 tokenRevocationEndpoint()OAuth2 令牌吊销终结点的配置者。
13 authorizationServerMetadataEndpoint()OAuth2 授权服务器元数据端点的配置程序。
14 providerConfigurationEndpoint()OpenID Connect 1.0 提供程序配置端点的配置程序。
15 logoutEndpoint()OpenID Connect 1.0 注销端点的配置程序。
16 userInfoEndpoint()OpenID Connect 1.0 UserInfo 端点的配置程序。
17 clientRegistrationEndpoint()OpenID Connect 1.0 客户端注册端点的配置程序。

配置授权服务器设置

AuthorizationServerSettings包含 OAuth2 授权服务器的配置设置。 它指定协议终结点以及颁发者标识符。 协议终结点的默认值如下:URIURISpring中文文档

public final class AuthorizationServerSettings extends AbstractSettings {

	...

	public static Builder builder() {
		return new Builder()
			.authorizationEndpoint("/oauth2/authorize")
			.deviceAuthorizationEndpoint("/oauth2/device_authorization")
			.deviceVerificationEndpoint("/oauth2/device_verification")
			.tokenEndpoint("/oauth2/token")
			.tokenIntrospectionEndpoint("/oauth2/introspect")
			.tokenRevocationEndpoint("/oauth2/revoke")
			.jwkSetEndpoint("/oauth2/jwks")
			.oidcLogoutEndpoint("/connect/logout")
			.oidcUserInfoEndpoint("/userinfo")
			.oidcClientRegistrationEndpoint("/connect/register");
	}

	...

}
AuthorizationServerSettings必需的组件。
@Import(OAuth2AuthorizationServerConfiguration.class) 会自动注册 ,如果尚未提供。AuthorizationServerSettings@Bean

以下示例演示如何自定义配置设置并注册:AuthorizationServerSettings@BeanSpring中文文档

@Bean
public AuthorizationServerSettings authorizationServerSettings() {
	return AuthorizationServerSettings.builder()
		.issuer("https://example.com")
		.authorizationEndpoint("/oauth2/v1/authorize")
		.deviceAuthorizationEndpoint("/oauth2/v1/device_authorization")
		.deviceVerificationEndpoint("/oauth2/v1/device_verification")
		.tokenEndpoint("/oauth2/v1/token")
		.tokenIntrospectionEndpoint("/oauth2/v1/introspect")
		.tokenRevocationEndpoint("/oauth2/v1/revoke")
		.jwkSetEndpoint("/oauth2/v1/jwks")
		.oidcLogoutEndpoint("/connect/v1/logout")
		.oidcUserInfoEndpoint("/connect/v1/userinfo")
		.oidcClientRegistrationEndpoint("/connect/v1/register")
		.build();
}

是一个上下文对象,用于保存授权服务器运行时环境的信息。 它提供对 和 “当前” 颁发者标识符的访问。AuthorizationServerContextAuthorizationServerSettingsSpring中文文档

如果未在 中配置颁发者标识符,则从当前请求中解析该标识符。AuthorizationServerSettings.builder().issuer(String)
可通过 访问,该 使用 .AuthorizationServerContextAuthorizationServerContextHolderThreadLocal
AuthorizationServerSettings必需的组件。
@Import(OAuth2AuthorizationServerConfiguration.class) 会自动注册 ,如果尚未提供。AuthorizationServerSettings@Bean
如果未在 中配置颁发者标识符,则从当前请求中解析该标识符。AuthorizationServerSettings.builder().issuer(String)
可通过 访问,该 使用 .AuthorizationServerContextAuthorizationServerContextHolderThreadLocal

配置客户端身份验证

OAuth2ClientAuthenticationConfigurer提供自定义 OAuth2 客户端身份验证的功能。 它定义扩展点,使你能够自定义客户端身份验证请求的预处理、主处理和后处理逻辑。Spring中文文档

OAuth2ClientAuthenticationConfigurer提供以下配置选项:Spring中文文档

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

	authorizationServerConfigurer
		.clientAuthentication(clientAuthentication ->
			clientAuthentication
				.authenticationConverter(authenticationConverter)   (1)
				.authenticationConverters(authenticationConvertersConsumer) (2)
				.authenticationProvider(authenticationProvider) (3)
				.authenticationProviders(authenticationProvidersConsumer)   (4)
				.authenticationSuccessHandler(authenticationSuccessHandler) (5)
				.errorResponseHandler(errorResponseHandler) (6)
		);

	return http.build();
}
1 authenticationConverter():将尝试从中提取客户端凭据时使用的(预处理器)添加到 的实例中。AuthenticationConverterHttpServletRequestOAuth2ClientAuthenticationToken
2 authenticationConverters():设置提供对默认和(可选)添加的访问权限,允许添加、删除或自定义特定 .ConsumerListAuthenticationConverterAuthenticationConverter
3 authenticationProvider():添加用于验证 .AuthenticationProviderOAuth2ClientAuthenticationToken
4 authenticationProviders():设置提供对默认和(可选)添加的访问权限,允许添加、删除或自定义特定 .ConsumerListAuthenticationProviderAuthenticationProvider
5 authenticationSuccessHandler():(后处理器)用于处理成功的客户端身份验证并将 关联到 .AuthenticationSuccessHandlerOAuth2ClientAuthenticationTokenSecurityContext
6 errorResponseHandler():(后处理器)用于处理失败的客户端身份验证并返回 OAuth2Error 响应AuthenticationFailureHandler

OAuth2ClientAuthenticationConfigurer配置并将其注册到 OAuth2 授权服务器。 是处理客户端身份验证请求的。OAuth2ClientAuthenticationFilterSecurityFilterChain@BeanOAuth2ClientAuthenticationFilterFilterSpring中文文档

默认情况下,OAuth2 令牌终结点OAuth2 令牌自检终结点OAuth2 令牌吊销终结点需要客户端身份验证。 支持的客户端身份验证方法包括 、 、 、 和 (公共客户端)。client_secret_basicclient_secret_postprivate_key_jwtclient_secret_jwtnoneSpring中文文档

OAuth2ClientAuthenticationFilter配置了以下默认值:Spring中文文档

  • AuthenticationConverter— A 由 、 、 和 组成。DelegatingAuthenticationConverterJwtClientAssertionAuthenticationConverterClientSecretBasicAuthenticationConverterClientSecretPostAuthenticationConverterPublicClientAuthenticationConverterSpring中文文档

  • AuthenticationManager— 由 、 和 组成。AuthenticationManagerJwtClientAssertionAuthenticationProviderClientSecretAuthenticationProviderPublicClientAuthenticationProviderSpring中文文档

  • AuthenticationSuccessHandler— 将 “authenticated” (current ) 与 .OAuth2ClientAuthenticationTokenAuthenticationSecurityContextSpring中文文档

  • AuthenticationFailureHandler— 使用关联的内部实现返回 OAuth2 错误响应。OAuth2ErrorOAuth2AuthenticationExceptionSpring中文文档

自定义 Jwt 客户端断言验证

JwtClientAssertionDecoderFactory.DEFAULT_JWT_VALIDATOR_FACTORY是为指定对象提供 an 的默认工厂,用于验证客户端断言的 、 、 和 声明。OAuth2TokenValidator<Jwt>RegisteredClientisssubaudexpnbfJwtSpring中文文档

JwtClientAssertionDecoderFactory通过向 提供 类型的自定义工厂来覆盖默认客户端断言验证的功能。JwtFunction<RegisteredClient, OAuth2TokenValidator<Jwt>>setJwtValidatorFactory()Spring中文文档

JwtClientAssertionDecoderFactory是为指定对象提供 a 的默认值,用于在 OAuth2 客户端身份验证期间对持有者令牌进行身份验证。JwtDecoderFactoryJwtClientAssertionAuthenticationProviderJwtDecoderRegisteredClientJwt

自定义的常见用例是验证客户端断言中的其他声明。JwtClientAssertionDecoderFactoryJwtSpring中文文档

以下示例演示如何使用自定义项进行配置,以验证客户端断言中的其他声明:JwtClientAssertionAuthenticationProviderJwtClientAssertionDecoderFactoryJwtSpring中文文档

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

	authorizationServerConfigurer
		.clientAuthentication(clientAuthentication ->
			clientAuthentication
				.authenticationProviders(configureJwtClientAssertionValidator())
		);

	return http.build();
}

private Consumer<List<AuthenticationProvider>> configureJwtClientAssertionValidator() {
	return (authenticationProviders) ->
		authenticationProviders.forEach((authenticationProvider) -> {
			if (authenticationProvider instanceof JwtClientAssertionAuthenticationProvider) {
				// Customize JwtClientAssertionDecoderFactory
				JwtClientAssertionDecoderFactory jwtDecoderFactory = new JwtClientAssertionDecoderFactory();
				Function<RegisteredClient, OAuth2TokenValidator<Jwt>> jwtValidatorFactory = (registeredClient) ->
					new DelegatingOAuth2TokenValidator<>(
						// Use default validators
						JwtClientAssertionDecoderFactory.DEFAULT_JWT_VALIDATOR_FACTORY.apply(registeredClient),
						// Add custom validator
						new JwtClaimValidator<>("claim", "value"::equals));
				jwtDecoderFactory.setJwtValidatorFactory(jwtValidatorFactory);

				((JwtClientAssertionAuthenticationProvider) authenticationProvider)
					.setJwtDecoderFactory(jwtDecoderFactory);
			}
		});
}
1 authenticationConverter():将尝试从中提取客户端凭据时使用的(预处理器)添加到 的实例中。AuthenticationConverterHttpServletRequestOAuth2ClientAuthenticationToken
2 authenticationConverters():设置提供对默认和(可选)添加的访问权限,允许添加、删除或自定义特定 .ConsumerListAuthenticationConverterAuthenticationConverter
3 authenticationProvider():添加用于验证 .AuthenticationProviderOAuth2ClientAuthenticationToken
4 authenticationProviders():设置提供对默认和(可选)添加的访问权限,允许添加、删除或自定义特定 .ConsumerListAuthenticationProviderAuthenticationProvider
5 authenticationSuccessHandler():(后处理器)用于处理成功的客户端身份验证并将 关联到 .AuthenticationSuccessHandlerOAuth2ClientAuthenticationTokenSecurityContext
6 errorResponseHandler():(后处理器)用于处理失败的客户端身份验证并返回 OAuth2Error 响应AuthenticationFailureHandler
JwtClientAssertionDecoderFactory是为指定对象提供 a 的默认值,用于在 OAuth2 客户端身份验证期间对持有者令牌进行身份验证。JwtDecoderFactoryJwtClientAssertionAuthenticationProviderJwtDecoderRegisteredClientJwt