Skip to content

Commit d8d59e9

Browse files
alek-sysjgrandja
authored andcommitted
Correctly configure authorization requests repository for OAuth2 login
To use custom ServerAuthorizationRequestRepository both OAuth2AuthorizationRequestRedirectWebFilter and OAuth2LoginAuthenticationWebFilter should use the same repo provided in the configuration. Currently the former filter is correctly configured, but the latter always uses default, WebSession based repository. So authorization code created before redirect to authorization endpoint will never be found to complete OAuth2 login when custom ServerAuthorizationRequestRepository is used. This change also makes OAuth2Client and OAuth2Login authentication converters consistent. Fixes gh-7675
1 parent 65513f2 commit d8d59e9

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

config/src/main/java/org/springframework/security/config/web/server/ServerHttpSecurity.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1084,7 +1084,9 @@ public OAuth2LoginSpec authenticationConverter(ServerAuthenticationConverter aut
10841084

10851085
private ServerAuthenticationConverter getAuthenticationConverter(ReactiveClientRegistrationRepository clientRegistrationRepository) {
10861086
if (this.authenticationConverter == null) {
1087-
this.authenticationConverter = new ServerOAuth2AuthorizationCodeAuthenticationTokenConverter(clientRegistrationRepository);
1087+
ServerOAuth2AuthorizationCodeAuthenticationTokenConverter authenticationConverter = new ServerOAuth2AuthorizationCodeAuthenticationTokenConverter(clientRegistrationRepository);
1088+
authenticationConverter.setAuthorizationRequestRepository(getAuthorizationRequestRepository());
1089+
this.authenticationConverter = authenticationConverter;
10881090
}
10891091
return this.authenticationConverter;
10901092
}

config/src/test/java/org/springframework/security/config/web/server/ServerHttpSecurityTests.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@
3939
import org.mockito.junit.MockitoJUnitRunner;
4040

4141
import org.springframework.security.core.Authentication;
42+
import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository;
43+
import org.springframework.security.oauth2.client.web.server.ServerAuthorizationRequestRepository;
44+
import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest;
45+
import org.springframework.security.oauth2.core.endpoint.TestOAuth2AuthorizationRequests;
4246
import org.springframework.security.web.authentication.preauth.x509.X509PrincipalExtractor;
4347
import org.springframework.security.web.server.authentication.ServerX509AuthenticationConverter;
4448
import reactor.core.publisher.Mono;
@@ -475,6 +479,28 @@ public void postWhenCustomCsrfTokenRepositoryThenUsed() {
475479
verify(customServerCsrfTokenRepository).loadToken(any());
476480
}
477481

482+
@Test
483+
public void shouldConfigureAuthorizationRequestRepositoryForOAuth2Login() {
484+
ServerAuthorizationRequestRepository<OAuth2AuthorizationRequest> authorizationRequestRepository = mock(ServerAuthorizationRequestRepository.class);
485+
ReactiveClientRegistrationRepository clientRegistrationRepository = mock(ReactiveClientRegistrationRepository.class);
486+
487+
OAuth2AuthorizationRequest authorizationRequest = TestOAuth2AuthorizationRequests.request().build();
488+
489+
when(authorizationRequestRepository.removeAuthorizationRequest(any())).thenReturn(Mono.just(authorizationRequest));
490+
491+
SecurityWebFilterChain securityFilterChain = this.http
492+
.oauth2Login()
493+
.clientRegistrationRepository(clientRegistrationRepository)
494+
.authorizationRequestRepository(authorizationRequestRepository)
495+
.and()
496+
.build();
497+
498+
WebTestClient client = WebTestClientBuilder.bindToWebFilters(securityFilterChain).build();
499+
client.get().uri("/login/oauth2/code/registration-id").exchange();
500+
501+
verify(authorizationRequestRepository).removeAuthorizationRequest(any());
502+
}
503+
478504
private boolean isX509Filter(WebFilter filter) {
479505
try {
480506
Object converter = ReflectionTestUtils.getField(filter, "authenticationConverter");

0 commit comments

Comments
 (0)