|
@@ -29,6 +29,9 @@ import org.springframework.security.oauth2.client.authentication.TestOAuth2Autho
|
|
|
import org.springframework.security.oauth2.client.registration.ClientRegistration;
|
|
|
import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository;
|
|
|
import org.springframework.security.oauth2.client.registration.TestClientRegistrations;
|
|
|
+import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
|
|
|
+import org.springframework.security.oauth2.core.OAuth2AuthorizationException;
|
|
|
+import org.springframework.security.oauth2.core.OAuth2Error;
|
|
|
import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest;
|
|
|
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
@@ -41,6 +44,7 @@ import java.util.LinkedHashMap;
|
|
|
import java.util.Map;
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThatCode;
|
|
|
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
|
import static org.mockito.Mockito.times;
|
|
|
import static org.mockito.Mockito.verify;
|
|
@@ -226,6 +230,56 @@ public class OAuth2AuthorizationCodeGrantWebFilterTests {
|
|
|
verifyZeroInteractions(this.authenticationManager);
|
|
|
}
|
|
|
|
|
|
+ // gh-8609
|
|
|
+ @Test
|
|
|
+ public void filterWhenAuthenticationConverterThrowsOAuth2AuthorizationExceptionThenMappedToOAuth2AuthenticationException() {
|
|
|
+ ClientRegistration clientRegistration = TestClientRegistrations.clientRegistration().build();
|
|
|
+ when(this.clientRegistrationRepository.findByRegistrationId(any())).thenReturn(Mono.empty());
|
|
|
+
|
|
|
+ MockServerHttpRequest authorizationRequest =
|
|
|
+ createAuthorizationRequest("/authorization/callback");
|
|
|
+ OAuth2AuthorizationRequest oauth2AuthorizationRequest =
|
|
|
+ createOAuth2AuthorizationRequest(authorizationRequest, clientRegistration);
|
|
|
+ MockServerHttpRequest authorizationResponse = createAuthorizationResponse(authorizationRequest);
|
|
|
+ MockServerWebExchange exchange = MockServerWebExchange.from(authorizationResponse);
|
|
|
+ DefaultWebFilterChain chain = new DefaultWebFilterChain(
|
|
|
+ e -> e.getResponse().setComplete(), Collections.emptyList());
|
|
|
+
|
|
|
+ this.authorizationRequestRepository.saveAuthorizationRequest(oauth2AuthorizationRequest, exchange).block();
|
|
|
+
|
|
|
+ assertThatThrownBy(() -> this.filter.filter(exchange, chain).block())
|
|
|
+ .isInstanceOf(OAuth2AuthenticationException.class)
|
|
|
+ .hasMessageContaining("client_registration_not_found");
|
|
|
+ verifyZeroInteractions(this.authenticationManager);
|
|
|
+ }
|
|
|
+
|
|
|
+ // gh-8609
|
|
|
+ @Test
|
|
|
+ public void filterWhenAuthenticationManagerThrowsOAuth2AuthorizationExceptionThenMappedToOAuth2AuthenticationException() {
|
|
|
+ ClientRegistration clientRegistration = TestClientRegistrations.clientRegistration().build();
|
|
|
+ when(this.clientRegistrationRepository.findByRegistrationId(any()))
|
|
|
+ .thenReturn(Mono.just(clientRegistration));
|
|
|
+
|
|
|
+ MockServerHttpRequest authorizationRequest =
|
|
|
+ createAuthorizationRequest("/authorization/callback");
|
|
|
+ OAuth2AuthorizationRequest oauth2AuthorizationRequest =
|
|
|
+ createOAuth2AuthorizationRequest(authorizationRequest, clientRegistration);
|
|
|
+
|
|
|
+ when(this.authenticationManager.authenticate(any()))
|
|
|
+ .thenReturn(Mono.error(new OAuth2AuthorizationException(new OAuth2Error("authorization_error"))));
|
|
|
+
|
|
|
+ MockServerHttpRequest authorizationResponse = createAuthorizationResponse(authorizationRequest);
|
|
|
+ MockServerWebExchange exchange = MockServerWebExchange.from(authorizationResponse);
|
|
|
+ DefaultWebFilterChain chain = new DefaultWebFilterChain(
|
|
|
+ e -> e.getResponse().setComplete(), Collections.emptyList());
|
|
|
+
|
|
|
+ this.authorizationRequestRepository.saveAuthorizationRequest(oauth2AuthorizationRequest, exchange).block();
|
|
|
+
|
|
|
+ assertThatThrownBy(() -> this.filter.filter(exchange, chain).block())
|
|
|
+ .isInstanceOf(OAuth2AuthenticationException.class)
|
|
|
+ .hasMessageContaining("authorization_error");
|
|
|
+ }
|
|
|
+
|
|
|
private static OAuth2AuthorizationRequest createOAuth2AuthorizationRequest(
|
|
|
MockServerHttpRequest authorizationRequest, ClientRegistration registration) {
|
|
|
Map<String, Object> additionalParameters = new HashMap<>();
|