跳到主要内容
版本:7.0.2

DeepSeek V3 中英对照 OAuth2 Client Authentication #

客户端身份验证支持

客户端凭证

使用 client_secret_basic 进行身份验证

客户端通过HTTP Basic进行身份验证的功能已默认支持,无需额外定制即可启用。该功能的默认实现由 DefaultOAuth2TokenRequestHeadersConverter 提供。

给定以下用于 OAuth 2.0 客户端注册的 Spring Boot 属性:

spring:
security:
oauth2:
client:
registration:
okta:
client-id: client-id
client-secret: client-secret
client-authentication-method: client_secret_basic
authorization-grant-type: authorization_code
...

以下示例展示了如何配置 RestClientAuthorizationCodeTokenResponseClient 以禁用客户端凭据的 URL 编码:

DefaultOAuth2TokenRequestHeadersConverter<OAuth2AuthorizationCodeGrantRequest> headersConverter =
new DefaultOAuth2TokenRequestHeadersConverter<>();
headersConverter.setEncodeClientCredentials(false);

RestClientAuthorizationCodeTokenResponseClient tokenResponseClient =
new RestClientAuthorizationCodeTokenResponseClient();
tokenResponseClient.setHeadersConverter(headersConverter);

使用 client_secret_post 进行身份验证

客户端认证支持在请求体中包含客户端凭据,开箱即用,无需任何定制即可启用。

以下Spring Boot属性展示了OAuth 2.0客户端注册的配置:

spring:
security:
oauth2:
client:
registration:
okta:
client-id: client-id
client-secret: client-secret
client-authentication-method: client_secret_post
authorization-grant-type: authorization_code
...

JWT Bearer

备注

有关 JWT Bearer 客户端认证的更多详细信息,请参阅《OAuth 2.0 客户端认证与授权许可的 JSON Web Token (JWT) 规范》。

JWT Bearer客户端认证的默认实现是NimbusJwtClientAuthenticationParametersConverter,这是一个通过向client_assertion参数添加已签名的JSON Web令牌(JWS)来自定义令牌请求参数的Converter

用于签署JWS的java.security.PrivateKeyjavax.crypto.SecretKey由与NimbusJwtClientAuthenticationParametersConverter关联的com.nimbusds.jose.jwk.JWK解析器提供。

使用 private_key_jwt 进行身份验证

给定以下用于 OAuth 2.0 客户端注册的 Spring Boot 属性:

spring:
security:
oauth2:
client:
registration:
okta:
client-id: okta-client-id
client-authentication-method: private_key_jwt
authorization-grant-type: authorization_code
...

以下示例展示了如何配置 RestClientAuthorizationCodeTokenResponseClient

Function<ClientRegistration, JWK> jwkResolver = (clientRegistration) -> {
if (clientRegistration.getClientAuthenticationMethod().equals(ClientAuthenticationMethod.PRIVATE_KEY_JWT)) {
// Assuming RSA key type
RSAPublicKey publicKey = ...
RSAPrivateKey privateKey = ...
return new RSAKey.Builder(publicKey)
.privateKey(privateKey)
.keyID(UUID.randomUUID().toString())
.build();
}
return null;
};

RestClientAuthorizationCodeTokenResponseClient tokenResponseClient =
new RestClientAuthorizationCodeTokenResponseClient();
tokenResponseClient.addParametersConverter(
new NimbusJwtClientAuthenticationParametersConverter<>(jwkResolver));

使用 client_secret_jwt 进行身份验证

给定以下用于 OAuth 2.0 客户端注册的 Spring Boot 属性:

spring:
security:
oauth2:
client:
registration:
okta:
client-id: okta-client-id
client-secret: okta-client-secret
client-authentication-method: client_secret_jwt
authorization-grant-type: client_credentials
...

以下示例展示了如何配置 RestClientClientCredentialsTokenResponseClient

Function<ClientRegistration, JWK> jwkResolver = (clientRegistration) -> {
if (clientRegistration.getClientAuthenticationMethod().equals(ClientAuthenticationMethod.CLIENT_SECRET_JWT)) {
SecretKeySpec secretKey = new SecretKeySpec(
clientRegistration.getClientSecret().getBytes(StandardCharsets.UTF_8),
"HmacSHA256");
return new OctetSequenceKey.Builder(secretKey)
.keyID(UUID.randomUUID().toString())
.build();
}
return null;
};

RestClientClientCredentialsTokenResponseClient tokenResponseClient =
new RestClientClientCredentialsTokenResponseClient();
tokenResponseClient.addParametersConverter(
new NimbusJwtClientAuthenticationParametersConverter<>(jwkResolver));

自定义 JWT 断言

NimbusJwtClientAuthenticationParametersConverter 生成的 JWT 默认包含 isssubaudjtiiatexp 声明。您可以通过向 setJwtClientAssertionCustomizer() 提供一个 Consumer<NimbusJwtClientAuthenticationParametersConverter.JwtClientAuthenticationContext<T>> 来自定义头部和/或声明。以下示例展示了如何自定义 JWT 的声明:

Function<ClientRegistration, JWK> jwkResolver = ...

NimbusJwtClientAuthenticationParametersConverter<OAuth2ClientCredentialsGrantRequest> converter =
new NimbusJwtClientAuthenticationParametersConverter<>(jwkResolver);
converter.setJwtClientAssertionCustomizer((context) -> {
context.getHeaders().header("custom-header", "header-value");
context.getClaims().claim("custom-claim", "claim-value");
});

公共认证

公共客户端身份验证已默认支持,无需任何自定义配置即可启用。

以下Spring Boot属性展示了OAuth 2.0客户端注册的配置:

spring:
security:
oauth2:
client:
registration:
okta:
client-id: client-id
client-authentication-method: none
authorization-grant-type: authorization_code
...
备注

公共客户端支持使用代码交换证明密钥 (PKCE)。当 client-authentication-method 设置为 "none" (ClientAuthenticationMethod.NONE) 时,将自动启用 PKCE。