Как обрабатывать исключение 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, но это незначительная деталь.