对于最新的稳定版本,请使用 Spring Authorization Server 1.3.1!

对于最新的稳定版本,请使用 Spring Authorization Server 1.3.1!

默认配置

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

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

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

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

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

以下示例演示如何使用应用最小默认配置:OAuth2AuthorizationServerConfiguration

@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 来启用:OidcConfigurer

@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@Bean

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

以下示例演示如何注册:JwtDecoder@Bean

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

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

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 授权服务器的安全配置的功能。 它允许您指定要使用的核心组件 - 例如,RegisteredClientRepository、OAuth2AuthorizationService、OAuth2TokenGenerator 等。 此外,它还允许您自定义协议端点的请求处理逻辑,例如授权端点、设备授权端点、设备验证端点、令牌端点、令牌自检端点等。

OAuth2AuthorizationServerConfigurer提供以下配置选项:

@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():用于管理新客户端和现有客户端的 RegisteredClientRepository (REQUIRED)。
2 authorizationService():用于管理新授权和现有授权的 OAuth2AuthorizationService。
3 authorizationConsentService():用于管理新的和现有的授权许可的 OAuth2AuthorizationConsentService。
4 authorizationServerSettings():用于自定义 OAuth2 授权服务器配置设置的 AuthorizationServerSettings (REQUIRED)。
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():用于管理新客户端和现有客户端的 RegisteredClientRepository (REQUIRED)。
2 authorizationService():用于管理新授权和现有授权的 OAuth2AuthorizationService。
3 authorizationConsentService():用于管理新的和现有的授权许可的 OAuth2AuthorizationConsentService。
4 authorizationServerSettings():用于自定义 OAuth2 授权服务器配置设置的 AuthorizationServerSettings (REQUIRED)。
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 授权服务器的配置设置。 它指定协议终结点以及颁发者标识符。 协议终结点的默认值如下:URIURI

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@Bean

@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();
}

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

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

配置客户端身份验证

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

OAuth2ClientAuthenticationConfigurer提供以下配置选项:

@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@BeanOAuth2ClientAuthenticationFilterFilter

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

OAuth2ClientAuthenticationFilter配置了以下默认值:

  • AuthenticationConverter— A 由 、 、 和 组成。DelegatingAuthenticationConverterJwtClientAssertionAuthenticationConverterClientSecretBasicAuthenticationConverterClientSecretPostAuthenticationConverterPublicClientAuthenticationConverter

  • AuthenticationManager— 由 、 和 组成。AuthenticationManagerJwtClientAssertionAuthenticationProviderClientSecretAuthenticationProviderPublicClientAuthenticationProvider

  • AuthenticationSuccessHandler— 将 “authenticated” (current ) 与 .OAuth2ClientAuthenticationTokenAuthenticationSecurityContext

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

自定义 Jwt 客户端断言验证

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

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

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

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

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

@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