Как обрабатывать исключение OAuth2AuthenticationException: сбой проверки подлинности клиента: client_id в Spring Security
Я внедряю новый сервер авторизации Spring (spring-security-oauth2-authorization-server версии 1.0.0). Я создал следующие два класса для обработки исключений:
public class RestExceptionTranslationFilter implements AuthenticationFailureHandler {
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
// Code to handle the exception
}
}
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authenticationException) throws IOException, ServletException {
// Code to handle the exception
}
}
Я зарегистрировал их обоих следующим образом:
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
...
OAuth2AuthorizationServerConfigurer authorizationServerConfigurer = new OAuth2AuthorizationServerConfigurer();
authorizationServerConfigurer.tokenEndpoint(tokenEndpoint ->
((OAuth2TokenEndpointConfigurer)tokenEndpoint).errorResponseHandler(new RestExceptionTranslationFilter())
);
...
http.exceptionHandling(exceptions ->
exceptions.authenticationEntryPoint(new RestAuthenticationEntryPoint()));
}
Теперь я могу обрабатывать исключения и другие исключения и возвращать ответ, который требует моя реализация. Например, это исключение обрабатывается правильно:
org.springframework.security.oauth2.core.OAuth2AuthenticationException: OAuth 2.0 Parameter: grant_type
at org.springframework.security.oauth2.server.authorization.web.OAuth2TokenEndpointFilter.throwError(OAuth2TokenEndpointFilter.java:260) ~[spring-security-oauth2-authorization-server-1.0.0.jar:1.0.0]
at org.springframework.security.oauth2.server.authorization.web.OAuth2TokenEndpointFilter.doFilterInternal(OAuth2TokenEndpointFilter.java:159) ~[spring-security-oauth2-authorization-server-1.0.0.jar:1.0.0]
Но, что меня смущает, и я не могу решить, почему жеOAuth2AuthenticationException
исключение не обрабатывается этой конфигурацией в случае, если оно выбрасывается таким образом изClientSecretAuthenticationProvider
:
org.springframework.security.oauth2.core.OAuth2AuthenticationException: Client authentication failed: client_id
at org.springframework.security.oauth2.server.authorization.authentication.ClientSecretAuthenticationProvider.throwInvalidClient(ClientSecretAuthenticationProvider.java:151) ~[spring-security-oauth2-authorization-server-1.0.0.jar:1.0.0]
at org.springframework.security.oauth2.server.authorization.authentication.ClientSecretAuthenticationProvider.authenticate(ClientSecretAuthenticationProvider.java:99) ~[spring-security-oauth2-authorization-server-1.0.0.jar:1.0.0]
Можно ли обработать это исключение и как, я бы очень хотел не раскрывать сообщение"error": "invalid_client"
возможным злоумышленникам?
1 ответ
Взгляните на Configuring Client Authentication в справочнике. Это будет очень похоже на то, как вы настроилиtokenEndpoint()
:
authorizationServerConfigurer
.clientAuthentication(clientAuthentication ->
clientAuthentication
.errorResponseHandler(new RestExceptionTranslationFilter())
);
Примечание: «TranslationFilter», вероятно, не лучшее название дляAuthenticationFailureHandler
, но это незначительная деталь.