Remove blank lines from all tests
Remove all blank lines from test code so that test methods are visually grouped together. This generally helps to make the test classes easer to scan, however, the "given" / "when" / "then" blocks used by some tests are now not as easy to discern. Issue gh-8945
This commit is contained in:
@@ -61,7 +61,6 @@ public class AuthorizationCodeOAuth2AuthorizedClientProviderTests {
|
||||
@Test
|
||||
public void authorizeWhenNotAuthorizationCodeThenUnableToAuthorize() {
|
||||
ClientRegistration clientCredentialsClient = TestClientRegistrations.clientCredentials().build();
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(clientCredentialsClient).principal(this.principal).build();
|
||||
assertThat(this.authorizedClientProvider.authorize(authorizationContext)).isNull();
|
||||
|
||||
@@ -61,7 +61,6 @@ public class AuthorizationCodeReactiveOAuth2AuthorizedClientProviderTests {
|
||||
@Test
|
||||
public void authorizeWhenNotAuthorizationCodeThenUnableToAuthorize() {
|
||||
ClientRegistration clientCredentialsClient = TestClientRegistrations.clientCredentials().build();
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(clientCredentialsClient).principal(this.principal).build();
|
||||
assertThat(this.authorizedClientProvider.authorize(authorizationContext).block()).isNull();
|
||||
|
||||
@@ -166,20 +166,16 @@ public class AuthorizedClientServiceOAuth2AuthorizedClientManagerTests {
|
||||
public void authorizeWhenNotAuthorizedAndUnsupportedProviderThenNotAuthorized() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(this.clientRegistration);
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(authorizeRequest);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
assertThat(authorizedClient).isNull();
|
||||
verifyNoInteractions(this.authorizationSuccessHandler);
|
||||
verify(this.authorizedClientService, never()).saveAuthorizedClient(any(), any());
|
||||
@@ -190,23 +186,18 @@ public class AuthorizedClientServiceOAuth2AuthorizedClientManagerTests {
|
||||
public void authorizeWhenNotAuthorizedAndSupportedProviderThenAuthorized() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(this.clientRegistration);
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(this.authorizedClient);
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(authorizeRequest);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
assertThat(authorizedClient).isSameAs(this.authorizedClient);
|
||||
verify(this.authorizationSuccessHandler).onAuthorizationSuccess(eq(this.authorizedClient), eq(this.principal),
|
||||
any());
|
||||
@@ -220,26 +211,20 @@ public class AuthorizedClientServiceOAuth2AuthorizedClientManagerTests {
|
||||
.willReturn(this.clientRegistration);
|
||||
given(this.authorizedClientService.loadAuthorizedClient(eq(this.clientRegistration.getRegistrationId()),
|
||||
eq(this.principal.getName()))).willReturn(this.authorizedClient);
|
||||
|
||||
OAuth2AuthorizedClient reauthorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), TestOAuth2AccessTokens.noScopes(), TestOAuth2RefreshTokens.refreshToken());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(reauthorizedClient);
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(authorizeRequest);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isSameAs(this.authorizedClient);
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
assertThat(authorizedClient).isSameAs(reauthorizedClient);
|
||||
verify(this.authorizationSuccessHandler).onAuthorizationSuccess(eq(reauthorizedClient), eq(this.principal),
|
||||
any());
|
||||
@@ -252,15 +237,12 @@ public class AuthorizedClientServiceOAuth2AuthorizedClientManagerTests {
|
||||
OAuth2AuthorizeRequest reauthorizeRequest = OAuth2AuthorizeRequest.withAuthorizedClient(this.authorizedClient)
|
||||
.principal(this.principal).build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(reauthorizeRequest);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(reauthorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isSameAs(this.authorizedClient);
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
assertThat(authorizedClient).isSameAs(this.authorizedClient);
|
||||
verifyNoInteractions(this.authorizationSuccessHandler);
|
||||
verify(this.authorizedClientService, never()).saveAuthorizedClient(any(), any());
|
||||
@@ -271,22 +253,17 @@ public class AuthorizedClientServiceOAuth2AuthorizedClientManagerTests {
|
||||
public void reauthorizeWhenSupportedProviderThenReauthorized() {
|
||||
OAuth2AuthorizedClient reauthorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), TestOAuth2AccessTokens.noScopes(), TestOAuth2RefreshTokens.refreshToken());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(reauthorizedClient);
|
||||
|
||||
OAuth2AuthorizeRequest reauthorizeRequest = OAuth2AuthorizeRequest.withAuthorizedClient(this.authorizedClient)
|
||||
.principal(this.principal).build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(reauthorizeRequest);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(reauthorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isSameAs(this.authorizedClient);
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
assertThat(authorizedClient).isSameAs(reauthorizedClient);
|
||||
verify(this.authorizationSuccessHandler).onAuthorizationSuccess(eq(reauthorizedClient), eq(this.principal),
|
||||
any());
|
||||
@@ -298,20 +275,15 @@ public class AuthorizedClientServiceOAuth2AuthorizedClientManagerTests {
|
||||
public void reauthorizeWhenRequestAttributeScopeThenMappedToContext() {
|
||||
OAuth2AuthorizedClient reauthorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), TestOAuth2AccessTokens.noScopes(), TestOAuth2RefreshTokens.refreshToken());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(reauthorizedClient);
|
||||
|
||||
// Override the mock with the default
|
||||
this.authorizedClientManager.setContextAttributesMapper(
|
||||
new AuthorizedClientServiceOAuth2AuthorizedClientManager.DefaultContextAttributesMapper());
|
||||
|
||||
OAuth2AuthorizeRequest reauthorizeRequest = OAuth2AuthorizeRequest.withAuthorizedClient(this.authorizedClient)
|
||||
.principal(this.principal).attribute(OAuth2ParameterNames.SCOPE, "read write").build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(reauthorizeRequest);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isSameAs(this.authorizedClient);
|
||||
@@ -321,7 +293,6 @@ public class AuthorizedClientServiceOAuth2AuthorizedClientManagerTests {
|
||||
String[] requestScopeAttribute = authorizationContext
|
||||
.getAttribute(OAuth2AuthorizationContext.REQUEST_SCOPE_ATTRIBUTE_NAME);
|
||||
assertThat(requestScopeAttribute).contains("read", "write");
|
||||
|
||||
assertThat(authorizedClient).isSameAs(reauthorizedClient);
|
||||
verify(this.authorizationSuccessHandler).onAuthorizationSuccess(eq(reauthorizedClient), eq(this.principal),
|
||||
any());
|
||||
@@ -333,16 +304,12 @@ public class AuthorizedClientServiceOAuth2AuthorizedClientManagerTests {
|
||||
ClientAuthorizationException authorizationException = new ClientAuthorizationException(
|
||||
new OAuth2Error(OAuth2ErrorCodes.INVALID_GRANT, null, null),
|
||||
this.clientRegistration.getRegistrationId());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willThrow(authorizationException);
|
||||
|
||||
OAuth2AuthorizeRequest reauthorizeRequest = OAuth2AuthorizeRequest.withAuthorizedClient(this.authorizedClient)
|
||||
.principal(this.principal).build();
|
||||
|
||||
assertThatCode(() -> this.authorizedClientManager.authorize(reauthorizeRequest))
|
||||
.isEqualTo(authorizationException);
|
||||
|
||||
verify(this.authorizationFailureHandler).onAuthorizationFailure(eq(authorizationException), eq(this.principal),
|
||||
any());
|
||||
verify(this.authorizedClientService).removeAuthorizedClient(eq(this.clientRegistration.getRegistrationId()),
|
||||
@@ -353,16 +320,12 @@ public class AuthorizedClientServiceOAuth2AuthorizedClientManagerTests {
|
||||
public void reauthorizeWhenErrorCodeDoesNotMatchThenDoNotRemoveAuthorizedClient() {
|
||||
ClientAuthorizationException authorizationException = new ClientAuthorizationException(
|
||||
new OAuth2Error("non-matching-error-code", null, null), this.clientRegistration.getRegistrationId());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willThrow(authorizationException);
|
||||
|
||||
OAuth2AuthorizeRequest reauthorizeRequest = OAuth2AuthorizeRequest.withAuthorizedClient(this.authorizedClient)
|
||||
.principal(this.principal).build();
|
||||
|
||||
assertThatCode(() -> this.authorizedClientManager.authorize(reauthorizeRequest))
|
||||
.isEqualTo(authorizationException);
|
||||
|
||||
verify(this.authorizationFailureHandler).onAuthorizationFailure(eq(authorizationException), eq(this.principal),
|
||||
any());
|
||||
verifyNoInteractions(this.authorizedClientService);
|
||||
|
||||
@@ -155,7 +155,6 @@ public class AuthorizedClientServiceReactiveOAuth2AuthorizedClientManagerTests {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(clientRegistrationId)).willReturn(Mono.empty());
|
||||
StepVerifier.create(this.authorizedClientManager.authorize(authorizeRequest))
|
||||
.verifyError(IllegalArgumentException.class);
|
||||
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -164,23 +163,18 @@ public class AuthorizedClientServiceReactiveOAuth2AuthorizedClientManagerTests {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
given(this.authorizedClientService.loadAuthorizedClient(any(), any())).willReturn(Mono.empty());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any())).willReturn(Mono.empty());
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
Mono<OAuth2AuthorizedClient> authorizedClient = this.authorizedClientManager.authorize(authorizeRequest);
|
||||
|
||||
StepVerifier.create(authorizedClient).verifyComplete();
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
verify(this.authorizedClientService, never()).saveAuthorizedClient(any(OAuth2AuthorizedClient.class),
|
||||
eq(this.principal));
|
||||
}
|
||||
@@ -190,27 +184,20 @@ public class AuthorizedClientServiceReactiveOAuth2AuthorizedClientManagerTests {
|
||||
public void authorizeWhenNotAuthorizedAndSupportedProviderThenAuthorized() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
|
||||
given(this.authorizedClientService.loadAuthorizedClient(any(), any())).willReturn(Mono.empty());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.just(this.authorizedClient));
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
Mono<OAuth2AuthorizedClient> authorizedClient = this.authorizedClientManager.authorize(authorizeRequest);
|
||||
|
||||
StepVerifier.create(authorizedClient).expectNext(this.authorizedClient).verifyComplete();
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
verify(this.authorizedClientService).saveAuthorizedClient(eq(this.authorizedClient), eq(this.principal));
|
||||
this.saveAuthorizedClientProbe.assertWasSubscribed();
|
||||
verify(this.authorizedClientService, never()).removeAuthorizedClient(any(), any());
|
||||
@@ -221,31 +208,23 @@ public class AuthorizedClientServiceReactiveOAuth2AuthorizedClientManagerTests {
|
||||
public void authorizeWhenNotAuthorizedAndSupportedProviderAndCustomSuccessHandlerThenInvokeCustomSuccessHandler() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
|
||||
given(this.authorizedClientService.loadAuthorizedClient(any(), any())).willReturn(Mono.empty());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.just(this.authorizedClient));
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
PublisherProbe<Void> authorizationSuccessHandlerProbe = PublisherProbe.empty();
|
||||
this.authorizedClientManager.setAuthorizationSuccessHandler(
|
||||
(client, principal, attributes) -> authorizationSuccessHandlerProbe.mono());
|
||||
|
||||
Mono<OAuth2AuthorizedClient> authorizedClient = this.authorizedClientManager.authorize(authorizeRequest);
|
||||
|
||||
StepVerifier.create(authorizedClient).expectNext(this.authorizedClient).verifyComplete();
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
authorizationSuccessHandlerProbe.assertWasSubscribed();
|
||||
verify(this.authorizedClientService, never()).saveAuthorizedClient(any(), any());
|
||||
verify(this.authorizedClientService, never()).removeAuthorizedClient(any(), any());
|
||||
@@ -255,30 +234,22 @@ public class AuthorizedClientServiceReactiveOAuth2AuthorizedClientManagerTests {
|
||||
public void authorizeWhenInvalidTokenThenRemoveAuthorizedClient() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
|
||||
given(this.authorizedClientService.loadAuthorizedClient(any(), any())).willReturn(Mono.empty());
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
|
||||
ClientAuthorizationException exception = new ClientAuthorizationException(
|
||||
new OAuth2Error(OAuth2ErrorCodes.INVALID_TOKEN, null, null),
|
||||
this.clientRegistration.getRegistrationId());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.error(exception));
|
||||
|
||||
assertThatCode(() -> this.authorizedClientManager.authorize(authorizeRequest).block()).isEqualTo(exception);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
verify(this.authorizedClientService).removeAuthorizedClient(eq(this.clientRegistration.getRegistrationId()),
|
||||
eq(this.principal.getName()));
|
||||
this.removeAuthorizedClientProbe.assertWasSubscribed();
|
||||
@@ -289,30 +260,22 @@ public class AuthorizedClientServiceReactiveOAuth2AuthorizedClientManagerTests {
|
||||
public void authorizeWhenInvalidGrantThenRemoveAuthorizedClient() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
|
||||
given(this.authorizedClientService.loadAuthorizedClient(any(), any())).willReturn(Mono.empty());
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
|
||||
ClientAuthorizationException exception = new ClientAuthorizationException(
|
||||
new OAuth2Error(OAuth2ErrorCodes.INVALID_GRANT, null, null),
|
||||
this.clientRegistration.getRegistrationId());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.error(exception));
|
||||
|
||||
assertThatCode(() -> this.authorizedClientManager.authorize(authorizeRequest).block()).isEqualTo(exception);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
verify(this.authorizedClientService).removeAuthorizedClient(eq(this.clientRegistration.getRegistrationId()),
|
||||
eq(this.principal.getName()));
|
||||
this.removeAuthorizedClientProbe.assertWasSubscribed();
|
||||
@@ -323,30 +286,22 @@ public class AuthorizedClientServiceReactiveOAuth2AuthorizedClientManagerTests {
|
||||
public void authorizeWhenServerErrorThenDoNotRemoveAuthorizedClient() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
|
||||
given(this.authorizedClientService.loadAuthorizedClient(any(), any())).willReturn(Mono.empty());
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
|
||||
ClientAuthorizationException exception = new ClientAuthorizationException(
|
||||
new OAuth2Error(OAuth2ErrorCodes.SERVER_ERROR, null, null),
|
||||
this.clientRegistration.getRegistrationId());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.error(exception));
|
||||
|
||||
assertThatCode(() -> this.authorizedClientManager.authorize(authorizeRequest).block()).isEqualTo(exception);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
verify(this.authorizedClientService, never()).removeAuthorizedClient(any(), any());
|
||||
verify(this.authorizedClientService, never()).saveAuthorizedClient(any(), any());
|
||||
}
|
||||
@@ -355,29 +310,21 @@ public class AuthorizedClientServiceReactiveOAuth2AuthorizedClientManagerTests {
|
||||
public void authorizeWhenOAuth2AuthorizationExceptionThenDoNotRemoveAuthorizedClient() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
|
||||
given(this.authorizedClientService.loadAuthorizedClient(any(), any())).willReturn(Mono.empty());
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
|
||||
OAuth2AuthorizationException exception = new OAuth2AuthorizationException(
|
||||
new OAuth2Error(OAuth2ErrorCodes.INVALID_GRANT, null, null));
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.error(exception));
|
||||
|
||||
assertThatCode(() -> this.authorizedClientManager.authorize(authorizeRequest).block()).isEqualTo(exception);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
verify(this.authorizedClientService, never()).removeAuthorizedClient(any(), any());
|
||||
verify(this.authorizedClientService, never()).saveAuthorizedClient(any(), any());
|
||||
}
|
||||
@@ -386,33 +333,24 @@ public class AuthorizedClientServiceReactiveOAuth2AuthorizedClientManagerTests {
|
||||
public void authorizeWhenOAuth2AuthorizationExceptionAndCustomFailureHandlerThenInvokeCustomFailureHandler() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
|
||||
given(this.authorizedClientService.loadAuthorizedClient(any(), any())).willReturn(Mono.empty());
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
|
||||
OAuth2AuthorizationException exception = new OAuth2AuthorizationException(
|
||||
new OAuth2Error(OAuth2ErrorCodes.INVALID_GRANT, null, null));
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.error(exception));
|
||||
|
||||
PublisherProbe<Void> authorizationFailureHandlerProbe = PublisherProbe.empty();
|
||||
this.authorizedClientManager.setAuthorizationFailureHandler(
|
||||
(client, principal, attributes) -> authorizationFailureHandlerProbe.mono());
|
||||
|
||||
assertThatCode(() -> this.authorizedClientManager.authorize(authorizeRequest).block()).isEqualTo(exception);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
authorizationFailureHandlerProbe.assertWasSubscribed();
|
||||
verify(this.authorizedClientService, never()).removeAuthorizedClient(any(), any());
|
||||
verify(this.authorizedClientService, never()).saveAuthorizedClient(any(), any());
|
||||
@@ -425,27 +363,21 @@ public class AuthorizedClientServiceReactiveOAuth2AuthorizedClientManagerTests {
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
given(this.authorizedClientService.loadAuthorizedClient(eq(this.clientRegistration.getRegistrationId()),
|
||||
eq(this.principal.getName()))).willReturn(Mono.just(this.authorizedClient));
|
||||
|
||||
OAuth2AuthorizedClient reauthorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), TestOAuth2AccessTokens.noScopes(), TestOAuth2RefreshTokens.refreshToken());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.just(reauthorizedClient));
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
Mono<OAuth2AuthorizedClient> authorizedClient = this.authorizedClientManager.authorize(authorizeRequest);
|
||||
|
||||
StepVerifier.create(authorizedClient).expectNext(reauthorizedClient).verifyComplete();
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isSameAs(this.authorizedClient);
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
verify(this.authorizedClientService).saveAuthorizedClient(eq(reauthorizedClient), eq(this.principal));
|
||||
this.saveAuthorizedClientProbe.assertWasSubscribed();
|
||||
verify(this.authorizedClientService, never()).removeAuthorizedClient(any(), any());
|
||||
@@ -458,16 +390,13 @@ public class AuthorizedClientServiceReactiveOAuth2AuthorizedClientManagerTests {
|
||||
OAuth2AuthorizeRequest reauthorizeRequest = OAuth2AuthorizeRequest.withAuthorizedClient(this.authorizedClient)
|
||||
.principal(this.principal).build();
|
||||
Mono<OAuth2AuthorizedClient> authorizedClient = this.authorizedClientManager.authorize(reauthorizeRequest);
|
||||
|
||||
StepVerifier.create(authorizedClient).expectNext(this.authorizedClient).verifyComplete();
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(reauthorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isSameAs(this.authorizedClient);
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
verify(this.authorizedClientService, never()).saveAuthorizedClient(any(OAuth2AuthorizedClient.class),
|
||||
eq(this.principal));
|
||||
}
|
||||
@@ -477,24 +406,18 @@ public class AuthorizedClientServiceReactiveOAuth2AuthorizedClientManagerTests {
|
||||
public void reauthorizeWhenSupportedProviderThenReauthorized() {
|
||||
OAuth2AuthorizedClient reauthorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), TestOAuth2AccessTokens.noScopes(), TestOAuth2RefreshTokens.refreshToken());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.just(reauthorizedClient));
|
||||
|
||||
OAuth2AuthorizeRequest reauthorizeRequest = OAuth2AuthorizeRequest.withAuthorizedClient(this.authorizedClient)
|
||||
.principal(this.principal).build();
|
||||
Mono<OAuth2AuthorizedClient> authorizedClient = this.authorizedClientManager.authorize(reauthorizeRequest);
|
||||
|
||||
StepVerifier.create(authorizedClient).expectNext(reauthorizedClient).verifyComplete();
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(reauthorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isSameAs(this.authorizedClient);
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
verify(this.authorizedClientService).saveAuthorizedClient(eq(reauthorizedClient), eq(this.principal));
|
||||
this.saveAuthorizedClientProbe.assertWasSubscribed();
|
||||
verify(this.authorizedClientService, never()).removeAuthorizedClient(any(), any());
|
||||
@@ -505,24 +428,18 @@ public class AuthorizedClientServiceReactiveOAuth2AuthorizedClientManagerTests {
|
||||
public void reauthorizeWhenRequestAttributeScopeThenMappedToContext() {
|
||||
OAuth2AuthorizedClient reauthorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), TestOAuth2AccessTokens.noScopes(), TestOAuth2RefreshTokens.refreshToken());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.just(reauthorizedClient));
|
||||
|
||||
OAuth2AuthorizeRequest reauthorizeRequest = OAuth2AuthorizeRequest.withAuthorizedClient(this.authorizedClient)
|
||||
.principal(this.principal).attribute(OAuth2ParameterNames.SCOPE, "read write").build();
|
||||
|
||||
this.authorizedClientManager.setContextAttributesMapper(
|
||||
new AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager.DefaultContextAttributesMapper());
|
||||
Mono<OAuth2AuthorizedClient> authorizedClient = this.authorizedClientManager.authorize(reauthorizeRequest);
|
||||
|
||||
StepVerifier.create(authorizedClient).expectNext(reauthorizedClient).verifyComplete();
|
||||
verify(this.authorizedClientService).saveAuthorizedClient(eq(reauthorizedClient), eq(this.principal));
|
||||
this.saveAuthorizedClientProbe.assertWasSubscribed();
|
||||
verify(this.authorizedClientService, never()).removeAuthorizedClient(any(), any());
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isSameAs(this.authorizedClient);
|
||||
@@ -532,7 +449,6 @@ public class AuthorizedClientServiceReactiveOAuth2AuthorizedClientManagerTests {
|
||||
String[] requestScopeAttribute = authorizationContext
|
||||
.getAttribute(OAuth2AuthorizationContext.REQUEST_SCOPE_ATTRIBUTE_NAME);
|
||||
assertThat(requestScopeAttribute).contains("read", "write");
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -96,7 +96,6 @@ public class ClientCredentialsOAuth2AuthorizedClientProviderTests {
|
||||
@Test
|
||||
public void authorizeWhenNotClientCredentialsThenUnableToAuthorize() {
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientRegistration().build();
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(clientRegistration).principal(this.principal).build();
|
||||
assertThat(this.authorizedClientProvider.authorize(authorizationContext)).isNull();
|
||||
@@ -106,11 +105,9 @@ public class ClientCredentialsOAuth2AuthorizedClientProviderTests {
|
||||
public void authorizeWhenClientCredentialsAndNotAuthorizedThenAuthorize() {
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse().build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse);
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(this.clientRegistration).principal(this.principal).build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientProvider.authorize(authorizationContext);
|
||||
|
||||
assertThat(authorizedClient.getClientRegistration()).isSameAs(this.clientRegistration);
|
||||
assertThat(authorizedClient.getPrincipalName()).isEqualTo(this.principal.getName());
|
||||
assertThat(authorizedClient.getAccessToken()).isEqualTo(accessTokenResponse.getAccessToken());
|
||||
@@ -124,14 +121,11 @@ public class ClientCredentialsOAuth2AuthorizedClientProviderTests {
|
||||
issuedAt, expiresAt);
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), accessToken);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse().build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse);
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient).principal(this.principal).build();
|
||||
authorizedClient = this.authorizedClientProvider.authorize(authorizationContext);
|
||||
|
||||
assertThat(authorizedClient.getClientRegistration()).isSameAs(this.clientRegistration);
|
||||
assertThat(authorizedClient.getPrincipalName()).isEqualTo(this.principal.getName());
|
||||
assertThat(authorizedClient.getAccessToken()).isEqualTo(accessTokenResponse.getAccessToken());
|
||||
@@ -141,7 +135,6 @@ public class ClientCredentialsOAuth2AuthorizedClientProviderTests {
|
||||
public void authorizeWhenClientCredentialsAndTokenNotExpiredThenNotReauthorize() {
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), TestOAuth2AccessTokens.noScopes());
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient).principal(this.principal).build();
|
||||
assertThat(this.authorizedClientProvider.authorize(authorizationContext)).isNull();
|
||||
@@ -157,19 +150,14 @@ public class ClientCredentialsOAuth2AuthorizedClientProviderTests {
|
||||
"access-token-1234", issuedAt, expiresAt);
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), expiresInOneMinAccessToken);
|
||||
|
||||
// Shorten the lifespan of the access token by 90 seconds, which will ultimately
|
||||
// force it to expire on the client
|
||||
this.authorizedClientProvider.setClockSkew(Duration.ofSeconds(90));
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse().build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse);
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient).principal(this.principal).build();
|
||||
|
||||
OAuth2AuthorizedClient reauthorizedClient = this.authorizedClientProvider.authorize(authorizationContext);
|
||||
|
||||
assertThat(reauthorizedClient.getClientRegistration()).isSameAs(this.clientRegistration);
|
||||
assertThat(reauthorizedClient.getPrincipalName()).isEqualTo(this.principal.getName());
|
||||
assertThat(reauthorizedClient.getAccessToken()).isEqualTo(accessTokenResponse.getAccessToken());
|
||||
|
||||
@@ -97,7 +97,6 @@ public class ClientCredentialsReactiveOAuth2AuthorizedClientProviderTests {
|
||||
@Test
|
||||
public void authorizeWhenNotClientCredentialsThenUnableToAuthorize() {
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientRegistration().build();
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(clientRegistration).principal(this.principal).build();
|
||||
assertThat(this.authorizedClientProvider.authorize(authorizationContext).block()).isNull();
|
||||
@@ -107,11 +106,9 @@ public class ClientCredentialsReactiveOAuth2AuthorizedClientProviderTests {
|
||||
public void authorizeWhenClientCredentialsAndNotAuthorizedThenAuthorize() {
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse().build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(accessTokenResponse));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(this.clientRegistration).principal(this.principal).build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientProvider.authorize(authorizationContext).block();
|
||||
|
||||
assertThat(authorizedClient.getClientRegistration()).isSameAs(this.clientRegistration);
|
||||
assertThat(authorizedClient.getPrincipalName()).isEqualTo(this.principal.getName());
|
||||
assertThat(authorizedClient.getAccessToken()).isEqualTo(accessTokenResponse.getAccessToken());
|
||||
@@ -125,14 +122,11 @@ public class ClientCredentialsReactiveOAuth2AuthorizedClientProviderTests {
|
||||
issuedAt, expiresAt);
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), accessToken);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse().build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(accessTokenResponse));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient).principal(this.principal).build();
|
||||
authorizedClient = this.authorizedClientProvider.authorize(authorizationContext).block();
|
||||
|
||||
assertThat(authorizedClient.getClientRegistration()).isSameAs(this.clientRegistration);
|
||||
assertThat(authorizedClient.getPrincipalName()).isEqualTo(this.principal.getName());
|
||||
assertThat(authorizedClient.getAccessToken()).isEqualTo(accessTokenResponse.getAccessToken());
|
||||
@@ -142,7 +136,6 @@ public class ClientCredentialsReactiveOAuth2AuthorizedClientProviderTests {
|
||||
public void authorizeWhenClientCredentialsAndTokenNotExpiredThenNotReauthorize() {
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), TestOAuth2AccessTokens.noScopes());
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient).principal(this.principal).build();
|
||||
assertThat(this.authorizedClientProvider.authorize(authorizationContext).block()).isNull();
|
||||
@@ -158,20 +151,15 @@ public class ClientCredentialsReactiveOAuth2AuthorizedClientProviderTests {
|
||||
"access-token-1234", issuedAt, expiresAt);
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), expiresInOneMinAccessToken);
|
||||
|
||||
// Shorten the lifespan of the access token by 90 seconds, which will ultimately
|
||||
// force it to expire on the client
|
||||
this.authorizedClientProvider.setClockSkew(Duration.ofSeconds(90));
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse().build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(accessTokenResponse));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient).principal(this.principal).build();
|
||||
|
||||
OAuth2AuthorizedClient reauthorizedClient = this.authorizedClientProvider.authorize(authorizationContext)
|
||||
.block();
|
||||
|
||||
assertThat(reauthorizedClient.getClientRegistration()).isSameAs(this.clientRegistration);
|
||||
assertThat(reauthorizedClient.getPrincipalName()).isEqualTo(this.principal.getName());
|
||||
assertThat(reauthorizedClient.getAccessToken()).isEqualTo(accessTokenResponse.getAccessToken());
|
||||
|
||||
@@ -61,10 +61,8 @@ public class DelegatingOAuth2AuthorizedClientProviderTests {
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientRegistration().build();
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(clientRegistration, principal.getName(),
|
||||
TestOAuth2AccessTokens.noScopes());
|
||||
|
||||
OAuth2AuthorizedClientProvider authorizedClientProvider = mock(OAuth2AuthorizedClientProvider.class);
|
||||
given(authorizedClientProvider.authorize(any())).willReturn(authorizedClient);
|
||||
|
||||
DelegatingOAuth2AuthorizedClientProvider delegate = new DelegatingOAuth2AuthorizedClientProvider(
|
||||
mock(OAuth2AuthorizedClientProvider.class), mock(OAuth2AuthorizedClientProvider.class),
|
||||
authorizedClientProvider);
|
||||
@@ -79,7 +77,6 @@ public class DelegatingOAuth2AuthorizedClientProviderTests {
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientRegistration().build();
|
||||
OAuth2AuthorizationContext context = OAuth2AuthorizationContext.withClientRegistration(clientRegistration)
|
||||
.principal(new TestingAuthenticationToken("principal", "password")).build();
|
||||
|
||||
DelegatingOAuth2AuthorizedClientProvider delegate = new DelegatingOAuth2AuthorizedClientProvider(
|
||||
mock(OAuth2AuthorizedClientProvider.class), mock(OAuth2AuthorizedClientProvider.class));
|
||||
assertThat(delegate.authorize(context)).isNull();
|
||||
|
||||
@@ -62,7 +62,6 @@ public class DelegatingReactiveOAuth2AuthorizedClientProviderTests {
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientRegistration().build();
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(clientRegistration, principal.getName(),
|
||||
TestOAuth2AccessTokens.noScopes());
|
||||
|
||||
ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider1 = mock(
|
||||
ReactiveOAuth2AuthorizedClientProvider.class);
|
||||
given(authorizedClientProvider1.authorize(any())).willReturn(Mono.empty());
|
||||
@@ -72,7 +71,6 @@ public class DelegatingReactiveOAuth2AuthorizedClientProviderTests {
|
||||
ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider3 = mock(
|
||||
ReactiveOAuth2AuthorizedClientProvider.class);
|
||||
given(authorizedClientProvider3.authorize(any())).willReturn(Mono.just(authorizedClient));
|
||||
|
||||
DelegatingReactiveOAuth2AuthorizedClientProvider delegate = new DelegatingReactiveOAuth2AuthorizedClientProvider(
|
||||
authorizedClientProvider1, authorizedClientProvider2, authorizedClientProvider3);
|
||||
OAuth2AuthorizationContext context = OAuth2AuthorizationContext.withClientRegistration(clientRegistration)
|
||||
@@ -86,14 +84,12 @@ public class DelegatingReactiveOAuth2AuthorizedClientProviderTests {
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientRegistration().build();
|
||||
OAuth2AuthorizationContext context = OAuth2AuthorizationContext.withClientRegistration(clientRegistration)
|
||||
.principal(new TestingAuthenticationToken("principal", "password")).build();
|
||||
|
||||
ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider1 = mock(
|
||||
ReactiveOAuth2AuthorizedClientProvider.class);
|
||||
given(authorizedClientProvider1.authorize(any())).willReturn(Mono.empty());
|
||||
ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider2 = mock(
|
||||
ReactiveOAuth2AuthorizedClientProvider.class);
|
||||
given(authorizedClientProvider2.authorize(any())).willReturn(Mono.empty());
|
||||
|
||||
DelegatingReactiveOAuth2AuthorizedClientProvider delegate = new DelegatingReactiveOAuth2AuthorizedClientProvider(
|
||||
authorizedClientProvider1, authorizedClientProvider2);
|
||||
assertThat(delegate.authorize(context).block()).isNull();
|
||||
|
||||
@@ -73,13 +73,11 @@ public class InMemoryOAuth2AuthorizedClientServiceTests {
|
||||
@Test
|
||||
public void constructorWhenAuthorizedClientsProvidedThenUseProvidedAuthorizedClients() {
|
||||
String registrationId = this.registration3.getRegistrationId();
|
||||
|
||||
Map<OAuth2AuthorizedClientId, OAuth2AuthorizedClient> authorizedClients = Collections.singletonMap(
|
||||
new OAuth2AuthorizedClientId(this.registration3.getRegistrationId(), this.principalName1),
|
||||
mock(OAuth2AuthorizedClient.class));
|
||||
ClientRegistrationRepository clientRegistrationRepository = mock(ClientRegistrationRepository.class);
|
||||
given(clientRegistrationRepository.findByRegistrationId(eq(registrationId))).willReturn(this.registration3);
|
||||
|
||||
InMemoryOAuth2AuthorizedClientService authorizedClientService = new InMemoryOAuth2AuthorizedClientService(
|
||||
clientRegistrationRepository, authorizedClients);
|
||||
assertThat((Object) authorizedClientService.loadAuthorizedClient(registrationId, this.principalName1))
|
||||
@@ -114,11 +112,9 @@ public class InMemoryOAuth2AuthorizedClientServiceTests {
|
||||
public void loadAuthorizedClientWhenClientRegistrationFoundAndAssociatedToPrincipalThenReturnAuthorizedClient() {
|
||||
Authentication authentication = mock(Authentication.class);
|
||||
given(authentication.getName()).willReturn(this.principalName1);
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration1, this.principalName1,
|
||||
mock(OAuth2AccessToken.class));
|
||||
this.authorizedClientService.saveAuthorizedClient(authorizedClient, authentication);
|
||||
|
||||
OAuth2AuthorizedClient loadedAuthorizedClient = this.authorizedClientService
|
||||
.loadAuthorizedClient(this.registration1.getRegistrationId(), this.principalName1);
|
||||
assertThat(loadedAuthorizedClient).isEqualTo(authorizedClient);
|
||||
@@ -138,11 +134,9 @@ public class InMemoryOAuth2AuthorizedClientServiceTests {
|
||||
public void saveAuthorizedClientWhenSavedThenCanLoad() {
|
||||
Authentication authentication = mock(Authentication.class);
|
||||
given(authentication.getName()).willReturn(this.principalName2);
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration3, this.principalName2,
|
||||
mock(OAuth2AccessToken.class));
|
||||
this.authorizedClientService.saveAuthorizedClient(authorizedClient, authentication);
|
||||
|
||||
OAuth2AuthorizedClient loadedAuthorizedClient = this.authorizedClientService
|
||||
.loadAuthorizedClient(this.registration3.getRegistrationId(), this.principalName2);
|
||||
assertThat(loadedAuthorizedClient).isEqualTo(authorizedClient);
|
||||
@@ -162,18 +156,14 @@ public class InMemoryOAuth2AuthorizedClientServiceTests {
|
||||
public void removeAuthorizedClientWhenSavedThenRemoved() {
|
||||
Authentication authentication = mock(Authentication.class);
|
||||
given(authentication.getName()).willReturn(this.principalName2);
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration2, this.principalName2,
|
||||
mock(OAuth2AccessToken.class));
|
||||
this.authorizedClientService.saveAuthorizedClient(authorizedClient, authentication);
|
||||
|
||||
OAuth2AuthorizedClient loadedAuthorizedClient = this.authorizedClientService
|
||||
.loadAuthorizedClient(this.registration2.getRegistrationId(), this.principalName2);
|
||||
assertThat(loadedAuthorizedClient).isNotNull();
|
||||
|
||||
this.authorizedClientService.removeAuthorizedClient(this.registration2.getRegistrationId(),
|
||||
this.principalName2);
|
||||
|
||||
loadedAuthorizedClient = this.authorizedClientService
|
||||
.loadAuthorizedClient(this.registration2.getRegistrationId(), this.principalName2);
|
||||
assertThat(loadedAuthorizedClient).isNull();
|
||||
|
||||
@@ -139,7 +139,6 @@ public class InMemoryReactiveOAuth2AuthorizedClientServiceTests {
|
||||
Mono<OAuth2AuthorizedClient> saveAndLoad = this.authorizedClientService
|
||||
.saveAuthorizedClient(authorizedClient, this.principal)
|
||||
.then(this.authorizedClientService.loadAuthorizedClient(this.clientRegistrationId, this.principalName));
|
||||
|
||||
StepVerifier.create(saveAndLoad).expectNext(authorizedClient).verifyComplete();
|
||||
}
|
||||
|
||||
@@ -198,7 +197,6 @@ public class InMemoryReactiveOAuth2AuthorizedClientServiceTests {
|
||||
Mono<Void> saveAndDeleteAndLoad = this.authorizedClientService
|
||||
.saveAuthorizedClient(authorizedClient, this.principal).then(this.authorizedClientService
|
||||
.removeAuthorizedClient(this.clientRegistrationId, this.principalName));
|
||||
|
||||
StepVerifier.create(saveAndDeleteAndLoad).verifyComplete();
|
||||
}
|
||||
|
||||
@@ -213,7 +211,6 @@ public class InMemoryReactiveOAuth2AuthorizedClientServiceTests {
|
||||
.then(this.authorizedClientService.removeAuthorizedClient(this.clientRegistrationId,
|
||||
this.principalName))
|
||||
.then(this.authorizedClientService.loadAuthorizedClient(this.clientRegistrationId, this.principalName));
|
||||
|
||||
StepVerifier.create(saveAndDeleteAndLoad).verifyComplete();
|
||||
}
|
||||
|
||||
|
||||
@@ -150,12 +150,9 @@ public class JdbcOAuth2AuthorizedClientServiceTests {
|
||||
public void loadAuthorizedClientWhenExistsThenReturnAuthorizedClient() {
|
||||
Authentication principal = createPrincipal();
|
||||
OAuth2AuthorizedClient expected = createAuthorizedClient(principal, this.clientRegistration);
|
||||
|
||||
this.authorizedClientService.saveAuthorizedClient(expected, principal);
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientService
|
||||
.loadAuthorizedClient(this.clientRegistration.getRegistrationId(), principal.getName());
|
||||
|
||||
assertThat(authorizedClient).isNotNull();
|
||||
assertThat(authorizedClient.getClientRegistration()).isEqualTo(expected.getClientRegistration());
|
||||
assertThat(authorizedClient.getPrincipalName()).isEqualTo(expected.getPrincipalName());
|
||||
@@ -179,9 +176,7 @@ public class JdbcOAuth2AuthorizedClientServiceTests {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(any())).willReturn(null);
|
||||
Authentication principal = createPrincipal();
|
||||
OAuth2AuthorizedClient expected = createAuthorizedClient(principal, this.clientRegistration);
|
||||
|
||||
this.authorizedClientService.saveAuthorizedClient(expected, principal);
|
||||
|
||||
assertThatThrownBy(() -> this.authorizedClientService
|
||||
.loadAuthorizedClient(this.clientRegistration.getRegistrationId(), principal.getName()))
|
||||
.isInstanceOf(DataRetrievalFailureException.class)
|
||||
@@ -192,7 +187,6 @@ public class JdbcOAuth2AuthorizedClientServiceTests {
|
||||
@Test
|
||||
public void saveAuthorizedClientWhenAuthorizedClientIsNullThenThrowIllegalArgumentException() {
|
||||
Authentication principal = createPrincipal();
|
||||
|
||||
assertThatThrownBy(() -> this.authorizedClientService.saveAuthorizedClient(null, principal))
|
||||
.isInstanceOf(IllegalArgumentException.class).hasMessage("authorizedClient cannot be null");
|
||||
}
|
||||
@@ -201,7 +195,6 @@ public class JdbcOAuth2AuthorizedClientServiceTests {
|
||||
public void saveAuthorizedClientWhenPrincipalIsNullThenThrowIllegalArgumentException() {
|
||||
Authentication principal = createPrincipal();
|
||||
OAuth2AuthorizedClient authorizedClient = createAuthorizedClient(principal, this.clientRegistration);
|
||||
|
||||
assertThatThrownBy(() -> this.authorizedClientService.saveAuthorizedClient(authorizedClient, null))
|
||||
.isInstanceOf(IllegalArgumentException.class).hasMessage("principal cannot be null");
|
||||
}
|
||||
@@ -210,12 +203,9 @@ public class JdbcOAuth2AuthorizedClientServiceTests {
|
||||
public void saveAuthorizedClientWhenSaveThenLoadReturnsSaved() {
|
||||
Authentication principal = createPrincipal();
|
||||
OAuth2AuthorizedClient expected = createAuthorizedClient(principal, this.clientRegistration);
|
||||
|
||||
this.authorizedClientService.saveAuthorizedClient(expected, principal);
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientService
|
||||
.loadAuthorizedClient(this.clientRegistration.getRegistrationId(), principal.getName());
|
||||
|
||||
assertThat(authorizedClient).isNotNull();
|
||||
assertThat(authorizedClient.getClientRegistration()).isEqualTo(expected.getClientRegistration());
|
||||
assertThat(authorizedClient.getPrincipalName()).isEqualTo(expected.getPrincipalName());
|
||||
@@ -232,16 +222,12 @@ public class JdbcOAuth2AuthorizedClientServiceTests {
|
||||
.isEqualTo(expected.getRefreshToken().getTokenValue());
|
||||
assertThat(authorizedClient.getRefreshToken().getIssuedAt()).isCloseTo(expected.getRefreshToken().getIssuedAt(),
|
||||
within(1, ChronoUnit.MILLIS));
|
||||
|
||||
// Test save/load of NOT NULL attributes only
|
||||
principal = createPrincipal();
|
||||
expected = createAuthorizedClient(principal, this.clientRegistration, true);
|
||||
|
||||
this.authorizedClientService.saveAuthorizedClient(expected, principal);
|
||||
|
||||
authorizedClient = this.authorizedClientService
|
||||
.loadAuthorizedClient(this.clientRegistration.getRegistrationId(), principal.getName());
|
||||
|
||||
assertThat(authorizedClient).isNotNull();
|
||||
assertThat(authorizedClient.getClientRegistration()).isEqualTo(expected.getClientRegistration());
|
||||
assertThat(authorizedClient.getPrincipalName()).isEqualTo(expected.getPrincipalName());
|
||||
@@ -263,15 +249,12 @@ public class JdbcOAuth2AuthorizedClientServiceTests {
|
||||
Authentication principal = createPrincipal();
|
||||
OAuth2AuthorizedClient authorizedClient = createAuthorizedClient(principal, this.clientRegistration);
|
||||
this.authorizedClientService.saveAuthorizedClient(authorizedClient, principal);
|
||||
|
||||
// When a client with the same principal and registration id is saved
|
||||
OAuth2AuthorizedClient updatedClient = createAuthorizedClient(principal, this.clientRegistration);
|
||||
this.authorizedClientService.saveAuthorizedClient(updatedClient, principal);
|
||||
|
||||
// Then the saved client is updated
|
||||
OAuth2AuthorizedClient savedClient = this.authorizedClientService
|
||||
.loadAuthorizedClient(this.clientRegistration.getRegistrationId(), principal.getName());
|
||||
|
||||
assertThat(savedClient).isNotNull();
|
||||
assertThat(savedClient.getClientRegistration()).isEqualTo(updatedClient.getClientRegistration());
|
||||
assertThat(savedClient.getPrincipalName()).isEqualTo(updatedClient.getPrincipalName());
|
||||
@@ -299,14 +282,11 @@ public class JdbcOAuth2AuthorizedClientServiceTests {
|
||||
JdbcOAuth2AuthorizedClientService.OAuth2AuthorizedClientParametersMapper authorizedClientParametersMapper = spy(
|
||||
new JdbcOAuth2AuthorizedClientService.OAuth2AuthorizedClientParametersMapper());
|
||||
this.authorizedClientService.setAuthorizedClientParametersMapper(authorizedClientParametersMapper);
|
||||
|
||||
Authentication principal = createPrincipal();
|
||||
OAuth2AuthorizedClient authorizedClient = createAuthorizedClient(principal, this.clientRegistration);
|
||||
|
||||
this.authorizedClientService.saveAuthorizedClient(authorizedClient, principal);
|
||||
this.authorizedClientService.loadAuthorizedClient(this.clientRegistration.getRegistrationId(),
|
||||
principal.getName());
|
||||
|
||||
verify(authorizedClientRowMapper).mapRow(any(), anyInt());
|
||||
verify(authorizedClientParametersMapper).apply(any());
|
||||
}
|
||||
@@ -328,16 +308,12 @@ public class JdbcOAuth2AuthorizedClientServiceTests {
|
||||
public void removeAuthorizedClientWhenExistsThenRemoved() {
|
||||
Authentication principal = createPrincipal();
|
||||
OAuth2AuthorizedClient authorizedClient = createAuthorizedClient(principal, this.clientRegistration);
|
||||
|
||||
this.authorizedClientService.saveAuthorizedClient(authorizedClient, principal);
|
||||
|
||||
authorizedClient = this.authorizedClientService
|
||||
.loadAuthorizedClient(this.clientRegistration.getRegistrationId(), principal.getName());
|
||||
assertThat(authorizedClient).isNotNull();
|
||||
|
||||
this.authorizedClientService.removeAuthorizedClient(this.clientRegistration.getRegistrationId(),
|
||||
principal.getName());
|
||||
|
||||
authorizedClient = this.authorizedClientService
|
||||
.loadAuthorizedClient(this.clientRegistration.getRegistrationId(), principal.getName());
|
||||
assertThat(authorizedClient).isNull();
|
||||
@@ -347,19 +323,14 @@ public class JdbcOAuth2AuthorizedClientServiceTests {
|
||||
public void tableDefinitionWhenCustomThenAbleToOverride() {
|
||||
CustomTableDefinitionJdbcOAuth2AuthorizedClientService customAuthorizedClientService = new CustomTableDefinitionJdbcOAuth2AuthorizedClientService(
|
||||
new JdbcTemplate(createDb("custom-oauth2-client-schema.sql")), this.clientRegistrationRepository);
|
||||
|
||||
Authentication principal = createPrincipal();
|
||||
OAuth2AuthorizedClient authorizedClient = createAuthorizedClient(principal, this.clientRegistration);
|
||||
|
||||
customAuthorizedClientService.saveAuthorizedClient(authorizedClient, principal);
|
||||
|
||||
authorizedClient = customAuthorizedClientService
|
||||
.loadAuthorizedClient(this.clientRegistration.getRegistrationId(), principal.getName());
|
||||
assertThat(authorizedClient).isNotNull();
|
||||
|
||||
customAuthorizedClientService.removeAuthorizedClient(this.clientRegistration.getRegistrationId(),
|
||||
principal.getName());
|
||||
|
||||
authorizedClient = customAuthorizedClientService
|
||||
.loadAuthorizedClient(this.clientRegistration.getRegistrationId(), principal.getName());
|
||||
assertThat(authorizedClient).isNull();
|
||||
@@ -473,7 +444,6 @@ public class JdbcOAuth2AuthorizedClientServiceTests {
|
||||
"The ClientRegistration with id '" + clientRegistrationId + "' exists in the data source, "
|
||||
+ "however, it was not found in the ClientRegistrationRepository.");
|
||||
}
|
||||
|
||||
OAuth2AccessToken.TokenType tokenType = null;
|
||||
if (OAuth2AccessToken.TokenType.BEARER.getValue().equalsIgnoreCase(rs.getString("accessTokenType"))) {
|
||||
tokenType = OAuth2AccessToken.TokenType.BEARER;
|
||||
@@ -488,7 +458,6 @@ public class JdbcOAuth2AuthorizedClientServiceTests {
|
||||
}
|
||||
OAuth2AccessToken accessToken = new OAuth2AccessToken(tokenType, tokenValue, issuedAt, expiresAt,
|
||||
scopes);
|
||||
|
||||
OAuth2RefreshToken refreshToken = null;
|
||||
byte[] refreshTokenValue = rs.getBytes("refreshTokenValue");
|
||||
if (refreshTokenValue != null) {
|
||||
@@ -500,9 +469,7 @@ public class JdbcOAuth2AuthorizedClientServiceTests {
|
||||
}
|
||||
refreshToken = new OAuth2RefreshToken(tokenValue, issuedAt);
|
||||
}
|
||||
|
||||
String principalName = rs.getString("principalName");
|
||||
|
||||
return new OAuth2AuthorizedClient(clientRegistration, principalName, accessToken, refreshToken);
|
||||
}
|
||||
|
||||
|
||||
@@ -78,7 +78,6 @@ public class OAuth2AuthorizeRequestTests {
|
||||
attrs.put("name1", "value1");
|
||||
attrs.put("name2", "value2");
|
||||
}).build();
|
||||
|
||||
assertThat(authorizeRequest.getClientRegistrationId()).isEqualTo(this.clientRegistration.getRegistrationId());
|
||||
assertThat(authorizeRequest.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizeRequest.getPrincipal()).isEqualTo(this.principal);
|
||||
@@ -92,7 +91,6 @@ public class OAuth2AuthorizeRequestTests {
|
||||
attrs.put("name1", "value1");
|
||||
attrs.put("name2", "value2");
|
||||
}).build();
|
||||
|
||||
assertThat(authorizeRequest.getClientRegistrationId())
|
||||
.isEqualTo(this.authorizedClient.getClientRegistration().getRegistrationId());
|
||||
assertThat(authorizeRequest.getAuthorizedClient()).isEqualTo(this.authorizedClient);
|
||||
@@ -105,7 +103,6 @@ public class OAuth2AuthorizeRequestTests {
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal("principalName")
|
||||
.build();
|
||||
|
||||
assertThat(authorizeRequest.getClientRegistrationId()).isEqualTo(this.clientRegistration.getRegistrationId());
|
||||
assertThat(authorizeRequest.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizeRequest.getPrincipal().getName()).isEqualTo("principalName");
|
||||
|
||||
@@ -90,7 +90,6 @@ public class OAuth2AuthorizedClientProviderBuilderTests {
|
||||
public void buildWhenAuthorizationCodeProviderThenProviderAuthorizes() {
|
||||
OAuth2AuthorizedClientProvider authorizedClientProvider = OAuth2AuthorizedClientProviderBuilder.builder()
|
||||
.authorizationCode().build();
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(TestClientRegistrations.clientRegistration().build()).principal(this.principal)
|
||||
.build();
|
||||
@@ -104,15 +103,12 @@ public class OAuth2AuthorizedClientProviderBuilderTests {
|
||||
.refreshToken(
|
||||
(configurer) -> configurer.accessTokenResponseClient(this.refreshTokenTokenResponseClient))
|
||||
.build();
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(
|
||||
TestClientRegistrations.clientRegistration().build(), this.principal.getName(), expiredAccessToken(),
|
||||
TestOAuth2RefreshTokens.refreshToken());
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient).principal(this.principal).build();
|
||||
OAuth2AuthorizedClient reauthorizedClient = authorizedClientProvider.authorize(authorizationContext);
|
||||
|
||||
assertThat(reauthorizedClient).isNotNull();
|
||||
verify(this.accessTokenClient).exchange(any(RequestEntity.class), eq(OAuth2AccessTokenResponse.class));
|
||||
}
|
||||
@@ -123,12 +119,10 @@ public class OAuth2AuthorizedClientProviderBuilderTests {
|
||||
.clientCredentials(
|
||||
(configurer) -> configurer.accessTokenResponseClient(this.clientCredentialsTokenResponseClient))
|
||||
.build();
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(TestClientRegistrations.clientCredentials().build()).principal(this.principal)
|
||||
.build();
|
||||
OAuth2AuthorizedClient authorizedClient = authorizedClientProvider.authorize(authorizationContext);
|
||||
|
||||
assertThat(authorizedClient).isNotNull();
|
||||
verify(this.accessTokenClient).exchange(any(RequestEntity.class), eq(OAuth2AccessTokenResponse.class));
|
||||
}
|
||||
@@ -138,13 +132,11 @@ public class OAuth2AuthorizedClientProviderBuilderTests {
|
||||
OAuth2AuthorizedClientProvider authorizedClientProvider = OAuth2AuthorizedClientProviderBuilder.builder()
|
||||
.password((configurer) -> configurer.accessTokenResponseClient(this.passwordTokenResponseClient))
|
||||
.build();
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(TestClientRegistrations.password().build()).principal(this.principal)
|
||||
.attribute(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME, "username")
|
||||
.attribute(OAuth2AuthorizationContext.PASSWORD_ATTRIBUTE_NAME, "password").build();
|
||||
OAuth2AuthorizedClient authorizedClient = authorizedClientProvider.authorize(authorizationContext);
|
||||
|
||||
assertThat(authorizedClient).isNotNull();
|
||||
verify(this.accessTokenClient).exchange(any(RequestEntity.class), eq(OAuth2AccessTokenResponse.class));
|
||||
}
|
||||
@@ -159,44 +151,35 @@ public class OAuth2AuthorizedClientProviderBuilderTests {
|
||||
(configurer) -> configurer.accessTokenResponseClient(this.clientCredentialsTokenResponseClient))
|
||||
.password((configurer) -> configurer.accessTokenResponseClient(this.passwordTokenResponseClient))
|
||||
.build();
|
||||
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientRegistration().build();
|
||||
|
||||
// authorization_code
|
||||
OAuth2AuthorizationContext authorizationCodeContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(clientRegistration).principal(this.principal).build();
|
||||
assertThatThrownBy(() -> authorizedClientProvider.authorize(authorizationCodeContext))
|
||||
.isInstanceOf(ClientAuthorizationRequiredException.class);
|
||||
|
||||
// refresh_token
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(clientRegistration,
|
||||
this.principal.getName(), expiredAccessToken(), TestOAuth2RefreshTokens.refreshToken());
|
||||
|
||||
OAuth2AuthorizationContext refreshTokenContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient).principal(this.principal).build();
|
||||
OAuth2AuthorizedClient reauthorizedClient = authorizedClientProvider.authorize(refreshTokenContext);
|
||||
|
||||
assertThat(reauthorizedClient).isNotNull();
|
||||
verify(this.accessTokenClient, times(1)).exchange(any(RequestEntity.class),
|
||||
eq(OAuth2AccessTokenResponse.class));
|
||||
|
||||
// client_credentials
|
||||
OAuth2AuthorizationContext clientCredentialsContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(TestClientRegistrations.clientCredentials().build()).principal(this.principal)
|
||||
.build();
|
||||
authorizedClient = authorizedClientProvider.authorize(clientCredentialsContext);
|
||||
|
||||
assertThat(authorizedClient).isNotNull();
|
||||
verify(this.accessTokenClient, times(2)).exchange(any(RequestEntity.class),
|
||||
eq(OAuth2AccessTokenResponse.class));
|
||||
|
||||
// password
|
||||
OAuth2AuthorizationContext passwordContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(TestClientRegistrations.password().build()).principal(this.principal)
|
||||
.attribute(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME, "username")
|
||||
.attribute(OAuth2AuthorizationContext.PASSWORD_ATTRIBUTE_NAME, "password").build();
|
||||
authorizedClient = authorizedClientProvider.authorize(passwordContext);
|
||||
|
||||
assertThat(authorizedClient).isNotNull();
|
||||
verify(this.accessTokenClient, times(3)).exchange(any(RequestEntity.class),
|
||||
eq(OAuth2AccessTokenResponse.class));
|
||||
@@ -205,15 +188,12 @@ public class OAuth2AuthorizedClientProviderBuilderTests {
|
||||
@Test
|
||||
public void buildWhenCustomProviderThenProviderCalled() {
|
||||
OAuth2AuthorizedClientProvider customProvider = mock(OAuth2AuthorizedClientProvider.class);
|
||||
|
||||
OAuth2AuthorizedClientProvider authorizedClientProvider = OAuth2AuthorizedClientProviderBuilder.builder()
|
||||
.provider(customProvider).build();
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(TestClientRegistrations.clientRegistration().build()).principal(this.principal)
|
||||
.build();
|
||||
authorizedClientProvider.authorize(authorizationContext);
|
||||
|
||||
verify(customProvider).authorize(any(OAuth2AuthorizationContext.class));
|
||||
}
|
||||
|
||||
|
||||
@@ -65,7 +65,6 @@ public class OAuth2AuthorizedClientTests {
|
||||
public void constructorWhenAllParametersProvidedAndValidThenCreated() {
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principalName, this.accessToken);
|
||||
|
||||
assertThat(authorizedClient.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizedClient.getPrincipalName()).isEqualTo(this.principalName);
|
||||
assertThat(authorizedClient.getAccessToken()).isEqualTo(this.accessToken);
|
||||
|
||||
@@ -96,7 +96,6 @@ public class PasswordOAuth2AuthorizedClientProviderTests {
|
||||
@Test
|
||||
public void authorizeWhenNotPasswordThenUnableToAuthorize() {
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientCredentials().build();
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(clientRegistration).principal(this.principal).build();
|
||||
assertThat(this.authorizedClientProvider.authorize(authorizationContext)).isNull();
|
||||
@@ -124,13 +123,11 @@ public class PasswordOAuth2AuthorizedClientProviderTests {
|
||||
public void authorizeWhenPasswordAndNotAuthorizedThenAuthorize() {
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse().build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse);
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(this.clientRegistration).principal(this.principal)
|
||||
.attribute(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME, "username")
|
||||
.attribute(OAuth2AuthorizationContext.PASSWORD_ATTRIBUTE_NAME, "password").build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientProvider.authorize(authorizationContext);
|
||||
|
||||
assertThat(authorizedClient.getClientRegistration()).isSameAs(this.clientRegistration);
|
||||
assertThat(authorizedClient.getPrincipalName()).isEqualTo(this.principal.getName());
|
||||
assertThat(authorizedClient.getAccessToken()).isEqualTo(accessTokenResponse.getAccessToken());
|
||||
@@ -144,21 +141,17 @@ public class PasswordOAuth2AuthorizedClientProviderTests {
|
||||
"access-token-expired", issuedAt, expiresAt);
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), accessToken); // without refresh token
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse().build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse);
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient)
|
||||
.attribute(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME, "username")
|
||||
.attribute(OAuth2AuthorizationContext.PASSWORD_ATTRIBUTE_NAME, "password").principal(this.principal)
|
||||
.build();
|
||||
authorizedClient = this.authorizedClientProvider.authorize(authorizationContext);
|
||||
|
||||
assertThat(authorizedClient.getClientRegistration()).isSameAs(this.clientRegistration);
|
||||
assertThat(authorizedClient.getPrincipalName()).isEqualTo(this.principal.getName());
|
||||
assertThat(authorizedClient.getAccessToken()).isEqualTo(accessTokenResponse.getAccessToken());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -171,7 +164,6 @@ public class PasswordOAuth2AuthorizedClientProviderTests {
|
||||
this.principal.getName(), accessToken, TestOAuth2RefreshTokens.refreshToken()); // with
|
||||
// refresh
|
||||
// token
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient)
|
||||
.attribute(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME, "username")
|
||||
@@ -191,22 +183,17 @@ public class PasswordOAuth2AuthorizedClientProviderTests {
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), expiresInOneMinAccessToken); // without refresh
|
||||
// token
|
||||
|
||||
// Shorten the lifespan of the access token by 90 seconds, which will ultimately
|
||||
// force it to expire on the client
|
||||
this.authorizedClientProvider.setClockSkew(Duration.ofSeconds(90));
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse().build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse);
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient)
|
||||
.attribute(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME, "username")
|
||||
.attribute(OAuth2AuthorizationContext.PASSWORD_ATTRIBUTE_NAME, "password").principal(this.principal)
|
||||
.build();
|
||||
|
||||
OAuth2AuthorizedClient reauthorizedClient = this.authorizedClientProvider.authorize(authorizationContext);
|
||||
|
||||
assertThat(reauthorizedClient.getClientRegistration()).isSameAs(this.clientRegistration);
|
||||
assertThat(reauthorizedClient.getPrincipalName()).isEqualTo(this.principal.getName());
|
||||
assertThat(reauthorizedClient.getAccessToken()).isEqualTo(accessTokenResponse.getAccessToken());
|
||||
|
||||
@@ -97,7 +97,6 @@ public class PasswordReactiveOAuth2AuthorizedClientProviderTests {
|
||||
@Test
|
||||
public void authorizeWhenNotPasswordThenUnableToAuthorize() {
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientCredentials().build();
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(clientRegistration).principal(this.principal).build();
|
||||
assertThat(this.authorizedClientProvider.authorize(authorizationContext).block()).isNull();
|
||||
@@ -125,13 +124,11 @@ public class PasswordReactiveOAuth2AuthorizedClientProviderTests {
|
||||
public void authorizeWhenPasswordAndNotAuthorizedThenAuthorize() {
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse().build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(accessTokenResponse));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(this.clientRegistration).principal(this.principal)
|
||||
.attribute(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME, "username")
|
||||
.attribute(OAuth2AuthorizationContext.PASSWORD_ATTRIBUTE_NAME, "password").build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientProvider.authorize(authorizationContext).block();
|
||||
|
||||
assertThat(authorizedClient.getClientRegistration()).isSameAs(this.clientRegistration);
|
||||
assertThat(authorizedClient.getPrincipalName()).isEqualTo(this.principal.getName());
|
||||
assertThat(authorizedClient.getAccessToken()).isEqualTo(accessTokenResponse.getAccessToken());
|
||||
@@ -145,21 +142,17 @@ public class PasswordReactiveOAuth2AuthorizedClientProviderTests {
|
||||
"access-token-expired", issuedAt, expiresAt);
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), accessToken); // without refresh token
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse().build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(accessTokenResponse));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient)
|
||||
.attribute(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME, "username")
|
||||
.attribute(OAuth2AuthorizationContext.PASSWORD_ATTRIBUTE_NAME, "password").principal(this.principal)
|
||||
.build();
|
||||
authorizedClient = this.authorizedClientProvider.authorize(authorizationContext).block();
|
||||
|
||||
assertThat(authorizedClient.getClientRegistration()).isSameAs(this.clientRegistration);
|
||||
assertThat(authorizedClient.getPrincipalName()).isEqualTo(this.principal.getName());
|
||||
assertThat(authorizedClient.getAccessToken()).isEqualTo(accessTokenResponse.getAccessToken());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -172,7 +165,6 @@ public class PasswordReactiveOAuth2AuthorizedClientProviderTests {
|
||||
this.principal.getName(), accessToken, TestOAuth2RefreshTokens.refreshToken()); // with
|
||||
// refresh
|
||||
// token
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient)
|
||||
.attribute(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME, "username")
|
||||
@@ -192,23 +184,18 @@ public class PasswordReactiveOAuth2AuthorizedClientProviderTests {
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), expiresInOneMinAccessToken); // without refresh
|
||||
// token
|
||||
|
||||
// Shorten the lifespan of the access token by 90 seconds, which will ultimately
|
||||
// force it to expire on the client
|
||||
this.authorizedClientProvider.setClockSkew(Duration.ofSeconds(90));
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse().build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(accessTokenResponse));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient)
|
||||
.attribute(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME, "username")
|
||||
.attribute(OAuth2AuthorizationContext.PASSWORD_ATTRIBUTE_NAME, "password").principal(this.principal)
|
||||
.build();
|
||||
|
||||
OAuth2AuthorizedClient reauthorizedClient = this.authorizedClientProvider.authorize(authorizationContext)
|
||||
.block();
|
||||
|
||||
assertThat(reauthorizedClient.getClientRegistration()).isSameAs(this.clientRegistration);
|
||||
assertThat(reauthorizedClient.getPrincipalName()).isEqualTo(this.principal.getName());
|
||||
assertThat(reauthorizedClient.getAccessToken()).isEqualTo(accessTokenResponse.getAccessToken());
|
||||
|
||||
@@ -81,7 +81,6 @@ public class ReactiveOAuth2AuthorizedClientProviderBuilderTests {
|
||||
public void buildWhenAuthorizationCodeProviderThenProviderAuthorizes() {
|
||||
ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider = ReactiveOAuth2AuthorizedClientProviderBuilder
|
||||
.builder().authorizationCode().build();
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(this.clientRegistrationBuilder.build()).principal(this.principal).build();
|
||||
assertThatThrownBy(() -> authorizedClientProvider.authorize(authorizationContext).block())
|
||||
@@ -93,21 +92,15 @@ public class ReactiveOAuth2AuthorizedClientProviderBuilderTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider = ReactiveOAuth2AuthorizedClientProviderBuilder
|
||||
.builder().refreshToken().build();
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.clientRegistrationBuilder.build(),
|
||||
this.principal.getName(), expiredAccessToken(), TestOAuth2RefreshTokens.refreshToken());
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient).principal(this.principal).build();
|
||||
OAuth2AuthorizedClient reauthorizedClient = authorizedClientProvider.authorize(authorizationContext).block();
|
||||
|
||||
assertThat(reauthorizedClient).isNotNull();
|
||||
|
||||
assertThat(this.server.getRequestCount()).isEqualTo(1);
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("grant_type=refresh_token");
|
||||
@@ -118,20 +111,15 @@ public class ReactiveOAuth2AuthorizedClientProviderBuilderTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider = ReactiveOAuth2AuthorizedClientProviderBuilder
|
||||
.builder().clientCredentials().build();
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(this.clientRegistrationBuilder
|
||||
.authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS).build())
|
||||
.principal(this.principal).build();
|
||||
OAuth2AuthorizedClient authorizedClient = authorizedClientProvider.authorize(authorizationContext).block();
|
||||
|
||||
assertThat(authorizedClient).isNotNull();
|
||||
|
||||
assertThat(this.server.getRequestCount()).isEqualTo(1);
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("grant_type=client_credentials");
|
||||
@@ -142,21 +130,16 @@ public class ReactiveOAuth2AuthorizedClientProviderBuilderTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider = ReactiveOAuth2AuthorizedClientProviderBuilder
|
||||
.builder().password().build();
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(
|
||||
this.clientRegistrationBuilder.authorizationGrantType(AuthorizationGrantType.PASSWORD).build())
|
||||
.principal(this.principal).attribute(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME, "username")
|
||||
.attribute(OAuth2AuthorizationContext.PASSWORD_ATTRIBUTE_NAME, "password").build();
|
||||
OAuth2AuthorizedClient authorizedClient = authorizedClientProvider.authorize(authorizationContext).block();
|
||||
|
||||
assertThat(authorizedClient).isNotNull();
|
||||
|
||||
assertThat(this.server.getRequestCount()).isEqualTo(1);
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("grant_type=password");
|
||||
@@ -169,47 +152,35 @@ public class ReactiveOAuth2AuthorizedClientProviderBuilderTests {
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider = ReactiveOAuth2AuthorizedClientProviderBuilder
|
||||
.builder().authorizationCode().refreshToken().clientCredentials().password().build();
|
||||
|
||||
// authorization_code
|
||||
OAuth2AuthorizationContext authorizationCodeContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(this.clientRegistrationBuilder.build()).principal(this.principal).build();
|
||||
assertThatThrownBy(() -> authorizedClientProvider.authorize(authorizationCodeContext).block())
|
||||
.isInstanceOf(ClientAuthorizationRequiredException.class);
|
||||
|
||||
// refresh_token
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.clientRegistrationBuilder.build(),
|
||||
this.principal.getName(), expiredAccessToken(), TestOAuth2RefreshTokens.refreshToken());
|
||||
|
||||
OAuth2AuthorizationContext refreshTokenContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient).principal(this.principal).build();
|
||||
OAuth2AuthorizedClient reauthorizedClient = authorizedClientProvider.authorize(refreshTokenContext).block();
|
||||
|
||||
assertThat(reauthorizedClient).isNotNull();
|
||||
|
||||
assertThat(this.server.getRequestCount()).isEqualTo(1);
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("grant_type=refresh_token");
|
||||
|
||||
// client_credentials
|
||||
OAuth2AuthorizationContext clientCredentialsContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(this.clientRegistrationBuilder
|
||||
.authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS).build())
|
||||
.principal(this.principal).build();
|
||||
authorizedClient = authorizedClientProvider.authorize(clientCredentialsContext).block();
|
||||
|
||||
assertThat(authorizedClient).isNotNull();
|
||||
|
||||
assertThat(this.server.getRequestCount()).isEqualTo(2);
|
||||
|
||||
recordedRequest = this.server.takeRequest();
|
||||
formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("grant_type=client_credentials");
|
||||
|
||||
// password
|
||||
OAuth2AuthorizationContext passwordContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(
|
||||
@@ -217,11 +188,8 @@ public class ReactiveOAuth2AuthorizedClientProviderBuilderTests {
|
||||
.principal(this.principal).attribute(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME, "username")
|
||||
.attribute(OAuth2AuthorizationContext.PASSWORD_ATTRIBUTE_NAME, "password").build();
|
||||
authorizedClient = authorizedClientProvider.authorize(passwordContext).block();
|
||||
|
||||
assertThat(authorizedClient).isNotNull();
|
||||
|
||||
assertThat(this.server.getRequestCount()).isEqualTo(3);
|
||||
|
||||
recordedRequest = this.server.takeRequest();
|
||||
formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("grant_type=password");
|
||||
@@ -231,14 +199,11 @@ public class ReactiveOAuth2AuthorizedClientProviderBuilderTests {
|
||||
public void buildWhenCustomProviderThenProviderCalled() {
|
||||
ReactiveOAuth2AuthorizedClientProvider customProvider = mock(ReactiveOAuth2AuthorizedClientProvider.class);
|
||||
given(customProvider.authorize(any())).willReturn(Mono.empty());
|
||||
|
||||
ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider = ReactiveOAuth2AuthorizedClientProviderBuilder
|
||||
.builder().provider(customProvider).build();
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withClientRegistration(this.clientRegistrationBuilder.build()).principal(this.principal).build();
|
||||
authorizedClientProvider.authorize(authorizationContext).block();
|
||||
|
||||
verify(customProvider).authorize(any(OAuth2AuthorizationContext.class));
|
||||
}
|
||||
|
||||
|
||||
@@ -117,7 +117,6 @@ public class RefreshTokenOAuth2AuthorizedClientProviderTests {
|
||||
public void authorizeWhenAuthorizedAndRefreshTokenIsNullThenUnableToReauthorize() {
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), this.authorizedClient.getAccessToken());
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient).principal(this.principal).build();
|
||||
assertThat(this.authorizedClientProvider.authorize(authorizationContext)).isNull();
|
||||
@@ -127,7 +126,6 @@ public class RefreshTokenOAuth2AuthorizedClientProviderTests {
|
||||
public void authorizeWhenAuthorizedAndAccessTokenNotExpiredThenNotReauthorize() {
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), TestOAuth2AccessTokens.noScopes(), this.authorizedClient.getRefreshToken());
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient).principal(this.principal).build();
|
||||
assertThat(this.authorizedClientProvider.authorize(authorizationContext)).isNull();
|
||||
@@ -139,7 +137,6 @@ public class RefreshTokenOAuth2AuthorizedClientProviderTests {
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse()
|
||||
.refreshToken("new-refresh-token").build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse);
|
||||
|
||||
Instant now = Instant.now();
|
||||
Instant issuedAt = now.minus(Duration.ofMinutes(60));
|
||||
Instant expiresAt = now.minus(Duration.ofMinutes(1));
|
||||
@@ -147,16 +144,12 @@ public class RefreshTokenOAuth2AuthorizedClientProviderTests {
|
||||
"access-token-1234", issuedAt, expiresAt);
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), expiresInOneMinAccessToken, this.authorizedClient.getRefreshToken());
|
||||
|
||||
// Shorten the lifespan of the access token by 90 seconds, which will ultimately
|
||||
// force it to expire on the client
|
||||
this.authorizedClientProvider.setClockSkew(Duration.ofSeconds(90));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient).principal(this.principal).build();
|
||||
|
||||
OAuth2AuthorizedClient reauthorizedClient = this.authorizedClientProvider.authorize(authorizationContext);
|
||||
|
||||
assertThat(reauthorizedClient.getClientRegistration()).isSameAs(this.clientRegistration);
|
||||
assertThat(reauthorizedClient.getPrincipalName()).isEqualTo(this.principal.getName());
|
||||
assertThat(reauthorizedClient.getAccessToken()).isEqualTo(accessTokenResponse.getAccessToken());
|
||||
@@ -168,12 +161,9 @@ public class RefreshTokenOAuth2AuthorizedClientProviderTests {
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse()
|
||||
.refreshToken("new-refresh-token").build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse);
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(this.authorizedClient).principal(this.principal).build();
|
||||
|
||||
OAuth2AuthorizedClient reauthorizedClient = this.authorizedClientProvider.authorize(authorizationContext);
|
||||
|
||||
assertThat(reauthorizedClient.getClientRegistration()).isSameAs(this.clientRegistration);
|
||||
assertThat(reauthorizedClient.getPrincipalName()).isEqualTo(this.principal.getName());
|
||||
assertThat(reauthorizedClient.getAccessToken()).isEqualTo(accessTokenResponse.getAccessToken());
|
||||
@@ -185,14 +175,11 @@ public class RefreshTokenOAuth2AuthorizedClientProviderTests {
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse()
|
||||
.refreshToken("new-refresh-token").build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse);
|
||||
|
||||
String[] requestScope = new String[] { "read", "write" };
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(this.authorizedClient).principal(this.principal)
|
||||
.attribute(OAuth2AuthorizationContext.REQUEST_SCOPE_ATTRIBUTE_NAME, requestScope).build();
|
||||
|
||||
this.authorizedClientProvider.authorize(authorizationContext);
|
||||
|
||||
ArgumentCaptor<OAuth2RefreshTokenGrantRequest> refreshTokenGrantRequestArgCaptor = ArgumentCaptor
|
||||
.forClass(OAuth2RefreshTokenGrantRequest.class);
|
||||
verify(this.accessTokenResponseClient).getTokenResponse(refreshTokenGrantRequestArgCaptor.capture());
|
||||
@@ -206,7 +193,6 @@ public class RefreshTokenOAuth2AuthorizedClientProviderTests {
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(this.authorizedClient).principal(this.principal)
|
||||
.attribute(OAuth2AuthorizationContext.REQUEST_SCOPE_ATTRIBUTE_NAME, invalidRequestScope).build();
|
||||
|
||||
assertThatThrownBy(() -> this.authorizedClientProvider.authorize(authorizationContext))
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessageStartingWith("The context attribute must be of type String[] '"
|
||||
|
||||
@@ -118,7 +118,6 @@ public class RefreshTokenReactiveOAuth2AuthorizedClientProviderTests {
|
||||
public void authorizeWhenAuthorizedAndRefreshTokenIsNullThenUnableToReauthorize() {
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), this.authorizedClient.getAccessToken());
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient).principal(this.principal).build();
|
||||
assertThat(this.authorizedClientProvider.authorize(authorizationContext).block()).isNull();
|
||||
@@ -128,7 +127,6 @@ public class RefreshTokenReactiveOAuth2AuthorizedClientProviderTests {
|
||||
public void authorizeWhenAuthorizedAndAccessTokenNotExpiredThenNotReauthorize() {
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), TestOAuth2AccessTokens.noScopes(), this.authorizedClient.getRefreshToken());
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient).principal(this.principal).build();
|
||||
assertThat(this.authorizedClientProvider.authorize(authorizationContext).block()).isNull();
|
||||
@@ -140,7 +138,6 @@ public class RefreshTokenReactiveOAuth2AuthorizedClientProviderTests {
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse()
|
||||
.refreshToken("new-refresh-token").build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(accessTokenResponse));
|
||||
|
||||
Instant now = Instant.now();
|
||||
Instant issuedAt = now.minus(Duration.ofMinutes(60));
|
||||
Instant expiresAt = now.minus(Duration.ofMinutes(1));
|
||||
@@ -148,17 +145,13 @@ public class RefreshTokenReactiveOAuth2AuthorizedClientProviderTests {
|
||||
"access-token-1234", issuedAt, expiresAt);
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), expiresInOneMinAccessToken, this.authorizedClient.getRefreshToken());
|
||||
|
||||
// Shorten the lifespan of the access token by 90 seconds, which will ultimately
|
||||
// force it to expire on the client
|
||||
this.authorizedClientProvider.setClockSkew(Duration.ofSeconds(90));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(authorizedClient).principal(this.principal).build();
|
||||
|
||||
OAuth2AuthorizedClient reauthorizedClient = this.authorizedClientProvider.authorize(authorizationContext)
|
||||
.block();
|
||||
|
||||
assertThat(reauthorizedClient.getClientRegistration()).isSameAs(this.clientRegistration);
|
||||
assertThat(reauthorizedClient.getPrincipalName()).isEqualTo(this.principal.getName());
|
||||
assertThat(reauthorizedClient.getAccessToken()).isEqualTo(accessTokenResponse.getAccessToken());
|
||||
@@ -170,13 +163,10 @@ public class RefreshTokenReactiveOAuth2AuthorizedClientProviderTests {
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse()
|
||||
.refreshToken("new-refresh-token").build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(accessTokenResponse));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(this.authorizedClient).principal(this.principal).build();
|
||||
|
||||
OAuth2AuthorizedClient reauthorizedClient = this.authorizedClientProvider.authorize(authorizationContext)
|
||||
.block();
|
||||
|
||||
assertThat(reauthorizedClient.getClientRegistration()).isSameAs(this.clientRegistration);
|
||||
assertThat(reauthorizedClient.getPrincipalName()).isEqualTo(this.principal.getName());
|
||||
assertThat(reauthorizedClient.getAccessToken()).isEqualTo(accessTokenResponse.getAccessToken());
|
||||
@@ -188,14 +178,11 @@ public class RefreshTokenReactiveOAuth2AuthorizedClientProviderTests {
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse()
|
||||
.refreshToken("new-refresh-token").build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(accessTokenResponse));
|
||||
|
||||
String[] requestScope = new String[] { "read", "write" };
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(this.authorizedClient).principal(this.principal)
|
||||
.attribute(OAuth2AuthorizationContext.REQUEST_SCOPE_ATTRIBUTE_NAME, requestScope).build();
|
||||
|
||||
this.authorizedClientProvider.authorize(authorizationContext).block();
|
||||
|
||||
ArgumentCaptor<OAuth2RefreshTokenGrantRequest> refreshTokenGrantRequestArgCaptor = ArgumentCaptor
|
||||
.forClass(OAuth2RefreshTokenGrantRequest.class);
|
||||
verify(this.accessTokenResponseClient).getTokenResponse(refreshTokenGrantRequestArgCaptor.capture());
|
||||
@@ -209,7 +196,6 @@ public class RefreshTokenReactiveOAuth2AuthorizedClientProviderTests {
|
||||
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext
|
||||
.withAuthorizedClient(this.authorizedClient).principal(this.principal)
|
||||
.attribute(OAuth2AuthorizationContext.REQUEST_SCOPE_ATTRIBUTE_NAME, invalidRequestScope).build();
|
||||
|
||||
assertThatThrownBy(() -> this.authorizedClientProvider.authorize(authorizationContext).block())
|
||||
.isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessageStartingWith("The context attribute must be of type String[] '"
|
||||
|
||||
@@ -72,7 +72,6 @@ public class OAuth2AuthenticationTokenTests {
|
||||
public void constructorWhenAllParametersProvidedAndValidThenCreated() {
|
||||
OAuth2AuthenticationToken authentication = new OAuth2AuthenticationToken(this.principal, this.authorities,
|
||||
this.authorizedClientRegistrationId);
|
||||
|
||||
assertThat(authentication.getPrincipal()).isEqualTo(this.principal);
|
||||
assertThat(authentication.getCredentials()).isEqualTo("");
|
||||
assertThat(authentication.getAuthorities()).isEqualTo(this.authorities);
|
||||
|
||||
@@ -84,7 +84,6 @@ public class OAuth2AuthorizationCodeAuthenticationProviderTests {
|
||||
.errorCode(OAuth2ErrorCodes.INVALID_REQUEST).build();
|
||||
OAuth2AuthorizationExchange authorizationExchange = new OAuth2AuthorizationExchange(this.authorizationRequest,
|
||||
authorizationResponse);
|
||||
|
||||
assertThatThrownBy(() -> this.authenticationProvider.authenticate(
|
||||
new OAuth2AuthorizationCodeAuthenticationToken(this.clientRegistration, authorizationExchange)))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class)
|
||||
@@ -97,7 +96,6 @@ public class OAuth2AuthorizationCodeAuthenticationProviderTests {
|
||||
.build();
|
||||
OAuth2AuthorizationExchange authorizationExchange = new OAuth2AuthorizationExchange(this.authorizationRequest,
|
||||
authorizationResponse);
|
||||
|
||||
assertThatThrownBy(() -> this.authenticationProvider.authenticate(
|
||||
new OAuth2AuthorizationCodeAuthenticationToken(this.clientRegistration, authorizationExchange)))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class)
|
||||
@@ -109,13 +107,11 @@ public class OAuth2AuthorizationCodeAuthenticationProviderTests {
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse()
|
||||
.refreshToken("refresh").build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse);
|
||||
|
||||
OAuth2AuthorizationExchange authorizationExchange = new OAuth2AuthorizationExchange(this.authorizationRequest,
|
||||
TestOAuth2AuthorizationResponses.success().build());
|
||||
OAuth2AuthorizationCodeAuthenticationToken authenticationResult = (OAuth2AuthorizationCodeAuthenticationToken) this.authenticationProvider
|
||||
.authenticate(
|
||||
new OAuth2AuthorizationCodeAuthenticationToken(this.clientRegistration, authorizationExchange));
|
||||
|
||||
assertThat(authenticationResult.isAuthenticated()).isTrue();
|
||||
assertThat(authenticationResult.getPrincipal()).isEqualTo(this.clientRegistration.getClientId());
|
||||
assertThat(authenticationResult.getCredentials())
|
||||
@@ -133,18 +129,14 @@ public class OAuth2AuthorizationCodeAuthenticationProviderTests {
|
||||
Map<String, Object> additionalParameters = new HashMap<>();
|
||||
additionalParameters.put("param1", "value1");
|
||||
additionalParameters.put("param2", "value2");
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse()
|
||||
.additionalParameters(additionalParameters).build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse);
|
||||
|
||||
OAuth2AuthorizationExchange authorizationExchange = new OAuth2AuthorizationExchange(this.authorizationRequest,
|
||||
TestOAuth2AuthorizationResponses.success().build());
|
||||
|
||||
OAuth2AuthorizationCodeAuthenticationToken authentication = (OAuth2AuthorizationCodeAuthenticationToken) this.authenticationProvider
|
||||
.authenticate(
|
||||
new OAuth2AuthorizationCodeAuthenticationToken(this.clientRegistration, authorizationExchange));
|
||||
|
||||
assertThat(authentication.getAdditionalParameters())
|
||||
.containsAllEntriesOf(accessTokenResponse.getAdditionalParameters());
|
||||
}
|
||||
|
||||
@@ -69,7 +69,6 @@ public class OAuth2AuthorizationCodeAuthenticationTokenTests {
|
||||
public void constructorAuthorizationRequestResponseWhenAllParametersProvidedAndValidThenCreated() {
|
||||
OAuth2AuthorizationCodeAuthenticationToken authentication = new OAuth2AuthorizationCodeAuthenticationToken(
|
||||
this.clientRegistration, this.authorizationExchange);
|
||||
|
||||
assertThat(authentication.getPrincipal()).isEqualTo(this.clientRegistration.getClientId());
|
||||
assertThat(authentication.getCredentials())
|
||||
.isEqualTo(this.authorizationExchange.getAuthorizationResponse().getCode());
|
||||
@@ -103,7 +102,6 @@ public class OAuth2AuthorizationCodeAuthenticationTokenTests {
|
||||
public void constructorTokenRequestResponseWhenAllParametersProvidedAndValidThenCreated() {
|
||||
OAuth2AuthorizationCodeAuthenticationToken authentication = new OAuth2AuthorizationCodeAuthenticationToken(
|
||||
this.clientRegistration, this.authorizationExchange, this.accessToken);
|
||||
|
||||
assertThat(authentication.getPrincipal()).isEqualTo(this.clientRegistration.getClientId());
|
||||
assertThat(authentication.getCredentials()).isEqualTo(this.accessToken.getTokenValue());
|
||||
assertThat(authentication.getAuthorities()).isEqualTo(Collections.emptyList());
|
||||
|
||||
@@ -82,18 +82,14 @@ public class OAuth2AuthorizationCodeReactiveAuthenticationManagerTests {
|
||||
@Test
|
||||
public void authenticateWhenValidThenSuccess() {
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(this.tokenResponse.build()));
|
||||
|
||||
OAuth2AuthorizationCodeAuthenticationToken result = authenticate();
|
||||
|
||||
assertThat(result).isNotNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void authenticateWhenEmptyThenEmpty() {
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(Mono.empty());
|
||||
|
||||
OAuth2AuthorizationCodeAuthenticationToken result = authenticate();
|
||||
|
||||
assertThat(result).isNull();
|
||||
}
|
||||
|
||||
@@ -101,7 +97,6 @@ public class OAuth2AuthorizationCodeReactiveAuthenticationManagerTests {
|
||||
public void authenticateWhenOAuth2AuthorizationExceptionThenOAuth2AuthorizationException() {
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any()))
|
||||
.willReturn(Mono.error(() -> new OAuth2AuthorizationException(new OAuth2Error("error"))));
|
||||
|
||||
assertThatCode(() -> authenticate()).isInstanceOf(OAuth2AuthorizationException.class);
|
||||
}
|
||||
|
||||
|
||||
@@ -125,10 +125,8 @@ public class OAuth2LoginAuthenticationProviderTests {
|
||||
.build();
|
||||
OAuth2AuthorizationExchange authorizationExchange = new OAuth2AuthorizationExchange(authorizationRequest,
|
||||
this.authorizationResponse);
|
||||
|
||||
OAuth2LoginAuthenticationToken authentication = (OAuth2LoginAuthenticationToken) this.authenticationProvider
|
||||
.authenticate(new OAuth2LoginAuthenticationToken(this.clientRegistration, authorizationExchange));
|
||||
|
||||
assertThat(authentication).isNull();
|
||||
}
|
||||
|
||||
@@ -136,12 +134,10 @@ public class OAuth2LoginAuthenticationProviderTests {
|
||||
public void authenticateWhenAuthorizationErrorResponseThenThrowOAuth2AuthenticationException() {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString(OAuth2ErrorCodes.INVALID_REQUEST));
|
||||
|
||||
OAuth2AuthorizationResponse authorizationResponse = TestOAuth2AuthorizationResponses.error()
|
||||
.errorCode(OAuth2ErrorCodes.INVALID_REQUEST).build();
|
||||
OAuth2AuthorizationExchange authorizationExchange = new OAuth2AuthorizationExchange(this.authorizationRequest,
|
||||
authorizationResponse);
|
||||
|
||||
this.authenticationProvider
|
||||
.authenticate(new OAuth2LoginAuthenticationToken(this.clientRegistration, authorizationExchange));
|
||||
}
|
||||
@@ -150,12 +146,10 @@ public class OAuth2LoginAuthenticationProviderTests {
|
||||
public void authenticateWhenAuthorizationResponseStateNotEqualAuthorizationRequestStateThenThrowOAuth2AuthenticationException() {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString("invalid_state_parameter"));
|
||||
|
||||
OAuth2AuthorizationResponse authorizationResponse = TestOAuth2AuthorizationResponses.success().state("67890")
|
||||
.build();
|
||||
OAuth2AuthorizationExchange authorizationExchange = new OAuth2AuthorizationExchange(this.authorizationRequest,
|
||||
authorizationResponse);
|
||||
|
||||
this.authenticationProvider
|
||||
.authenticate(new OAuth2LoginAuthenticationToken(this.clientRegistration, authorizationExchange));
|
||||
}
|
||||
@@ -164,15 +158,12 @@ public class OAuth2LoginAuthenticationProviderTests {
|
||||
public void authenticateWhenLoginSuccessThenReturnAuthentication() {
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.accessTokenSuccessResponse();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse);
|
||||
|
||||
OAuth2User principal = mock(OAuth2User.class);
|
||||
List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("ROLE_USER");
|
||||
given(principal.getAuthorities()).willAnswer((Answer<List<GrantedAuthority>>) (invocation) -> authorities);
|
||||
given(this.userService.loadUser(any())).willReturn(principal);
|
||||
|
||||
OAuth2LoginAuthenticationToken authentication = (OAuth2LoginAuthenticationToken) this.authenticationProvider
|
||||
.authenticate(new OAuth2LoginAuthenticationToken(this.clientRegistration, this.authorizationExchange));
|
||||
|
||||
assertThat(authentication.isAuthenticated()).isTrue();
|
||||
assertThat(authentication.getPrincipal()).isEqualTo(principal);
|
||||
assertThat(authentication.getCredentials()).isEqualTo("");
|
||||
@@ -187,21 +178,17 @@ public class OAuth2LoginAuthenticationProviderTests {
|
||||
public void authenticateWhenAuthoritiesMapperSetThenReturnMappedAuthorities() {
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.accessTokenSuccessResponse();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse);
|
||||
|
||||
OAuth2User principal = mock(OAuth2User.class);
|
||||
List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("ROLE_USER");
|
||||
given(principal.getAuthorities()).willAnswer((Answer<List<GrantedAuthority>>) (invocation) -> authorities);
|
||||
given(this.userService.loadUser(any())).willReturn(principal);
|
||||
|
||||
List<GrantedAuthority> mappedAuthorities = AuthorityUtils.createAuthorityList("ROLE_OAUTH2_USER");
|
||||
GrantedAuthoritiesMapper authoritiesMapper = mock(GrantedAuthoritiesMapper.class);
|
||||
given(authoritiesMapper.mapAuthorities(anyCollection()))
|
||||
.willAnswer((Answer<List<GrantedAuthority>>) (invocation) -> mappedAuthorities);
|
||||
this.authenticationProvider.setAuthoritiesMapper(authoritiesMapper);
|
||||
|
||||
OAuth2LoginAuthenticationToken authentication = (OAuth2LoginAuthenticationToken) this.authenticationProvider
|
||||
.authenticate(new OAuth2LoginAuthenticationToken(this.clientRegistration, this.authorizationExchange));
|
||||
|
||||
assertThat(authentication.getAuthorities()).isEqualTo(mappedAuthorities);
|
||||
}
|
||||
|
||||
@@ -210,16 +197,13 @@ public class OAuth2LoginAuthenticationProviderTests {
|
||||
public void authenticateWhenTokenSuccessResponseThenAdditionalParametersAddedToUserRequest() {
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.accessTokenSuccessResponse();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse);
|
||||
|
||||
OAuth2User principal = mock(OAuth2User.class);
|
||||
List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("ROLE_USER");
|
||||
given(principal.getAuthorities()).willAnswer((Answer<List<GrantedAuthority>>) (invocation) -> authorities);
|
||||
ArgumentCaptor<OAuth2UserRequest> userRequestArgCaptor = ArgumentCaptor.forClass(OAuth2UserRequest.class);
|
||||
given(this.userService.loadUser(userRequestArgCaptor.capture())).willReturn(principal);
|
||||
|
||||
this.authenticationProvider
|
||||
.authenticate(new OAuth2LoginAuthenticationToken(this.clientRegistration, this.authorizationExchange));
|
||||
|
||||
assertThat(userRequestArgCaptor.getValue().getAdditionalParameters())
|
||||
.containsAllEntriesOf(accessTokenResponse.getAdditionalParameters());
|
||||
}
|
||||
@@ -230,11 +214,9 @@ public class OAuth2LoginAuthenticationProviderTests {
|
||||
Map<String, Object> additionalParameters = new HashMap<>();
|
||||
additionalParameters.put("param1", "value1");
|
||||
additionalParameters.put("param2", "value2");
|
||||
|
||||
return OAuth2AccessTokenResponse.withToken("access-token-1234").tokenType(OAuth2AccessToken.TokenType.BEARER)
|
||||
.expiresIn(expiresAt.getEpochSecond()).scopes(scopes).refreshToken("refresh-token-1234")
|
||||
.additionalParameters(additionalParameters).build();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -76,7 +76,6 @@ public class OAuth2LoginAuthenticationTokenTests {
|
||||
public void constructorAuthorizationRequestResponseWhenAllParametersProvidedAndValidThenCreated() {
|
||||
OAuth2LoginAuthenticationToken authentication = new OAuth2LoginAuthenticationToken(this.clientRegistration,
|
||||
this.authorizationExchange);
|
||||
|
||||
assertThat(authentication.getPrincipal()).isNull();
|
||||
assertThat(authentication.getCredentials()).isEqualTo("");
|
||||
assertThat(authentication.getAuthorities()).isEqualTo(Collections.emptyList());
|
||||
@@ -126,7 +125,6 @@ public class OAuth2LoginAuthenticationTokenTests {
|
||||
public void constructorTokenRequestResponseWhenAllParametersProvidedAndValidThenCreated() {
|
||||
OAuth2LoginAuthenticationToken authentication = new OAuth2LoginAuthenticationToken(this.clientRegistration,
|
||||
this.authorizationExchange, this.principal, this.authorities, this.accessToken);
|
||||
|
||||
assertThat(authentication.getPrincipal()).isEqualTo(this.principal);
|
||||
assertThat(authentication.getCredentials()).isEqualTo("");
|
||||
assertThat(authentication.getAuthorities()).isEqualTo(this.authorities);
|
||||
|
||||
@@ -113,9 +113,7 @@ public class OAuth2LoginReactiveAuthenticationManagerTests {
|
||||
// we didn't do anything because it should cause a ClassCastException (as verified
|
||||
// below)
|
||||
TestingAuthenticationToken token = new TestingAuthenticationToken("a", "b");
|
||||
|
||||
assertThatCode(() -> this.manager.authenticate(token)).doesNotThrowAnyException();
|
||||
|
||||
assertThatThrownBy(() -> this.manager.authenticate(token).block()).isInstanceOf(Throwable.class);
|
||||
}
|
||||
|
||||
@@ -157,10 +155,8 @@ public class OAuth2LoginReactiveAuthenticationManagerTests {
|
||||
DefaultOAuth2User user = new DefaultOAuth2User(AuthorityUtils.createAuthorityList("ROLE_USER"),
|
||||
Collections.singletonMap("user", "rob"), "user");
|
||||
given(this.userService.loadUser(any())).willReturn(Mono.just(user));
|
||||
|
||||
OAuth2LoginAuthenticationToken result = (OAuth2LoginAuthenticationToken) this.manager.authenticate(loginToken())
|
||||
.block();
|
||||
|
||||
assertThat(result.getPrincipal()).isEqualTo(user);
|
||||
assertThat(result.getAuthorities()).containsOnlyElementsOf(user.getAuthorities());
|
||||
assertThat(result.isAuthenticated()).isTrue();
|
||||
@@ -179,9 +175,7 @@ public class OAuth2LoginReactiveAuthenticationManagerTests {
|
||||
Collections.singletonMap("user", "rob"), "user");
|
||||
ArgumentCaptor<OAuth2UserRequest> userRequestArgCaptor = ArgumentCaptor.forClass(OAuth2UserRequest.class);
|
||||
given(this.userService.loadUser(userRequestArgCaptor.capture())).willReturn(Mono.just(user));
|
||||
|
||||
this.manager.authenticate(loginToken()).block();
|
||||
|
||||
assertThat(userRequestArgCaptor.getValue().getAdditionalParameters())
|
||||
.containsAllEntriesOf(accessTokenResponse.getAdditionalParameters());
|
||||
}
|
||||
@@ -199,10 +193,8 @@ public class OAuth2LoginReactiveAuthenticationManagerTests {
|
||||
given(authoritiesMapper.mapAuthorities(anyCollection()))
|
||||
.willAnswer((Answer<List<GrantedAuthority>>) (invocation) -> mappedAuthorities);
|
||||
this.manager.setAuthoritiesMapper(authoritiesMapper);
|
||||
|
||||
OAuth2LoginAuthenticationToken result = (OAuth2LoginAuthenticationToken) this.manager.authenticate(loginToken())
|
||||
.block();
|
||||
|
||||
assertThat(result.getAuthorities()).isEqualTo(mappedAuthorities);
|
||||
}
|
||||
|
||||
|
||||
@@ -98,25 +98,19 @@ public class DefaultAuthorizationCodeTokenResponseClientTests {
|
||||
+ " \"custom_parameter_1\": \"custom-value-1\",\n" + " \"custom_parameter_2\": \"custom-value-2\"\n"
|
||||
+ "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
Instant expiresAtBefore = Instant.now().plusSeconds(3600);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient
|
||||
.getTokenResponse(this.authorizationCodeGrantRequest());
|
||||
|
||||
Instant expiresAtAfter = Instant.now().plusSeconds(3600);
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
assertThat(recordedRequest.getMethod()).isEqualTo(HttpMethod.POST.toString());
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.ACCEPT)).isEqualTo(MediaType.APPLICATION_JSON_UTF8_VALUE);
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.CONTENT_TYPE))
|
||||
.isEqualTo(MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8");
|
||||
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("grant_type=authorization_code");
|
||||
assertThat(formParameters).contains("code=code-1234");
|
||||
assertThat(formParameters).contains("redirect_uri=https%3A%2F%2Fclient.com%2Fcallback%2Fclient-1");
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenValue()).isEqualTo("access-token-1234");
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenType()).isEqualTo(OAuth2AccessToken.TokenType.BEARER);
|
||||
assertThat(accessTokenResponse.getAccessToken().getExpiresAt()).isBetween(expiresAtBefore, expiresAtAfter);
|
||||
@@ -132,9 +126,7 @@ public class DefaultAuthorizationCodeTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
this.tokenResponseClient.getTokenResponse(this.authorizationCodeGrantRequest());
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.AUTHORIZATION)).startsWith("Basic ");
|
||||
}
|
||||
@@ -144,15 +136,11 @@ public class DefaultAuthorizationCodeTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
ClientRegistration clientRegistration = this.from(this.clientRegistration)
|
||||
.clientAuthenticationMethod(ClientAuthenticationMethod.POST).build();
|
||||
|
||||
this.tokenResponseClient.getTokenResponse(this.authorizationCodeGrantRequest(clientRegistration));
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.AUTHORIZATION)).isNull();
|
||||
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("client_id=client-1");
|
||||
assertThat(formParameters).contains("client_secret=secret");
|
||||
@@ -163,7 +151,6 @@ public class DefaultAuthorizationCodeTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"not-bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(this.authorizationCodeGrantRequest()))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class)
|
||||
.hasMessageContaining(
|
||||
@@ -175,7 +162,6 @@ public class DefaultAuthorizationCodeTokenResponseClientTests {
|
||||
public void getTokenResponseWhenSuccessResponseAndMissingTokenTypeParameterThenThrowOAuth2AuthorizationException() {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(this.authorizationCodeGrantRequest()))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class)
|
||||
.hasMessageContaining(
|
||||
@@ -189,10 +175,8 @@ public class DefaultAuthorizationCodeTokenResponseClientTests {
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\",\n"
|
||||
+ " \"refresh_token\": \"refresh-token-1234\",\n" + " \"scope\": \"read\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient
|
||||
.getTokenResponse(this.authorizationCodeGrantRequest());
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getScopes()).containsExactly("read");
|
||||
}
|
||||
|
||||
@@ -202,10 +186,8 @@ public class DefaultAuthorizationCodeTokenResponseClientTests {
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\",\n"
|
||||
+ " \"refresh_token\": \"refresh-token-1234\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient
|
||||
.getTokenResponse(this.authorizationCodeGrantRequest());
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getScopes()).containsExactly("read", "write");
|
||||
}
|
||||
|
||||
@@ -213,7 +195,6 @@ public class DefaultAuthorizationCodeTokenResponseClientTests {
|
||||
public void getTokenResponseWhenTokenUriInvalidThenThrowOAuth2AuthorizationException() {
|
||||
String invalidTokenUri = "https://invalid-provider.com/oauth2/token";
|
||||
ClientRegistration clientRegistration = this.from(this.clientRegistration).tokenUri(invalidTokenUri).build();
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(this.authorizationCodeGrantRequest(
|
||||
clientRegistration))).isInstanceOf(OAuth2AuthorizationException.class).hasMessageContaining(
|
||||
"[invalid_token_response] An error occurred while attempting to retrieve the OAuth 2.0 Access Token Response");
|
||||
@@ -228,7 +209,6 @@ public class DefaultAuthorizationCodeTokenResponseClientTests {
|
||||
+ " \"custom_parameter_2\": \"custom-value-2\"\n";
|
||||
// "}\n"; // Make the JSON invalid/malformed
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(this.authorizationCodeGrantRequest()))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class).hasMessageContaining(
|
||||
"[invalid_token_response] An error occurred while attempting to retrieve the OAuth 2.0 Access Token Response");
|
||||
@@ -238,7 +218,6 @@ public class DefaultAuthorizationCodeTokenResponseClientTests {
|
||||
public void getTokenResponseWhenErrorResponseThenThrowOAuth2AuthorizationException() {
|
||||
String accessTokenErrorResponse = "{\n" + " \"error\": \"unauthorized_client\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenErrorResponse).setResponseCode(400));
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(this.authorizationCodeGrantRequest()))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class).hasMessageContaining("[unauthorized_client]");
|
||||
}
|
||||
@@ -246,7 +225,6 @@ public class DefaultAuthorizationCodeTokenResponseClientTests {
|
||||
@Test
|
||||
public void getTokenResponseWhenServerErrorResponseThenThrowOAuth2AuthorizationException() {
|
||||
this.server.enqueue(new MockResponse().setResponseCode(500));
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(this.authorizationCodeGrantRequest()))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class).hasMessageContaining(
|
||||
"[invalid_token_response] An error occurred while attempting to retrieve the OAuth 2.0 Access Token Response");
|
||||
|
||||
@@ -92,27 +92,20 @@ public class DefaultClientCredentialsTokenResponseClientTests {
|
||||
+ " \"scope\": \"read write\",\n" + " \"custom_parameter_1\": \"custom-value-1\",\n"
|
||||
+ " \"custom_parameter_2\": \"custom-value-2\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
Instant expiresAtBefore = Instant.now().plusSeconds(3600);
|
||||
|
||||
OAuth2ClientCredentialsGrantRequest clientCredentialsGrantRequest = new OAuth2ClientCredentialsGrantRequest(
|
||||
this.clientRegistration);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient
|
||||
.getTokenResponse(clientCredentialsGrantRequest);
|
||||
|
||||
Instant expiresAtAfter = Instant.now().plusSeconds(3600);
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
assertThat(recordedRequest.getMethod()).isEqualTo(HttpMethod.POST.toString());
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.ACCEPT)).isEqualTo(MediaType.APPLICATION_JSON_UTF8_VALUE);
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.CONTENT_TYPE))
|
||||
.isEqualTo(MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8");
|
||||
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("grant_type=client_credentials");
|
||||
assertThat(formParameters).contains("scope=read+write");
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenValue()).isEqualTo("access-token-1234");
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenType()).isEqualTo(OAuth2AccessToken.TokenType.BEARER);
|
||||
assertThat(accessTokenResponse.getAccessToken().getExpiresAt()).isBetween(expiresAtBefore, expiresAtAfter);
|
||||
@@ -128,12 +121,9 @@ public class DefaultClientCredentialsTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
OAuth2ClientCredentialsGrantRequest clientCredentialsGrantRequest = new OAuth2ClientCredentialsGrantRequest(
|
||||
this.clientRegistration);
|
||||
|
||||
this.tokenResponseClient.getTokenResponse(clientCredentialsGrantRequest);
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.AUTHORIZATION)).startsWith("Basic ");
|
||||
}
|
||||
@@ -143,18 +133,13 @@ public class DefaultClientCredentialsTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
ClientRegistration clientRegistration = this.from(this.clientRegistration)
|
||||
.clientAuthenticationMethod(ClientAuthenticationMethod.POST).build();
|
||||
|
||||
OAuth2ClientCredentialsGrantRequest clientCredentialsGrantRequest = new OAuth2ClientCredentialsGrantRequest(
|
||||
clientRegistration);
|
||||
|
||||
this.tokenResponseClient.getTokenResponse(clientCredentialsGrantRequest);
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.AUTHORIZATION)).isNull();
|
||||
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("client_id=client-1");
|
||||
assertThat(formParameters).contains("client_secret=secret");
|
||||
@@ -165,10 +150,8 @@ public class DefaultClientCredentialsTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"not-bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
OAuth2ClientCredentialsGrantRequest clientCredentialsGrantRequest = new OAuth2ClientCredentialsGrantRequest(
|
||||
this.clientRegistration);
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(clientCredentialsGrantRequest))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class)
|
||||
.hasMessageContaining(
|
||||
@@ -180,10 +163,8 @@ public class DefaultClientCredentialsTokenResponseClientTests {
|
||||
public void getTokenResponseWhenSuccessResponseAndMissingTokenTypeParameterThenThrowOAuth2AuthorizationException() {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
OAuth2ClientCredentialsGrantRequest clientCredentialsGrantRequest = new OAuth2ClientCredentialsGrantRequest(
|
||||
this.clientRegistration);
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(clientCredentialsGrantRequest))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class)
|
||||
.hasMessageContaining(
|
||||
@@ -197,13 +178,10 @@ public class DefaultClientCredentialsTokenResponseClientTests {
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\",\n" + " \"scope\": \"read\"\n"
|
||||
+ "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
OAuth2ClientCredentialsGrantRequest clientCredentialsGrantRequest = new OAuth2ClientCredentialsGrantRequest(
|
||||
this.clientRegistration);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient
|
||||
.getTokenResponse(clientCredentialsGrantRequest);
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getScopes()).containsExactly("read");
|
||||
}
|
||||
|
||||
@@ -212,13 +190,10 @@ public class DefaultClientCredentialsTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
OAuth2ClientCredentialsGrantRequest clientCredentialsGrantRequest = new OAuth2ClientCredentialsGrantRequest(
|
||||
this.clientRegistration);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient
|
||||
.getTokenResponse(clientCredentialsGrantRequest);
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getScopes()).containsExactly("read", "write");
|
||||
}
|
||||
|
||||
@@ -226,10 +201,8 @@ public class DefaultClientCredentialsTokenResponseClientTests {
|
||||
public void getTokenResponseWhenTokenUriInvalidThenThrowOAuth2AuthorizationException() {
|
||||
String invalidTokenUri = "https://invalid-provider.com/oauth2/token";
|
||||
ClientRegistration clientRegistration = this.from(this.clientRegistration).tokenUri(invalidTokenUri).build();
|
||||
|
||||
OAuth2ClientCredentialsGrantRequest clientCredentialsGrantRequest = new OAuth2ClientCredentialsGrantRequest(
|
||||
clientRegistration);
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(clientCredentialsGrantRequest))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class).hasMessageContaining(
|
||||
"[invalid_token_response] An error occurred while attempting to retrieve the OAuth 2.0 Access Token Response");
|
||||
@@ -243,10 +216,8 @@ public class DefaultClientCredentialsTokenResponseClientTests {
|
||||
+ " \"custom_parameter_2\": \"custom-value-2\"\n";
|
||||
// "}\n"; // Make the JSON invalid/malformed
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
OAuth2ClientCredentialsGrantRequest clientCredentialsGrantRequest = new OAuth2ClientCredentialsGrantRequest(
|
||||
this.clientRegistration);
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(clientCredentialsGrantRequest))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class).hasMessageContaining(
|
||||
"[invalid_token_response] An error occurred while attempting to retrieve the OAuth 2.0 Access Token Response");
|
||||
@@ -256,10 +227,8 @@ public class DefaultClientCredentialsTokenResponseClientTests {
|
||||
public void getTokenResponseWhenErrorResponseThenThrowOAuth2AuthorizationException() {
|
||||
String accessTokenErrorResponse = "{\n" + " \"error\": \"unauthorized_client\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenErrorResponse).setResponseCode(400));
|
||||
|
||||
OAuth2ClientCredentialsGrantRequest clientCredentialsGrantRequest = new OAuth2ClientCredentialsGrantRequest(
|
||||
this.clientRegistration);
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(clientCredentialsGrantRequest))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class).hasMessageContaining("[unauthorized_client]");
|
||||
}
|
||||
@@ -267,10 +236,8 @@ public class DefaultClientCredentialsTokenResponseClientTests {
|
||||
@Test
|
||||
public void getTokenResponseWhenServerErrorResponseThenThrowOAuth2AuthorizationException() {
|
||||
this.server.enqueue(new MockResponse().setResponseCode(500));
|
||||
|
||||
OAuth2ClientCredentialsGrantRequest clientCredentialsGrantRequest = new OAuth2ClientCredentialsGrantRequest(
|
||||
this.clientRegistration);
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(clientCredentialsGrantRequest))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class).hasMessageContaining(
|
||||
"[invalid_token_response] An error occurred while attempting to retrieve the OAuth 2.0 Access Token Response");
|
||||
|
||||
@@ -93,29 +93,22 @@ public class DefaultPasswordTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
Instant expiresAtBefore = Instant.now().plusSeconds(3600);
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.build();
|
||||
OAuth2PasswordGrantRequest passwordGrantRequest = new OAuth2PasswordGrantRequest(clientRegistration,
|
||||
this.username, this.password);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient.getTokenResponse(passwordGrantRequest);
|
||||
|
||||
Instant expiresAtAfter = Instant.now().plusSeconds(3600);
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
assertThat(recordedRequest.getMethod()).isEqualTo(HttpMethod.POST.toString());
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.ACCEPT)).isEqualTo(MediaType.APPLICATION_JSON_UTF8_VALUE);
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.CONTENT_TYPE))
|
||||
.isEqualTo(MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8");
|
||||
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("grant_type=password");
|
||||
assertThat(formParameters).contains("username=user1");
|
||||
assertThat(formParameters).contains("password=password");
|
||||
assertThat(formParameters).contains("scope=read+write");
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenValue()).isEqualTo("access-token-1234");
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenType()).isEqualTo(OAuth2AccessToken.TokenType.BEARER);
|
||||
assertThat(accessTokenResponse.getAccessToken().getExpiresAt()).isBetween(expiresAtBefore, expiresAtAfter);
|
||||
@@ -129,17 +122,13 @@ public class DefaultPasswordTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder
|
||||
.clientAuthenticationMethod(ClientAuthenticationMethod.POST).build();
|
||||
OAuth2PasswordGrantRequest passwordGrantRequest = new OAuth2PasswordGrantRequest(clientRegistration,
|
||||
this.username, this.password);
|
||||
|
||||
this.tokenResponseClient.getTokenResponse(passwordGrantRequest);
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.AUTHORIZATION)).isNull();
|
||||
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("client_id=client-id");
|
||||
assertThat(formParameters).contains("client_secret=client-secret");
|
||||
@@ -150,10 +139,8 @@ public class DefaultPasswordTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"not-bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
OAuth2PasswordGrantRequest passwordGrantRequest = new OAuth2PasswordGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.username, this.password);
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(passwordGrantRequest))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class)
|
||||
.hasMessageContaining(
|
||||
@@ -167,16 +154,12 @@ public class DefaultPasswordTokenResponseClientTests {
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\",\n" + " \"scope\": \"read\"\n"
|
||||
+ "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
OAuth2PasswordGrantRequest passwordGrantRequest = new OAuth2PasswordGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.username, this.password);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient.getTokenResponse(passwordGrantRequest);
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("scope=read");
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getScopes()).containsExactly("read");
|
||||
}
|
||||
|
||||
@@ -184,10 +167,8 @@ public class DefaultPasswordTokenResponseClientTests {
|
||||
public void getTokenResponseWhenErrorResponseThenThrowOAuth2AuthorizationException() {
|
||||
String accessTokenErrorResponse = "{\n" + " \"error\": \"unauthorized_client\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenErrorResponse).setResponseCode(400));
|
||||
|
||||
OAuth2PasswordGrantRequest passwordGrantRequest = new OAuth2PasswordGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.username, this.password);
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(passwordGrantRequest))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class).hasMessageContaining("[unauthorized_client]");
|
||||
}
|
||||
@@ -195,10 +176,8 @@ public class DefaultPasswordTokenResponseClientTests {
|
||||
@Test
|
||||
public void getTokenResponseWhenServerErrorResponseThenThrowOAuth2AuthorizationException() {
|
||||
this.server.enqueue(new MockResponse().setResponseCode(500));
|
||||
|
||||
OAuth2PasswordGrantRequest passwordGrantRequest = new OAuth2PasswordGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.username, this.password);
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(passwordGrantRequest))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class).hasMessageContaining(
|
||||
"[invalid_token_response] An error occurred while attempting to retrieve the OAuth 2.0 Access Token Response");
|
||||
|
||||
@@ -97,28 +97,21 @@ public class DefaultRefreshTokenTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
Instant expiresAtBefore = Instant.now().plusSeconds(3600);
|
||||
|
||||
OAuth2RefreshTokenGrantRequest refreshTokenGrantRequest = new OAuth2RefreshTokenGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.accessToken, this.refreshToken);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient
|
||||
.getTokenResponse(refreshTokenGrantRequest);
|
||||
|
||||
Instant expiresAtAfter = Instant.now().plusSeconds(3600);
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
assertThat(recordedRequest.getMethod()).isEqualTo(HttpMethod.POST.toString());
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.ACCEPT)).isEqualTo(MediaType.APPLICATION_JSON_UTF8_VALUE);
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.CONTENT_TYPE))
|
||||
.isEqualTo(MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8");
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.AUTHORIZATION)).startsWith("Basic ");
|
||||
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("grant_type=refresh_token");
|
||||
assertThat(formParameters).contains("refresh_token=refresh-token");
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenValue()).isEqualTo("access-token-1234");
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenType()).isEqualTo(OAuth2AccessToken.TokenType.BEARER);
|
||||
assertThat(accessTokenResponse.getAccessToken().getExpiresAt()).isBetween(expiresAtBefore, expiresAtAfter);
|
||||
@@ -132,18 +125,13 @@ public class DefaultRefreshTokenTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder
|
||||
.clientAuthenticationMethod(ClientAuthenticationMethod.POST).build();
|
||||
|
||||
OAuth2RefreshTokenGrantRequest refreshTokenGrantRequest = new OAuth2RefreshTokenGrantRequest(clientRegistration,
|
||||
this.accessToken, this.refreshToken);
|
||||
|
||||
this.tokenResponseClient.getTokenResponse(refreshTokenGrantRequest);
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.AUTHORIZATION)).isNull();
|
||||
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("client_id=client-id");
|
||||
assertThat(formParameters).contains("client_secret=client-secret");
|
||||
@@ -154,10 +142,8 @@ public class DefaultRefreshTokenTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"not-bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
OAuth2RefreshTokenGrantRequest refreshTokenGrantRequest = new OAuth2RefreshTokenGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.accessToken, this.refreshToken);
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(refreshTokenGrantRequest))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class)
|
||||
.hasMessageContaining(
|
||||
@@ -171,18 +157,14 @@ public class DefaultRefreshTokenTokenResponseClientTests {
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\",\n" + " \"scope\": \"read\"\n"
|
||||
+ "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
OAuth2RefreshTokenGrantRequest refreshTokenGrantRequest = new OAuth2RefreshTokenGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.accessToken, this.refreshToken,
|
||||
Collections.singleton("read"));
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient
|
||||
.getTokenResponse(refreshTokenGrantRequest);
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("scope=read");
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getScopes()).containsExactly("read");
|
||||
}
|
||||
|
||||
@@ -190,10 +172,8 @@ public class DefaultRefreshTokenTokenResponseClientTests {
|
||||
public void getTokenResponseWhenErrorResponseThenThrowOAuth2AuthorizationException() {
|
||||
String accessTokenErrorResponse = "{\n" + " \"error\": \"unauthorized_client\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenErrorResponse).setResponseCode(400));
|
||||
|
||||
OAuth2RefreshTokenGrantRequest refreshTokenGrantRequest = new OAuth2RefreshTokenGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.accessToken, this.refreshToken);
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(refreshTokenGrantRequest))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class).hasMessageContaining("[unauthorized_client]");
|
||||
}
|
||||
@@ -201,10 +181,8 @@ public class DefaultRefreshTokenTokenResponseClientTests {
|
||||
@Test
|
||||
public void getTokenResponseWhenServerErrorResponseThenThrowOAuth2AuthorizationException() {
|
||||
this.server.enqueue(new MockResponse().setResponseCode(500));
|
||||
|
||||
OAuth2RefreshTokenGrantRequest refreshTokenGrantRequest = new OAuth2RefreshTokenGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.accessToken, this.refreshToken);
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(refreshTokenGrantRequest))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class).hasMessageContaining(
|
||||
"[invalid_token_response] An error occurred while attempting to retrieve the OAuth 2.0 Access Token Response");
|
||||
|
||||
@@ -75,7 +75,6 @@ public class NimbusAuthorizationCodeTokenResponseClientTests {
|
||||
@Test
|
||||
public void getTokenResponseWhenSuccessResponseThenReturnAccessTokenResponse() throws Exception {
|
||||
MockWebServer server = new MockWebServer();
|
||||
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\",\n"
|
||||
+ " \"scope\": \"openid profile\",\n" + " \"refresh_token\": \"refresh-token-1234\",\n"
|
||||
@@ -84,20 +83,14 @@ public class NimbusAuthorizationCodeTokenResponseClientTests {
|
||||
server.enqueue(new MockResponse().setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
|
||||
.setBody(accessTokenSuccessResponse));
|
||||
server.start();
|
||||
|
||||
String tokenUri = server.url("/oauth2/token").toString();
|
||||
this.clientRegistrationBuilder.tokenUri(tokenUri);
|
||||
|
||||
Instant expiresAtBefore = Instant.now().plusSeconds(3600);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient
|
||||
.getTokenResponse(new OAuth2AuthorizationCodeGrantRequest(this.clientRegistrationBuilder.build(),
|
||||
this.authorizationExchange));
|
||||
|
||||
Instant expiresAtAfter = Instant.now().plusSeconds(3600);
|
||||
|
||||
server.shutdown();
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenValue()).isEqualTo("access-token-1234");
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenType()).isEqualTo(OAuth2AccessToken.TokenType.BEARER);
|
||||
assertThat(accessTokenResponse.getAccessToken().getExpiresAt()).isBetween(expiresAtBefore, expiresAtAfter);
|
||||
@@ -111,13 +104,11 @@ public class NimbusAuthorizationCodeTokenResponseClientTests {
|
||||
@Test
|
||||
public void getTokenResponseWhenRedirectUriMalformedThenThrowIllegalArgumentException() {
|
||||
this.exception.expect(IllegalArgumentException.class);
|
||||
|
||||
String redirectUri = "http:\\example.com";
|
||||
OAuth2AuthorizationRequest authorizationRequest = TestOAuth2AuthorizationRequests.request()
|
||||
.redirectUri(redirectUri).build();
|
||||
OAuth2AuthorizationExchange authorizationExchange = new OAuth2AuthorizationExchange(authorizationRequest,
|
||||
this.authorizationResponse);
|
||||
|
||||
this.tokenResponseClient.getTokenResponse(
|
||||
new OAuth2AuthorizationCodeGrantRequest(this.clientRegistrationBuilder.build(), authorizationExchange));
|
||||
}
|
||||
@@ -125,10 +116,8 @@ public class NimbusAuthorizationCodeTokenResponseClientTests {
|
||||
@Test
|
||||
public void getTokenResponseWhenTokenUriMalformedThenThrowIllegalArgumentException() {
|
||||
this.exception.expect(IllegalArgumentException.class);
|
||||
|
||||
String tokenUri = "http:\\provider.com\\oauth2\\token";
|
||||
this.clientRegistrationBuilder.tokenUri(tokenUri);
|
||||
|
||||
this.tokenResponseClient.getTokenResponse(new OAuth2AuthorizationCodeGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.authorizationExchange));
|
||||
}
|
||||
@@ -137,22 +126,17 @@ public class NimbusAuthorizationCodeTokenResponseClientTests {
|
||||
public void getTokenResponseWhenSuccessResponseInvalidThenThrowOAuth2AuthorizationException() throws Exception {
|
||||
this.exception.expect(OAuth2AuthorizationException.class);
|
||||
this.exception.expectMessage(containsString("invalid_token_response"));
|
||||
|
||||
MockWebServer server = new MockWebServer();
|
||||
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\",\n"
|
||||
+ " \"scope\": \"openid profile\",\n" + " \"custom_parameter_1\": \"custom-value-1\",\n"
|
||||
+ " \"custom_parameter_2\": \"custom-value-2\"\n";
|
||||
// "}\n"; // Make the JSON invalid/malformed
|
||||
|
||||
server.enqueue(new MockResponse().setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
|
||||
.setBody(accessTokenSuccessResponse));
|
||||
server.start();
|
||||
|
||||
String tokenUri = server.url("/oauth2/token").toString();
|
||||
this.clientRegistrationBuilder.tokenUri(tokenUri);
|
||||
|
||||
try {
|
||||
this.tokenResponseClient.getTokenResponse(new OAuth2AuthorizationCodeGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.authorizationExchange));
|
||||
@@ -165,10 +149,8 @@ public class NimbusAuthorizationCodeTokenResponseClientTests {
|
||||
@Test
|
||||
public void getTokenResponseWhenTokenUriInvalidThenThrowOAuth2AuthorizationException() {
|
||||
this.exception.expect(OAuth2AuthorizationException.class);
|
||||
|
||||
String tokenUri = "https://invalid-provider.com/oauth2/token";
|
||||
this.clientRegistrationBuilder.tokenUri(tokenUri);
|
||||
|
||||
this.tokenResponseClient.getTokenResponse(new OAuth2AuthorizationCodeGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.authorizationExchange));
|
||||
}
|
||||
@@ -177,17 +159,13 @@ public class NimbusAuthorizationCodeTokenResponseClientTests {
|
||||
public void getTokenResponseWhenErrorResponseThenThrowOAuth2AuthorizationException() throws Exception {
|
||||
this.exception.expect(OAuth2AuthorizationException.class);
|
||||
this.exception.expectMessage(containsString("unauthorized_client"));
|
||||
|
||||
MockWebServer server = new MockWebServer();
|
||||
|
||||
String accessTokenErrorResponse = "{\n" + " \"error\": \"unauthorized_client\"\n" + "}\n";
|
||||
server.enqueue(new MockResponse().setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
|
||||
.setResponseCode(500).setBody(accessTokenErrorResponse));
|
||||
server.start();
|
||||
|
||||
String tokenUri = server.url("/oauth2/token").toString();
|
||||
this.clientRegistrationBuilder.tokenUri(tokenUri);
|
||||
|
||||
try {
|
||||
this.tokenResponseClient.getTokenResponse(new OAuth2AuthorizationCodeGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.authorizationExchange));
|
||||
@@ -202,15 +180,11 @@ public class NimbusAuthorizationCodeTokenResponseClientTests {
|
||||
public void getTokenResponseWhenServerErrorResponseThenThrowOAuth2AuthorizationException() throws Exception {
|
||||
this.exception.expect(OAuth2AuthorizationException.class);
|
||||
this.exception.expectMessage(containsString("server_error"));
|
||||
|
||||
MockWebServer server = new MockWebServer();
|
||||
|
||||
server.enqueue(new MockResponse().setResponseCode(500));
|
||||
server.start();
|
||||
|
||||
String tokenUri = server.url("/oauth2/token").toString();
|
||||
this.clientRegistrationBuilder.tokenUri(tokenUri);
|
||||
|
||||
try {
|
||||
this.tokenResponseClient.getTokenResponse(new OAuth2AuthorizationCodeGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.authorizationExchange));
|
||||
@@ -225,19 +199,14 @@ public class NimbusAuthorizationCodeTokenResponseClientTests {
|
||||
throws Exception {
|
||||
this.exception.expect(OAuth2AuthorizationException.class);
|
||||
this.exception.expectMessage(containsString("invalid_token_response"));
|
||||
|
||||
MockWebServer server = new MockWebServer();
|
||||
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"not-bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
|
||||
server.enqueue(new MockResponse().setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
|
||||
.setBody(accessTokenSuccessResponse));
|
||||
server.start();
|
||||
|
||||
String tokenUri = server.url("/oauth2/token").toString();
|
||||
this.clientRegistrationBuilder.tokenUri(tokenUri);
|
||||
|
||||
try {
|
||||
this.tokenResponseClient.getTokenResponse(new OAuth2AuthorizationCodeGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.authorizationExchange));
|
||||
@@ -251,27 +220,21 @@ public class NimbusAuthorizationCodeTokenResponseClientTests {
|
||||
public void getTokenResponseWhenSuccessResponseIncludesScopeThenReturnAccessTokenResponseUsingResponseScope()
|
||||
throws Exception {
|
||||
MockWebServer server = new MockWebServer();
|
||||
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\",\n"
|
||||
+ " \"scope\": \"openid profile\"\n" + "}\n";
|
||||
server.enqueue(new MockResponse().setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
|
||||
.setBody(accessTokenSuccessResponse));
|
||||
server.start();
|
||||
|
||||
String tokenUri = server.url("/oauth2/token").toString();
|
||||
this.clientRegistrationBuilder.tokenUri(tokenUri);
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = TestOAuth2AuthorizationRequests.request()
|
||||
.scope("openid", "profile", "email", "address").build();
|
||||
OAuth2AuthorizationExchange authorizationExchange = new OAuth2AuthorizationExchange(authorizationRequest,
|
||||
this.authorizationResponse);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient.getTokenResponse(
|
||||
new OAuth2AuthorizationCodeGrantRequest(this.clientRegistrationBuilder.build(), authorizationExchange));
|
||||
|
||||
server.shutdown();
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getScopes()).containsExactly("openid", "profile");
|
||||
}
|
||||
|
||||
@@ -279,26 +242,20 @@ public class NimbusAuthorizationCodeTokenResponseClientTests {
|
||||
public void getTokenResponseWhenSuccessResponseDoesNotIncludeScopeThenReturnAccessTokenResponseUsingRequestedScope()
|
||||
throws Exception {
|
||||
MockWebServer server = new MockWebServer();
|
||||
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
server.enqueue(new MockResponse().setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
|
||||
.setBody(accessTokenSuccessResponse));
|
||||
server.start();
|
||||
|
||||
String tokenUri = server.url("/oauth2/token").toString();
|
||||
this.clientRegistrationBuilder.tokenUri(tokenUri);
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = TestOAuth2AuthorizationRequests.request()
|
||||
.scope("openid", "profile", "email", "address").build();
|
||||
OAuth2AuthorizationExchange authorizationExchange = new OAuth2AuthorizationExchange(authorizationRequest,
|
||||
this.authorizationResponse);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient.getTokenResponse(
|
||||
new OAuth2AuthorizationCodeGrantRequest(this.clientRegistrationBuilder.build(), authorizationExchange));
|
||||
|
||||
server.shutdown();
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getScopes()).containsExactly("openid", "profile", "email",
|
||||
"address");
|
||||
}
|
||||
|
||||
@@ -74,19 +74,15 @@ public class OAuth2AuthorizationCodeGrantRequestEntityConverterTests {
|
||||
authorizationResponse);
|
||||
OAuth2AuthorizationCodeGrantRequest authorizationCodeGrantRequest = new OAuth2AuthorizationCodeGrantRequest(
|
||||
clientRegistration, authorizationExchange);
|
||||
|
||||
RequestEntity<?> requestEntity = this.converter.convert(authorizationCodeGrantRequest);
|
||||
|
||||
assertThat(requestEntity.getMethod()).isEqualTo(HttpMethod.POST);
|
||||
assertThat(requestEntity.getUrl().toASCIIString())
|
||||
.isEqualTo(clientRegistration.getProviderDetails().getTokenUri());
|
||||
|
||||
HttpHeaders headers = requestEntity.getHeaders();
|
||||
assertThat(headers.getAccept()).contains(MediaType.APPLICATION_JSON_UTF8);
|
||||
assertThat(headers.getContentType())
|
||||
.isEqualTo(MediaType.valueOf(MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8"));
|
||||
assertThat(headers.getFirst(HttpHeaders.AUTHORIZATION)).startsWith("Basic ");
|
||||
|
||||
MultiValueMap<String, String> formParameters = (MultiValueMap<String, String>) requestEntity.getBody();
|
||||
assertThat(formParameters.getFirst(OAuth2ParameterNames.GRANT_TYPE))
|
||||
.isEqualTo(AuthorizationGrantType.AUTHORIZATION_CODE.getValue());
|
||||
@@ -101,35 +97,27 @@ public class OAuth2AuthorizationCodeGrantRequestEntityConverterTests {
|
||||
public void convertWhenPkceGrantRequestValidThenConverts() {
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.clientAuthenticationMethod(null)
|
||||
.clientSecret(null).build();
|
||||
|
||||
Map<String, Object> attributes = new HashMap<>();
|
||||
attributes.put(PkceParameterNames.CODE_VERIFIER, "code-verifier-1234");
|
||||
|
||||
Map<String, Object> additionalParameters = new HashMap<>();
|
||||
additionalParameters.put(PkceParameterNames.CODE_CHALLENGE, "code-challenge-1234");
|
||||
additionalParameters.put(PkceParameterNames.CODE_CHALLENGE_METHOD, "S256");
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.authorizationRequestBuilder.attributes(attributes)
|
||||
.additionalParameters(additionalParameters).build();
|
||||
|
||||
OAuth2AuthorizationResponse authorizationResponse = this.authorizationResponseBuilder.build();
|
||||
OAuth2AuthorizationExchange authorizationExchange = new OAuth2AuthorizationExchange(authorizationRequest,
|
||||
authorizationResponse);
|
||||
OAuth2AuthorizationCodeGrantRequest authorizationCodeGrantRequest = new OAuth2AuthorizationCodeGrantRequest(
|
||||
clientRegistration, authorizationExchange);
|
||||
|
||||
RequestEntity<?> requestEntity = this.converter.convert(authorizationCodeGrantRequest);
|
||||
|
||||
assertThat(requestEntity.getMethod()).isEqualTo(HttpMethod.POST);
|
||||
assertThat(requestEntity.getUrl().toASCIIString())
|
||||
.isEqualTo(clientRegistration.getProviderDetails().getTokenUri());
|
||||
|
||||
HttpHeaders headers = requestEntity.getHeaders();
|
||||
assertThat(headers.getAccept()).contains(MediaType.APPLICATION_JSON_UTF8);
|
||||
assertThat(headers.getContentType())
|
||||
.isEqualTo(MediaType.valueOf(MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8"));
|
||||
assertThat(headers.getFirst(HttpHeaders.AUTHORIZATION)).isNull();
|
||||
|
||||
MultiValueMap<String, String> formParameters = (MultiValueMap<String, String>) requestEntity.getBody();
|
||||
assertThat(formParameters.getFirst(OAuth2ParameterNames.GRANT_TYPE))
|
||||
.isEqualTo(AuthorizationGrantType.AUTHORIZATION_CODE.getValue());
|
||||
|
||||
@@ -58,7 +58,6 @@ public class OAuth2AuthorizationCodeGrantRequestTests {
|
||||
public void constructorWhenAllParametersProvidedAndValidThenCreated() {
|
||||
OAuth2AuthorizationCodeGrantRequest authorizationCodeGrantRequest = new OAuth2AuthorizationCodeGrantRequest(
|
||||
this.clientRegistration, this.authorizationExchange);
|
||||
|
||||
assertThat(authorizationCodeGrantRequest.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationCodeGrantRequest.getAuthorizationExchange()).isEqualTo(this.authorizationExchange);
|
||||
assertThat(authorizationCodeGrantRequest.getGrantType()).isEqualTo(AuthorizationGrantType.AUTHORIZATION_CODE);
|
||||
|
||||
@@ -56,19 +56,15 @@ public class OAuth2ClientCredentialsGrantRequestEntityConverterTests {
|
||||
@Test
|
||||
public void convertWhenGrantRequestValidThenConverts() {
|
||||
RequestEntity<?> requestEntity = this.converter.convert(this.clientCredentialsGrantRequest);
|
||||
|
||||
ClientRegistration clientRegistration = this.clientCredentialsGrantRequest.getClientRegistration();
|
||||
|
||||
assertThat(requestEntity.getMethod()).isEqualTo(HttpMethod.POST);
|
||||
assertThat(requestEntity.getUrl().toASCIIString())
|
||||
.isEqualTo(clientRegistration.getProviderDetails().getTokenUri());
|
||||
|
||||
HttpHeaders headers = requestEntity.getHeaders();
|
||||
assertThat(headers.getAccept()).contains(MediaType.APPLICATION_JSON_UTF8);
|
||||
assertThat(headers.getContentType())
|
||||
.isEqualTo(MediaType.valueOf(MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8"));
|
||||
assertThat(headers.getFirst(HttpHeaders.AUTHORIZATION)).startsWith("Basic ");
|
||||
|
||||
MultiValueMap<String, String> formParameters = (MultiValueMap<String, String>) requestEntity.getBody();
|
||||
assertThat(formParameters.getFirst(OAuth2ParameterNames.GRANT_TYPE))
|
||||
.isEqualTo(AuthorizationGrantType.CLIENT_CREDENTIALS.getValue());
|
||||
|
||||
@@ -55,7 +55,6 @@ public class OAuth2ClientCredentialsGrantRequestTests {
|
||||
.clientId("client-1").authorizationGrantType(AuthorizationGrantType.IMPLICIT)
|
||||
.redirectUri("https://localhost:8080/redirect-uri").authorizationUri("https://provider.com/oauth2/auth")
|
||||
.clientName("Client 1").build();
|
||||
|
||||
assertThatThrownBy(() -> new OAuth2ClientCredentialsGrantRequest(clientRegistration))
|
||||
.isInstanceOf(IllegalArgumentException.class).hasMessage(
|
||||
"clientRegistration.authorizationGrantType must be AuthorizationGrantType.CLIENT_CREDENTIALS");
|
||||
@@ -65,7 +64,6 @@ public class OAuth2ClientCredentialsGrantRequestTests {
|
||||
public void constructorWhenValidParametersProvidedThenCreated() {
|
||||
OAuth2ClientCredentialsGrantRequest clientCredentialsGrantRequest = new OAuth2ClientCredentialsGrantRequest(
|
||||
this.clientRegistration);
|
||||
|
||||
assertThat(clientCredentialsGrantRequest.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(clientCredentialsGrantRequest.getGrantType()).isEqualTo(AuthorizationGrantType.CLIENT_CREDENTIALS);
|
||||
}
|
||||
|
||||
@@ -53,19 +53,15 @@ public class OAuth2PasswordGrantRequestEntityConverterTests {
|
||||
@Test
|
||||
public void convertWhenGrantRequestValidThenConverts() {
|
||||
RequestEntity<?> requestEntity = this.converter.convert(this.passwordGrantRequest);
|
||||
|
||||
ClientRegistration clientRegistration = this.passwordGrantRequest.getClientRegistration();
|
||||
|
||||
assertThat(requestEntity.getMethod()).isEqualTo(HttpMethod.POST);
|
||||
assertThat(requestEntity.getUrl().toASCIIString())
|
||||
.isEqualTo(clientRegistration.getProviderDetails().getTokenUri());
|
||||
|
||||
HttpHeaders headers = requestEntity.getHeaders();
|
||||
assertThat(headers.getAccept()).contains(MediaType.APPLICATION_JSON_UTF8);
|
||||
assertThat(headers.getContentType())
|
||||
.isEqualTo(MediaType.valueOf(MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8"));
|
||||
assertThat(headers.getFirst(HttpHeaders.AUTHORIZATION)).startsWith("Basic ");
|
||||
|
||||
MultiValueMap<String, String> formParameters = (MultiValueMap<String, String>) requestEntity.getBody();
|
||||
assertThat(formParameters.getFirst(OAuth2ParameterNames.GRANT_TYPE))
|
||||
.isEqualTo(AuthorizationGrantType.PASSWORD.getValue());
|
||||
|
||||
@@ -58,20 +58,16 @@ public class OAuth2RefreshTokenGrantRequestEntityConverterTests {
|
||||
@Test
|
||||
public void convertWhenGrantRequestValidThenConverts() {
|
||||
RequestEntity<?> requestEntity = this.converter.convert(this.refreshTokenGrantRequest);
|
||||
|
||||
ClientRegistration clientRegistration = this.refreshTokenGrantRequest.getClientRegistration();
|
||||
OAuth2RefreshToken refreshToken = this.refreshTokenGrantRequest.getRefreshToken();
|
||||
|
||||
assertThat(requestEntity.getMethod()).isEqualTo(HttpMethod.POST);
|
||||
assertThat(requestEntity.getUrl().toASCIIString())
|
||||
.isEqualTo(clientRegistration.getProviderDetails().getTokenUri());
|
||||
|
||||
HttpHeaders headers = requestEntity.getHeaders();
|
||||
assertThat(headers.getAccept()).contains(MediaType.APPLICATION_JSON_UTF8);
|
||||
assertThat(headers.getContentType())
|
||||
.isEqualTo(MediaType.valueOf(MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8"));
|
||||
assertThat(headers.getFirst(HttpHeaders.AUTHORIZATION)).startsWith("Basic ");
|
||||
|
||||
MultiValueMap<String, String> formParameters = (MultiValueMap<String, String>) requestEntity.getBody();
|
||||
assertThat(formParameters.getFirst(OAuth2ParameterNames.GRANT_TYPE))
|
||||
.isEqualTo(AuthorizationGrantType.REFRESH_TOKEN.getValue());
|
||||
|
||||
@@ -63,9 +63,7 @@ public class WebClientReactiveAuthorizationCodeTokenResponseClientTests {
|
||||
public void setup() throws Exception {
|
||||
this.server = new MockWebServer();
|
||||
this.server.start();
|
||||
|
||||
String tokenUri = this.server.url("/oauth2/token").toString();
|
||||
|
||||
this.clientRegistration = TestClientRegistrations.clientRegistration().tokenUri(tokenUri);
|
||||
}
|
||||
|
||||
@@ -82,18 +80,13 @@ public class WebClientReactiveAuthorizationCodeTokenResponseClientTests {
|
||||
+ " \"custom_parameter_1\": \"custom-value-1\",\n" + " \"custom_parameter_2\": \"custom-value-2\"\n"
|
||||
+ "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
Instant expiresAtBefore = Instant.now().plusSeconds(3600);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient
|
||||
.getTokenResponse(authorizationCodeGrantRequest()).block();
|
||||
String body = this.server.takeRequest().getBody().readUtf8();
|
||||
|
||||
assertThat(body).isEqualTo(
|
||||
"grant_type=authorization_code&code=code&redirect_uri=%7BbaseUrl%7D%2F%7Baction%7D%2Foauth2%2Fcode%2F%7BregistrationId%7D");
|
||||
|
||||
Instant expiresAtAfter = Instant.now().plusSeconds(3600);
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenValue()).isEqualTo("access-token-1234");
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenType()).isEqualTo(OAuth2AccessToken.TokenType.BEARER);
|
||||
assertThat(accessTokenResponse.getAccessToken().getExpiresAt()).isBetween(expiresAtBefore, expiresAtAfter);
|
||||
@@ -184,10 +177,8 @@ public class WebClientReactiveAuthorizationCodeTokenResponseClientTests {
|
||||
@Test
|
||||
public void getTokenResponseWhenErrorResponseThenThrowOAuth2AuthorizationException() {
|
||||
String accessTokenErrorResponse = "{\n" + " \"error\": \"unauthorized_client\"\n" + "}\n";
|
||||
|
||||
this.server.enqueue(
|
||||
jsonResponse(accessTokenErrorResponse).setResponseCode(HttpStatus.INTERNAL_SERVER_ERROR.value()));
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(authorizationCodeGrantRequest()).block())
|
||||
.isInstanceOfSatisfying(OAuth2AuthorizationException.class,
|
||||
(e) -> assertThat(e.getError().getErrorCode()).isEqualTo("unauthorized_client"))
|
||||
@@ -200,7 +191,6 @@ public class WebClientReactiveAuthorizationCodeTokenResponseClientTests {
|
||||
String accessTokenErrorResponse = "{}";
|
||||
this.server.enqueue(
|
||||
jsonResponse(accessTokenErrorResponse).setResponseCode(HttpStatus.INTERNAL_SERVER_ERROR.value()));
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(authorizationCodeGrantRequest()).block())
|
||||
.isInstanceOf(OAuth2AuthorizationException.class).hasMessageContaining("server_error");
|
||||
}
|
||||
@@ -209,9 +199,7 @@ public class WebClientReactiveAuthorizationCodeTokenResponseClientTests {
|
||||
public void getTokenResponseWhenSuccessResponseAndNotBearerTokenTypeThenThrowOAuth2AuthorizationException() {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"not-bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(authorizationCodeGrantRequest()).block())
|
||||
.isInstanceOf(OAuth2AuthorizationException.class).hasMessageContaining("invalid_token_response");
|
||||
}
|
||||
@@ -222,12 +210,9 @@ public class WebClientReactiveAuthorizationCodeTokenResponseClientTests {
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\",\n"
|
||||
+ " \"scope\": \"openid profile\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
this.clientRegistration.scope("openid", "profile", "email", "address");
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient
|
||||
.getTokenResponse(authorizationCodeGrantRequest()).block();
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getScopes()).containsExactly("openid", "profile");
|
||||
}
|
||||
|
||||
@@ -236,12 +221,9 @@ public class WebClientReactiveAuthorizationCodeTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
this.clientRegistration.scope("openid", "profile", "email", "address");
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient
|
||||
.getTokenResponse(authorizationCodeGrantRequest()).block();
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getScopes()).containsExactly("openid", "profile", "email",
|
||||
"address");
|
||||
}
|
||||
@@ -272,19 +254,14 @@ public class WebClientReactiveAuthorizationCodeTokenResponseClientTests {
|
||||
public void setCustomWebClientThenCustomWebClientIsUsed() {
|
||||
WebClient customClient = mock(WebClient.class);
|
||||
given(customClient.post()).willReturn(WebClient.builder().build().post());
|
||||
|
||||
this.tokenResponseClient.setWebClient(customClient);
|
||||
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\",\n"
|
||||
+ " \"scope\": \"openid profile\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
this.clientRegistration.scope("openid", "profile", "email", "address");
|
||||
|
||||
OAuth2AccessTokenResponse response = this.tokenResponseClient.getTokenResponse(authorizationCodeGrantRequest())
|
||||
.block();
|
||||
|
||||
verify(customClient, atLeastOnce()).post();
|
||||
}
|
||||
|
||||
@@ -294,10 +271,8 @@ public class WebClientReactiveAuthorizationCodeTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
this.tokenResponseClient.getTokenResponse(pkceAuthorizationCodeGrantRequest()).block();
|
||||
String body = this.server.takeRequest().getBody().readUtf8();
|
||||
|
||||
assertThat(body).isEqualTo(
|
||||
"grant_type=authorization_code&client_id=client-id&code=code&redirect_uri=%7BbaseUrl%7D%2F%7Baction%7D%2Foauth2%2Fcode%2F%7BregistrationId%7D&code_verifier=code-verifier-1234");
|
||||
}
|
||||
@@ -305,14 +280,11 @@ public class WebClientReactiveAuthorizationCodeTokenResponseClientTests {
|
||||
private OAuth2AuthorizationCodeGrantRequest pkceAuthorizationCodeGrantRequest() {
|
||||
ClientRegistration registration = this.clientRegistration.clientAuthenticationMethod(null).clientSecret(null)
|
||||
.build();
|
||||
|
||||
Map<String, Object> attributes = new HashMap<>();
|
||||
attributes.put(PkceParameterNames.CODE_VERIFIER, "code-verifier-1234");
|
||||
|
||||
Map<String, Object> additionalParameters = new HashMap<>();
|
||||
additionalParameters.put(PkceParameterNames.CODE_CHALLENGE, "code-challenge-1234");
|
||||
additionalParameters.put(PkceParameterNames.CODE_CHALLENGE_METHOD, "S256");
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = OAuth2AuthorizationRequest.authorizationCode()
|
||||
.clientId(registration.getClientId()).state("state")
|
||||
.authorizationUri(registration.getProviderDetails().getAuthorizationUri())
|
||||
|
||||
@@ -56,7 +56,6 @@ public class WebClientReactiveClientCredentialsTokenResponseClientTests {
|
||||
public void setup() throws Exception {
|
||||
this.server = new MockWebServer();
|
||||
this.server.start();
|
||||
|
||||
this.clientRegistration = TestClientRegistrations.clientCredentials()
|
||||
.tokenUri(this.server.url("/oauth2/token").uri().toASCIIString());
|
||||
}
|
||||
@@ -74,11 +73,9 @@ public class WebClientReactiveClientCredentialsTokenResponseClientTests {
|
||||
+ " \"refresh_token\":\"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk\",\n" + " \"scope\":\"create\"\n" + "}");
|
||||
OAuth2ClientCredentialsGrantRequest request = new OAuth2ClientCredentialsGrantRequest(
|
||||
this.clientRegistration.build());
|
||||
|
||||
OAuth2AccessTokenResponse response = this.client.getTokenResponse(request).block();
|
||||
RecordedRequest actualRequest = this.server.takeRequest();
|
||||
String body = actualRequest.getUtf8Body();
|
||||
|
||||
assertThat(response.getAccessToken()).isNotNull();
|
||||
assertThat(actualRequest.getHeader(HttpHeaders.AUTHORIZATION))
|
||||
.isEqualTo("Basic Y2xpZW50LWlkOmNsaWVudC1zZWNyZXQ=");
|
||||
@@ -92,13 +89,10 @@ public class WebClientReactiveClientCredentialsTokenResponseClientTests {
|
||||
enqueueJson("{\n" + " \"access_token\":\"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3\",\n"
|
||||
+ " \"token_type\":\"bearer\",\n" + " \"expires_in\":3600,\n"
|
||||
+ " \"refresh_token\":\"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk\",\n" + " \"scope\":\"create\"\n" + "}");
|
||||
|
||||
OAuth2ClientCredentialsGrantRequest request = new OAuth2ClientCredentialsGrantRequest(registration);
|
||||
|
||||
OAuth2AccessTokenResponse response = this.client.getTokenResponse(request).block();
|
||||
RecordedRequest actualRequest = this.server.takeRequest();
|
||||
String body = actualRequest.getUtf8Body();
|
||||
|
||||
assertThat(response.getAccessToken()).isNotNull();
|
||||
assertThat(actualRequest.getHeader(HttpHeaders.AUTHORIZATION)).isNull();
|
||||
assertThat(body).isEqualTo(
|
||||
@@ -112,9 +106,7 @@ public class WebClientReactiveClientCredentialsTokenResponseClientTests {
|
||||
+ " \"token_type\":\"bearer\",\n" + " \"expires_in\":3600,\n"
|
||||
+ " \"refresh_token\":\"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk\"\n" + "}");
|
||||
OAuth2ClientCredentialsGrantRequest request = new OAuth2ClientCredentialsGrantRequest(registration);
|
||||
|
||||
OAuth2AccessTokenResponse response = this.client.getTokenResponse(request).block();
|
||||
|
||||
assertThat(response.getAccessToken().getScopes()).isEqualTo(registration.getScopes());
|
||||
}
|
||||
|
||||
@@ -127,16 +119,13 @@ public class WebClientReactiveClientCredentialsTokenResponseClientTests {
|
||||
public void setWebClientCustomThenCustomClientIsUsed() {
|
||||
WebClient customClient = mock(WebClient.class);
|
||||
given(customClient.post()).willReturn(WebClient.builder().build().post());
|
||||
|
||||
this.client.setWebClient(customClient);
|
||||
ClientRegistration registration = this.clientRegistration.build();
|
||||
enqueueJson("{\n" + " \"access_token\":\"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3\",\n"
|
||||
+ " \"token_type\":\"bearer\",\n" + " \"expires_in\":3600,\n"
|
||||
+ " \"refresh_token\":\"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk\"\n" + "}");
|
||||
OAuth2ClientCredentialsGrantRequest request = new OAuth2ClientCredentialsGrantRequest(registration);
|
||||
|
||||
OAuth2AccessTokenResponse response = this.client.getTokenResponse(request).block();
|
||||
|
||||
verify(customClient, atLeastOnce()).post();
|
||||
}
|
||||
|
||||
@@ -144,15 +133,12 @@ public class WebClientReactiveClientCredentialsTokenResponseClientTests {
|
||||
public void getTokenResponseWhenInvalidResponse() throws WebClientResponseException {
|
||||
ClientRegistration registration = this.clientRegistration.build();
|
||||
enqueueUnexpectedResponse();
|
||||
|
||||
OAuth2ClientCredentialsGrantRequest request = new OAuth2ClientCredentialsGrantRequest(registration);
|
||||
|
||||
assertThatThrownBy(() -> this.client.getTokenResponse(request).block())
|
||||
.isInstanceOfSatisfying(OAuth2AuthorizationException.class,
|
||||
(e) -> assertThat(e.getError().getErrorCode()).isEqualTo("invalid_token_response"))
|
||||
.hasMessageContaining("[invalid_token_response]")
|
||||
.hasMessageContaining("Empty OAuth 2.0 Access Token Response");
|
||||
|
||||
}
|
||||
|
||||
private void enqueueUnexpectedResponse() {
|
||||
|
||||
@@ -85,30 +85,23 @@ public class WebClientReactivePasswordTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
Instant expiresAtBefore = Instant.now().plusSeconds(3600);
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.build();
|
||||
OAuth2PasswordGrantRequest passwordGrantRequest = new OAuth2PasswordGrantRequest(clientRegistration,
|
||||
this.username, this.password);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient.getTokenResponse(passwordGrantRequest)
|
||||
.block();
|
||||
|
||||
Instant expiresAtAfter = Instant.now().plusSeconds(3600);
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
assertThat(recordedRequest.getMethod()).isEqualTo(HttpMethod.POST.toString());
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.ACCEPT)).isEqualTo(MediaType.APPLICATION_JSON_VALUE);
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.CONTENT_TYPE))
|
||||
.isEqualTo(MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8");
|
||||
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("grant_type=password");
|
||||
assertThat(formParameters).contains("username=user1");
|
||||
assertThat(formParameters).contains("password=password");
|
||||
assertThat(formParameters).contains("scope=read+write");
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenValue()).isEqualTo("access-token-1234");
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenType()).isEqualTo(OAuth2AccessToken.TokenType.BEARER);
|
||||
assertThat(accessTokenResponse.getAccessToken().getExpiresAt()).isBetween(expiresAtBefore, expiresAtAfter);
|
||||
@@ -122,17 +115,13 @@ public class WebClientReactivePasswordTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder
|
||||
.clientAuthenticationMethod(ClientAuthenticationMethod.POST).build();
|
||||
OAuth2PasswordGrantRequest passwordGrantRequest = new OAuth2PasswordGrantRequest(clientRegistration,
|
||||
this.username, this.password);
|
||||
|
||||
this.tokenResponseClient.getTokenResponse(passwordGrantRequest).block();
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.AUTHORIZATION)).isNull();
|
||||
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("client_id=client-id");
|
||||
assertThat(formParameters).contains("client_secret=client-secret");
|
||||
@@ -143,10 +132,8 @@ public class WebClientReactivePasswordTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"not-bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
OAuth2PasswordGrantRequest passwordGrantRequest = new OAuth2PasswordGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.username, this.password);
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(passwordGrantRequest).block())
|
||||
.isInstanceOfSatisfying(OAuth2AuthorizationException.class,
|
||||
(e) -> assertThat(e.getError().getErrorCode()).isEqualTo("invalid_token_response"))
|
||||
@@ -161,17 +148,13 @@ public class WebClientReactivePasswordTokenResponseClientTests {
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\",\n" + " \"scope\": \"read\"\n"
|
||||
+ "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
OAuth2PasswordGrantRequest passwordGrantRequest = new OAuth2PasswordGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.username, this.password);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient.getTokenResponse(passwordGrantRequest)
|
||||
.block();
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("scope=read");
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getScopes()).containsExactly("read");
|
||||
}
|
||||
|
||||
@@ -179,10 +162,8 @@ public class WebClientReactivePasswordTokenResponseClientTests {
|
||||
public void getTokenResponseWhenErrorResponseThenThrowOAuth2AuthorizationException() {
|
||||
String accessTokenErrorResponse = "{\n" + " \"error\": \"unauthorized_client\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenErrorResponse).setResponseCode(400));
|
||||
|
||||
OAuth2PasswordGrantRequest passwordGrantRequest = new OAuth2PasswordGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.username, this.password);
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(passwordGrantRequest).block())
|
||||
.isInstanceOfSatisfying(OAuth2AuthorizationException.class,
|
||||
(e) -> assertThat(e.getError().getErrorCode()).isEqualTo("unauthorized_client"))
|
||||
@@ -192,10 +173,8 @@ public class WebClientReactivePasswordTokenResponseClientTests {
|
||||
@Test
|
||||
public void getTokenResponseWhenServerErrorResponseThenThrowOAuth2AuthorizationException() {
|
||||
this.server.enqueue(new MockResponse().setResponseCode(500));
|
||||
|
||||
OAuth2PasswordGrantRequest passwordGrantRequest = new OAuth2PasswordGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.username, this.password);
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(passwordGrantRequest).block())
|
||||
.isInstanceOfSatisfying(OAuth2AuthorizationException.class,
|
||||
(e) -> assertThat(e.getError().getErrorCode()).isEqualTo("invalid_token_response"))
|
||||
|
||||
@@ -91,28 +91,21 @@ public class WebClientReactiveRefreshTokenTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
Instant expiresAtBefore = Instant.now().plusSeconds(3600);
|
||||
|
||||
OAuth2RefreshTokenGrantRequest refreshTokenGrantRequest = new OAuth2RefreshTokenGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.accessToken, this.refreshToken);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient
|
||||
.getTokenResponse(refreshTokenGrantRequest).block();
|
||||
|
||||
Instant expiresAtAfter = Instant.now().plusSeconds(3600);
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
assertThat(recordedRequest.getMethod()).isEqualTo(HttpMethod.POST.toString());
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.ACCEPT)).isEqualTo(MediaType.APPLICATION_JSON_VALUE);
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.CONTENT_TYPE))
|
||||
.isEqualTo(MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8");
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.AUTHORIZATION)).startsWith("Basic ");
|
||||
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("grant_type=refresh_token");
|
||||
assertThat(formParameters).contains("refresh_token=refresh-token");
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenValue()).isEqualTo("access-token-1234");
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenType()).isEqualTo(OAuth2AccessToken.TokenType.BEARER);
|
||||
assertThat(accessTokenResponse.getAccessToken().getExpiresAt()).isBetween(expiresAtBefore, expiresAtAfter);
|
||||
@@ -126,18 +119,13 @@ public class WebClientReactiveRefreshTokenTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder
|
||||
.clientAuthenticationMethod(ClientAuthenticationMethod.POST).build();
|
||||
|
||||
OAuth2RefreshTokenGrantRequest refreshTokenGrantRequest = new OAuth2RefreshTokenGrantRequest(clientRegistration,
|
||||
this.accessToken, this.refreshToken);
|
||||
|
||||
this.tokenResponseClient.getTokenResponse(refreshTokenGrantRequest).block();
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
assertThat(recordedRequest.getHeader(HttpHeaders.AUTHORIZATION)).isNull();
|
||||
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("client_id=client-id");
|
||||
assertThat(formParameters).contains("client_secret=client-secret");
|
||||
@@ -148,10 +136,8 @@ public class WebClientReactiveRefreshTokenTokenResponseClientTests {
|
||||
String accessTokenSuccessResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"not-bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
OAuth2RefreshTokenGrantRequest refreshTokenGrantRequest = new OAuth2RefreshTokenGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.accessToken, this.refreshToken);
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(refreshTokenGrantRequest).block())
|
||||
.isInstanceOf(OAuth2AuthorizationException.class).hasMessageContaining("[invalid_token_response]")
|
||||
.hasMessageContaining("An error occurred parsing the Access Token response")
|
||||
@@ -164,18 +150,14 @@ public class WebClientReactiveRefreshTokenTokenResponseClientTests {
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\",\n" + " \"scope\": \"read\"\n"
|
||||
+ "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenSuccessResponse));
|
||||
|
||||
OAuth2RefreshTokenGrantRequest refreshTokenGrantRequest = new OAuth2RefreshTokenGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.accessToken, this.refreshToken,
|
||||
Collections.singleton("read"));
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.tokenResponseClient
|
||||
.getTokenResponse(refreshTokenGrantRequest).block();
|
||||
|
||||
RecordedRequest recordedRequest = this.server.takeRequest();
|
||||
String formParameters = recordedRequest.getBody().readUtf8();
|
||||
assertThat(formParameters).contains("scope=read");
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getScopes()).containsExactly("read");
|
||||
}
|
||||
|
||||
@@ -183,10 +165,8 @@ public class WebClientReactiveRefreshTokenTokenResponseClientTests {
|
||||
public void getTokenResponseWhenErrorResponseThenThrowOAuth2AuthorizationException() {
|
||||
String accessTokenErrorResponse = "{\n" + " \"error\": \"unauthorized_client\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenErrorResponse).setResponseCode(400));
|
||||
|
||||
OAuth2RefreshTokenGrantRequest refreshTokenGrantRequest = new OAuth2RefreshTokenGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.accessToken, this.refreshToken);
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(refreshTokenGrantRequest).block())
|
||||
.isInstanceOfSatisfying(OAuth2AuthorizationException.class,
|
||||
(e) -> assertThat(e.getError().getErrorCode()).isEqualTo("unauthorized_client"))
|
||||
@@ -196,10 +176,8 @@ public class WebClientReactiveRefreshTokenTokenResponseClientTests {
|
||||
@Test
|
||||
public void getTokenResponseWhenServerErrorResponseThenThrowOAuth2AuthorizationException() {
|
||||
this.server.enqueue(new MockResponse().setResponseCode(500));
|
||||
|
||||
OAuth2RefreshTokenGrantRequest refreshTokenGrantRequest = new OAuth2RefreshTokenGrantRequest(
|
||||
this.clientRegistrationBuilder.build(), this.accessToken, this.refreshToken);
|
||||
|
||||
assertThatThrownBy(() -> this.tokenResponseClient.getTokenResponse(refreshTokenGrantRequest).block())
|
||||
.isInstanceOfSatisfying(OAuth2AuthorizationException.class,
|
||||
(e) -> assertThat(e.getError().getErrorCode()).isEqualTo("invalid_token_response"))
|
||||
|
||||
@@ -38,9 +38,7 @@ public class OAuth2ErrorResponseErrorHandlerTests {
|
||||
public void handleErrorWhenErrorResponseBodyThenHandled() {
|
||||
String errorResponse = "{\n" + " \"error\": \"unauthorized_client\",\n"
|
||||
+ " \"error_description\": \"The client is not authorized\"\n" + "}\n";
|
||||
|
||||
MockClientHttpResponse response = new MockClientHttpResponse(errorResponse.getBytes(), HttpStatus.BAD_REQUEST);
|
||||
|
||||
assertThatThrownBy(() -> this.errorHandler.handleError(response))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class)
|
||||
.hasMessage("[unauthorized_client] The client is not authorized");
|
||||
@@ -49,10 +47,8 @@ public class OAuth2ErrorResponseErrorHandlerTests {
|
||||
@Test
|
||||
public void handleErrorWhenErrorResponseWwwAuthenticateHeaderThenHandled() {
|
||||
String wwwAuthenticateHeader = "Bearer realm=\"auth-realm\" error=\"insufficient_scope\" error_description=\"The access token expired\"";
|
||||
|
||||
MockClientHttpResponse response = new MockClientHttpResponse(new byte[0], HttpStatus.BAD_REQUEST);
|
||||
response.getHeaders().add(HttpHeaders.WWW_AUTHENTICATE, wwwAuthenticateHeader);
|
||||
|
||||
assertThatThrownBy(() -> this.errorHandler.handleError(response))
|
||||
.isInstanceOf(OAuth2AuthorizationException.class)
|
||||
.hasMessage("[insufficient_scope] The access token expired");
|
||||
|
||||
@@ -51,7 +51,6 @@ public class OAuth2AuthenticationExceptionMixinTests {
|
||||
OAuth2AuthenticationException exception = new OAuth2AuthenticationException(
|
||||
new OAuth2Error("[authorization_request_not_found]", "Authorization Request Not Found", "/foo/bar"),
|
||||
"Authorization Request Not Found");
|
||||
|
||||
String serializedJson = this.mapper.writeValueAsString(exception);
|
||||
String expected = asJson(exception);
|
||||
JSONAssert.assertEquals(expected, serializedJson, true);
|
||||
@@ -61,7 +60,6 @@ public class OAuth2AuthenticationExceptionMixinTests {
|
||||
public void serializeWhenRequiredAttributesOnlyThenSerializes() throws Exception {
|
||||
OAuth2AuthenticationException exception = new OAuth2AuthenticationException(
|
||||
new OAuth2Error("[authorization_request_not_found]"));
|
||||
|
||||
String serializedJson = this.mapper.writeValueAsString(exception);
|
||||
String expected = asJson(exception);
|
||||
JSONAssert.assertEquals(expected, serializedJson, true);
|
||||
@@ -79,13 +77,11 @@ public class OAuth2AuthenticationExceptionMixinTests {
|
||||
OAuth2AuthenticationException expected = new OAuth2AuthenticationException(
|
||||
new OAuth2Error("[authorization_request_not_found]", "Authorization Request Not Found", "/foo/bar"),
|
||||
"Authorization Request Not Found");
|
||||
|
||||
OAuth2AuthenticationException exception = this.mapper.readValue(asJson(expected),
|
||||
OAuth2AuthenticationException.class);
|
||||
assertThat(exception).isNotNull();
|
||||
assertThat(exception.getCause()).isNull();
|
||||
assertThat(exception.getMessage()).isEqualTo(expected.getMessage());
|
||||
|
||||
OAuth2Error oauth2Error = exception.getError();
|
||||
assertThat(oauth2Error).isNotNull();
|
||||
assertThat(oauth2Error.getErrorCode()).isEqualTo(expected.getError().getErrorCode());
|
||||
@@ -97,13 +93,11 @@ public class OAuth2AuthenticationExceptionMixinTests {
|
||||
public void deserializeWhenRequiredAttributesOnlyThenDeserializes() throws Exception {
|
||||
OAuth2AuthenticationException expected = new OAuth2AuthenticationException(
|
||||
new OAuth2Error("[authorization_request_not_found]"));
|
||||
|
||||
OAuth2AuthenticationException exception = this.mapper.readValue(asJson(expected),
|
||||
OAuth2AuthenticationException.class);
|
||||
assertThat(exception).isNotNull();
|
||||
assertThat(exception.getCause()).isNull();
|
||||
assertThat(exception.getMessage()).isNull();
|
||||
|
||||
OAuth2Error oauth2Error = exception.getError();
|
||||
assertThat(oauth2Error).isNotNull();
|
||||
assertThat(oauth2Error.getErrorCode()).isEqualTo(expected.getError().getErrorCode());
|
||||
|
||||
@@ -73,7 +73,6 @@ public class OAuth2AuthenticationTokenMixinTests {
|
||||
String expectedJson = asJson(authentication);
|
||||
String json = this.mapper.writeValueAsString(authentication);
|
||||
JSONAssert.assertEquals(expectedJson, json, true);
|
||||
|
||||
// OAuth2User
|
||||
authentication = TestOAuth2AuthenticationTokens.authenticated();
|
||||
expectedJson = asJson(authentication);
|
||||
@@ -125,7 +124,6 @@ public class OAuth2AuthenticationTokenMixinTests {
|
||||
OidcUserInfo expectedUserInfo = expectedOidcUser.getUserInfo();
|
||||
OidcUserInfo userInfo = oidcUser.getUserInfo();
|
||||
assertThat(userInfo.getClaims()).containsExactlyEntriesOf(expectedUserInfo.getClaims());
|
||||
|
||||
// OAuth2User
|
||||
expectedAuthentication = TestOAuth2AuthenticationTokens.authenticated();
|
||||
json = asJson(expectedAuthentication);
|
||||
|
||||
@@ -127,7 +127,6 @@ public class OidcAuthorizationCodeAuthenticationProviderTests {
|
||||
this.userService = mock(OAuth2UserService.class);
|
||||
this.authenticationProvider = new OidcAuthorizationCodeAuthenticationProvider(this.accessTokenResponseClient,
|
||||
this.userService);
|
||||
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(this.accessTokenResponse);
|
||||
}
|
||||
|
||||
@@ -166,10 +165,8 @@ public class OidcAuthorizationCodeAuthenticationProviderTests {
|
||||
.build();
|
||||
OAuth2AuthorizationExchange authorizationExchange = new OAuth2AuthorizationExchange(authorizationRequest,
|
||||
this.authorizationResponse);
|
||||
|
||||
OAuth2LoginAuthenticationToken authentication = (OAuth2LoginAuthenticationToken) this.authenticationProvider
|
||||
.authenticate(new OAuth2LoginAuthenticationToken(this.clientRegistration, authorizationExchange));
|
||||
|
||||
assertThat(authentication).isNull();
|
||||
}
|
||||
|
||||
@@ -177,12 +174,10 @@ public class OidcAuthorizationCodeAuthenticationProviderTests {
|
||||
public void authenticateWhenAuthorizationErrorResponseThenThrowOAuth2AuthenticationException() {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString(OAuth2ErrorCodes.INVALID_SCOPE));
|
||||
|
||||
OAuth2AuthorizationResponse authorizationResponse = TestOAuth2AuthorizationResponses.error()
|
||||
.errorCode(OAuth2ErrorCodes.INVALID_SCOPE).build();
|
||||
OAuth2AuthorizationExchange authorizationExchange = new OAuth2AuthorizationExchange(this.authorizationRequest,
|
||||
authorizationResponse);
|
||||
|
||||
this.authenticationProvider
|
||||
.authenticate(new OAuth2LoginAuthenticationToken(this.clientRegistration, authorizationExchange));
|
||||
}
|
||||
@@ -191,12 +186,10 @@ public class OidcAuthorizationCodeAuthenticationProviderTests {
|
||||
public void authenticateWhenAuthorizationResponseStateNotEqualAuthorizationRequestStateThenThrowOAuth2AuthenticationException() {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString("invalid_state_parameter"));
|
||||
|
||||
OAuth2AuthorizationResponse authorizationResponse = TestOAuth2AuthorizationResponses.success().state("89012")
|
||||
.build();
|
||||
OAuth2AuthorizationExchange authorizationExchange = new OAuth2AuthorizationExchange(this.authorizationRequest,
|
||||
authorizationResponse);
|
||||
|
||||
this.authenticationProvider
|
||||
.authenticate(new OAuth2LoginAuthenticationToken(this.clientRegistration, authorizationExchange));
|
||||
}
|
||||
@@ -205,11 +198,9 @@ public class OidcAuthorizationCodeAuthenticationProviderTests {
|
||||
public void authenticateWhenTokenResponseDoesNotContainIdTokenThenThrowOAuth2AuthenticationException() {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString("invalid_id_token"));
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = OAuth2AccessTokenResponse
|
||||
.withResponse(this.accessTokenSuccessResponse()).additionalParameters(Collections.emptyMap()).build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse);
|
||||
|
||||
this.authenticationProvider
|
||||
.authenticate(new OAuth2LoginAuthenticationToken(this.clientRegistration, this.authorizationExchange));
|
||||
}
|
||||
@@ -218,9 +209,7 @@ public class OidcAuthorizationCodeAuthenticationProviderTests {
|
||||
public void authenticateWhenJwkSetUriNotSetThenThrowOAuth2AuthenticationException() {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString("missing_signature_verifier"));
|
||||
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientRegistration().jwkSetUri(null).build();
|
||||
|
||||
this.authenticationProvider
|
||||
.authenticate(new OAuth2LoginAuthenticationToken(clientRegistration, this.authorizationExchange));
|
||||
}
|
||||
@@ -229,11 +218,9 @@ public class OidcAuthorizationCodeAuthenticationProviderTests {
|
||||
public void authenticateWhenIdTokenValidationErrorThenThrowOAuth2AuthenticationException() {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString("[invalid_id_token] ID Token Validation Error"));
|
||||
|
||||
JwtDecoder jwtDecoder = mock(JwtDecoder.class);
|
||||
given(jwtDecoder.decode(anyString())).willThrow(new JwtException("ID Token Validation Error"));
|
||||
this.authenticationProvider.setJwtDecoderFactory((registration) -> jwtDecoder);
|
||||
|
||||
this.authenticationProvider
|
||||
.authenticate(new OAuth2LoginAuthenticationToken(this.clientRegistration, this.authorizationExchange));
|
||||
}
|
||||
@@ -242,7 +229,6 @@ public class OidcAuthorizationCodeAuthenticationProviderTests {
|
||||
public void authenticateWhenIdTokenInvalidNonceThenThrowOAuth2AuthenticationException() {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString("[invalid_nonce]"));
|
||||
|
||||
Map<String, Object> claims = new HashMap<>();
|
||||
claims.put(IdTokenClaimNames.ISS, "https://provider.com");
|
||||
claims.put(IdTokenClaimNames.SUB, "subject1");
|
||||
@@ -250,7 +236,6 @@ public class OidcAuthorizationCodeAuthenticationProviderTests {
|
||||
claims.put(IdTokenClaimNames.AZP, "client1");
|
||||
claims.put(IdTokenClaimNames.NONCE, "invalid-nonce-hash");
|
||||
this.setUpIdToken(claims);
|
||||
|
||||
this.authenticationProvider
|
||||
.authenticate(new OAuth2LoginAuthenticationToken(this.clientRegistration, this.authorizationExchange));
|
||||
}
|
||||
@@ -264,15 +249,12 @@ public class OidcAuthorizationCodeAuthenticationProviderTests {
|
||||
claims.put(IdTokenClaimNames.AZP, "client1");
|
||||
claims.put(IdTokenClaimNames.NONCE, this.nonceHash);
|
||||
this.setUpIdToken(claims);
|
||||
|
||||
OidcUser principal = mock(OidcUser.class);
|
||||
List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("ROLE_USER");
|
||||
given(principal.getAuthorities()).willAnswer((Answer<List<GrantedAuthority>>) (invocation) -> authorities);
|
||||
given(this.userService.loadUser(any())).willReturn(principal);
|
||||
|
||||
OAuth2LoginAuthenticationToken authentication = (OAuth2LoginAuthenticationToken) this.authenticationProvider
|
||||
.authenticate(new OAuth2LoginAuthenticationToken(this.clientRegistration, this.authorizationExchange));
|
||||
|
||||
assertThat(authentication.isAuthenticated()).isTrue();
|
||||
assertThat(authentication.getPrincipal()).isEqualTo(principal);
|
||||
assertThat(authentication.getCredentials()).isEqualTo("");
|
||||
@@ -292,21 +274,17 @@ public class OidcAuthorizationCodeAuthenticationProviderTests {
|
||||
claims.put(IdTokenClaimNames.AZP, "client1");
|
||||
claims.put(IdTokenClaimNames.NONCE, this.nonceHash);
|
||||
this.setUpIdToken(claims);
|
||||
|
||||
OidcUser principal = mock(OidcUser.class);
|
||||
List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("ROLE_USER");
|
||||
given(principal.getAuthorities()).willAnswer((Answer<List<GrantedAuthority>>) (invocation) -> authorities);
|
||||
given(this.userService.loadUser(any())).willReturn(principal);
|
||||
|
||||
List<GrantedAuthority> mappedAuthorities = AuthorityUtils.createAuthorityList("ROLE_OIDC_USER");
|
||||
GrantedAuthoritiesMapper authoritiesMapper = mock(GrantedAuthoritiesMapper.class);
|
||||
given(authoritiesMapper.mapAuthorities(anyCollection()))
|
||||
.willAnswer((Answer<List<GrantedAuthority>>) (invocation) -> mappedAuthorities);
|
||||
this.authenticationProvider.setAuthoritiesMapper(authoritiesMapper);
|
||||
|
||||
OAuth2LoginAuthenticationToken authentication = (OAuth2LoginAuthenticationToken) this.authenticationProvider
|
||||
.authenticate(new OAuth2LoginAuthenticationToken(this.clientRegistration, this.authorizationExchange));
|
||||
|
||||
assertThat(authentication.getAuthorities()).isEqualTo(mappedAuthorities);
|
||||
}
|
||||
|
||||
@@ -320,16 +298,13 @@ public class OidcAuthorizationCodeAuthenticationProviderTests {
|
||||
claims.put(IdTokenClaimNames.AZP, "client1");
|
||||
claims.put(IdTokenClaimNames.NONCE, this.nonceHash);
|
||||
this.setUpIdToken(claims);
|
||||
|
||||
OidcUser principal = mock(OidcUser.class);
|
||||
List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("ROLE_USER");
|
||||
given(principal.getAuthorities()).willAnswer((Answer<List<GrantedAuthority>>) (invocation) -> authorities);
|
||||
ArgumentCaptor<OidcUserRequest> userRequestArgCaptor = ArgumentCaptor.forClass(OidcUserRequest.class);
|
||||
given(this.userService.loadUser(userRequestArgCaptor.capture())).willReturn(principal);
|
||||
|
||||
this.authenticationProvider
|
||||
.authenticate(new OAuth2LoginAuthenticationToken(this.clientRegistration, this.authorizationExchange));
|
||||
|
||||
assertThat(userRequestArgCaptor.getValue().getAdditionalParameters())
|
||||
.containsAllEntriesOf(this.accessTokenResponse.getAdditionalParameters());
|
||||
}
|
||||
@@ -348,11 +323,9 @@ public class OidcAuthorizationCodeAuthenticationProviderTests {
|
||||
additionalParameters.put("param1", "value1");
|
||||
additionalParameters.put("param2", "value2");
|
||||
additionalParameters.put(OidcParameterNames.ID_TOKEN, "id-token");
|
||||
|
||||
return OAuth2AccessTokenResponse.withToken("access-token-1234").tokenType(OAuth2AccessToken.TokenType.BEARER)
|
||||
.expiresIn(expiresAt.getEpochSecond()).scopes(scopes).refreshToken("refresh-token-1234")
|
||||
.additionalParameters(additionalParameters).build();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -139,9 +139,7 @@ public class OidcAuthorizationCodeReactiveAuthenticationManagerTests {
|
||||
// we didn't do anything because it should cause a ClassCastException (as verified
|
||||
// below)
|
||||
TestingAuthenticationToken token = new TestingAuthenticationToken("a", "b");
|
||||
|
||||
assertThatCode(() -> this.manager.authenticate(token)).doesNotThrowAnyException();
|
||||
|
||||
assertThatThrownBy(() -> this.manager.authenticate(token).block()).isInstanceOf(Throwable.class);
|
||||
}
|
||||
|
||||
@@ -172,10 +170,8 @@ public class OidcAuthorizationCodeReactiveAuthenticationManagerTests {
|
||||
Collections.singletonMap(OidcParameterNames.ID_TOKEN, this.idToken.getTokenValue()))
|
||||
.build();
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(accessTokenResponse));
|
||||
|
||||
given(this.jwtDecoder.decode(any())).willThrow(new JwtException("ID Token Validation Error"));
|
||||
this.manager.setJwtDecoderFactory((c) -> this.jwtDecoder);
|
||||
|
||||
assertThatThrownBy(() -> this.manager.authenticate(loginToken()).block())
|
||||
.isInstanceOf(OAuth2AuthenticationException.class)
|
||||
.hasMessageContaining("[invalid_id_token] ID Token Validation Error");
|
||||
@@ -187,20 +183,16 @@ public class OidcAuthorizationCodeReactiveAuthenticationManagerTests {
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).additionalParameters(
|
||||
Collections.singletonMap(OidcParameterNames.ID_TOKEN, this.idToken.getTokenValue()))
|
||||
.build();
|
||||
|
||||
OAuth2AuthorizationCodeAuthenticationToken authorizationCodeAuthentication = loginToken();
|
||||
|
||||
Map<String, Object> claims = new HashMap<>();
|
||||
claims.put(IdTokenClaimNames.ISS, "https://issuer.example.com");
|
||||
claims.put(IdTokenClaimNames.SUB, "sub");
|
||||
claims.put(IdTokenClaimNames.AUD, Arrays.asList("client-id"));
|
||||
claims.put(IdTokenClaimNames.NONCE, "invalid-nonce-hash");
|
||||
Jwt idToken = TestJwts.jwt().claims((c) -> c.putAll(claims)).build();
|
||||
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(accessTokenResponse));
|
||||
given(this.jwtDecoder.decode(any())).willReturn(Mono.just(idToken));
|
||||
this.manager.setJwtDecoderFactory((c) -> this.jwtDecoder);
|
||||
|
||||
assertThatThrownBy(() -> this.manager.authenticate(authorizationCodeAuthentication).block())
|
||||
.isInstanceOf(OAuth2AuthenticationException.class).hasMessageContaining("[invalid_nonce]");
|
||||
}
|
||||
@@ -212,16 +204,13 @@ public class OidcAuthorizationCodeReactiveAuthenticationManagerTests {
|
||||
.additionalParameters(Collections.singletonMap(OidcParameterNames.ID_TOKEN,
|
||||
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ."))
|
||||
.build();
|
||||
|
||||
OAuth2AuthorizationCodeAuthenticationToken authorizationCodeAuthentication = loginToken();
|
||||
|
||||
Map<String, Object> claims = new HashMap<>();
|
||||
claims.put(IdTokenClaimNames.ISS, "https://issuer.example.com");
|
||||
claims.put(IdTokenClaimNames.SUB, "rob");
|
||||
claims.put(IdTokenClaimNames.AUD, Arrays.asList("client-id"));
|
||||
claims.put(IdTokenClaimNames.NONCE, this.nonceHash);
|
||||
Jwt idToken = TestJwts.jwt().claims((c) -> c.putAll(claims)).build();
|
||||
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(accessTokenResponse));
|
||||
given(this.userService.loadUser(any())).willReturn(Mono.empty());
|
||||
given(this.jwtDecoder.decode(any())).willReturn(Mono.just(idToken));
|
||||
@@ -235,25 +224,20 @@ public class OidcAuthorizationCodeReactiveAuthenticationManagerTests {
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).additionalParameters(
|
||||
Collections.singletonMap(OidcParameterNames.ID_TOKEN, this.idToken.getTokenValue()))
|
||||
.build();
|
||||
|
||||
OAuth2AuthorizationCodeAuthenticationToken authorizationCodeAuthentication = loginToken();
|
||||
|
||||
Map<String, Object> claims = new HashMap<>();
|
||||
claims.put(IdTokenClaimNames.ISS, "https://issuer.example.com");
|
||||
claims.put(IdTokenClaimNames.SUB, "rob");
|
||||
claims.put(IdTokenClaimNames.AUD, Arrays.asList("client-id"));
|
||||
claims.put(IdTokenClaimNames.NONCE, this.nonceHash);
|
||||
Jwt idToken = TestJwts.jwt().claims((c) -> c.putAll(claims)).build();
|
||||
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(accessTokenResponse));
|
||||
DefaultOidcUser user = new DefaultOidcUser(AuthorityUtils.createAuthorityList("ROLE_USER"), this.idToken);
|
||||
given(this.userService.loadUser(any())).willReturn(Mono.just(user));
|
||||
given(this.jwtDecoder.decode(any())).willReturn(Mono.just(idToken));
|
||||
this.manager.setJwtDecoderFactory((c) -> this.jwtDecoder);
|
||||
|
||||
OAuth2LoginAuthenticationToken result = (OAuth2LoginAuthenticationToken) this.manager
|
||||
.authenticate(authorizationCodeAuthentication).block();
|
||||
|
||||
assertThat(result.getPrincipal()).isEqualTo(user);
|
||||
assertThat(result.getAuthorities()).containsOnlyElementsOf(user.getAuthorities());
|
||||
assertThat(result.isAuthenticated()).isTrue();
|
||||
@@ -266,25 +250,20 @@ public class OidcAuthorizationCodeReactiveAuthenticationManagerTests {
|
||||
.additionalParameters(
|
||||
Collections.singletonMap(OidcParameterNames.ID_TOKEN, this.idToken.getTokenValue()))
|
||||
.refreshToken("refresh-token").build();
|
||||
|
||||
OAuth2AuthorizationCodeAuthenticationToken authorizationCodeAuthentication = loginToken();
|
||||
|
||||
Map<String, Object> claims = new HashMap<>();
|
||||
claims.put(IdTokenClaimNames.ISS, "https://issuer.example.com");
|
||||
claims.put(IdTokenClaimNames.SUB, "rob");
|
||||
claims.put(IdTokenClaimNames.AUD, Arrays.asList("client-id"));
|
||||
claims.put(IdTokenClaimNames.NONCE, this.nonceHash);
|
||||
Jwt idToken = TestJwts.jwt().claims((c) -> c.putAll(claims)).build();
|
||||
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(accessTokenResponse));
|
||||
DefaultOidcUser user = new DefaultOidcUser(AuthorityUtils.createAuthorityList("ROLE_USER"), this.idToken);
|
||||
given(this.userService.loadUser(any())).willReturn(Mono.just(user));
|
||||
given(this.jwtDecoder.decode(any())).willReturn(Mono.just(idToken));
|
||||
this.manager.setJwtDecoderFactory((c) -> this.jwtDecoder);
|
||||
|
||||
OAuth2LoginAuthenticationToken result = (OAuth2LoginAuthenticationToken) this.manager
|
||||
.authenticate(authorizationCodeAuthentication).block();
|
||||
|
||||
assertThat(result.getPrincipal()).isEqualTo(user);
|
||||
assertThat(result.getAuthorities()).containsOnlyElementsOf(user.getAuthorities());
|
||||
assertThat(result.isAuthenticated()).isTrue();
|
||||
@@ -301,25 +280,20 @@ public class OidcAuthorizationCodeReactiveAuthenticationManagerTests {
|
||||
additionalParameters.put("param2", "value2");
|
||||
OAuth2AccessTokenResponse accessTokenResponse = OAuth2AccessTokenResponse.withToken("foo")
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).additionalParameters(additionalParameters).build();
|
||||
|
||||
OAuth2AuthorizationCodeAuthenticationToken authorizationCodeAuthentication = loginToken();
|
||||
|
||||
Map<String, Object> claims = new HashMap<>();
|
||||
claims.put(IdTokenClaimNames.ISS, "https://issuer.example.com");
|
||||
claims.put(IdTokenClaimNames.SUB, "rob");
|
||||
claims.put(IdTokenClaimNames.AUD, Arrays.asList(clientRegistration.getClientId()));
|
||||
claims.put(IdTokenClaimNames.NONCE, this.nonceHash);
|
||||
Jwt idToken = TestJwts.jwt().claims((c) -> c.putAll(claims)).build();
|
||||
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(accessTokenResponse));
|
||||
DefaultOidcUser user = new DefaultOidcUser(AuthorityUtils.createAuthorityList("ROLE_USER"), this.idToken);
|
||||
ArgumentCaptor<OidcUserRequest> userRequestArgCaptor = ArgumentCaptor.forClass(OidcUserRequest.class);
|
||||
given(this.userService.loadUser(userRequestArgCaptor.capture())).willReturn(Mono.just(user));
|
||||
given(this.jwtDecoder.decode(any())).willReturn(Mono.just(idToken));
|
||||
this.manager.setJwtDecoderFactory((c) -> this.jwtDecoder);
|
||||
|
||||
this.manager.authenticate(authorizationCodeAuthentication).block();
|
||||
|
||||
assertThat(userRequestArgCaptor.getValue().getAdditionalParameters())
|
||||
.containsAllEntriesOf(accessTokenResponse.getAdditionalParameters());
|
||||
}
|
||||
@@ -331,21 +305,17 @@ public class OidcAuthorizationCodeReactiveAuthenticationManagerTests {
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).additionalParameters(
|
||||
Collections.singletonMap(OidcParameterNames.ID_TOKEN, this.idToken.getTokenValue()))
|
||||
.build();
|
||||
|
||||
OAuth2AuthorizationCodeAuthenticationToken authorizationCodeAuthentication = loginToken();
|
||||
|
||||
Map<String, Object> claims = new HashMap<>();
|
||||
claims.put(IdTokenClaimNames.ISS, "https://issuer.example.com");
|
||||
claims.put(IdTokenClaimNames.SUB, "rob");
|
||||
claims.put(IdTokenClaimNames.AUD, Collections.singletonList(clientRegistration.getClientId()));
|
||||
claims.put(IdTokenClaimNames.NONCE, this.nonceHash);
|
||||
Jwt idToken = TestJwts.jwt().claims((c) -> c.putAll(claims)).build();
|
||||
|
||||
given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(accessTokenResponse));
|
||||
DefaultOidcUser user = new DefaultOidcUser(AuthorityUtils.createAuthorityList("ROLE_USER"), this.idToken);
|
||||
ArgumentCaptor<OidcUserRequest> userRequestArgCaptor = ArgumentCaptor.forClass(OidcUserRequest.class);
|
||||
given(this.userService.loadUser(userRequestArgCaptor.capture())).willReturn(Mono.just(user));
|
||||
|
||||
List<GrantedAuthority> mappedAuthorities = AuthorityUtils.createAuthorityList("ROLE_OIDC_USER");
|
||||
GrantedAuthoritiesMapper authoritiesMapper = mock(GrantedAuthoritiesMapper.class);
|
||||
given(authoritiesMapper.mapAuthorities(anyCollection()))
|
||||
@@ -353,9 +323,7 @@ public class OidcAuthorizationCodeReactiveAuthenticationManagerTests {
|
||||
given(this.jwtDecoder.decode(any())).willReturn(Mono.just(idToken));
|
||||
this.manager.setJwtDecoderFactory((c) -> this.jwtDecoder);
|
||||
this.manager.setAuthoritiesMapper(authoritiesMapper);
|
||||
|
||||
Authentication result = this.manager.authenticate(authorizationCodeAuthentication).block();
|
||||
|
||||
assertThat(result.getAuthorities()).isEqualTo(mappedAuthorities);
|
||||
}
|
||||
|
||||
|
||||
@@ -146,14 +146,10 @@ public class OidcIdTokenDecoderFactoryTests {
|
||||
public void createDecoderWhenCustomJwtValidatorFactorySetThenApplied() {
|
||||
Function<ClientRegistration, OAuth2TokenValidator<Jwt>> customJwtValidatorFactory = mock(Function.class);
|
||||
this.idTokenDecoderFactory.setJwtValidatorFactory(customJwtValidatorFactory);
|
||||
|
||||
ClientRegistration clientRegistration = this.registration.build();
|
||||
|
||||
given(customJwtValidatorFactory.apply(same(clientRegistration)))
|
||||
.willReturn(new OidcIdTokenValidator(clientRegistration));
|
||||
|
||||
this.idTokenDecoderFactory.createDecoder(clientRegistration);
|
||||
|
||||
verify(customJwtValidatorFactory).apply(same(clientRegistration));
|
||||
}
|
||||
|
||||
@@ -161,13 +157,9 @@ public class OidcIdTokenDecoderFactoryTests {
|
||||
public void createDecoderWhenCustomJwsAlgorithmResolverSetThenApplied() {
|
||||
Function<ClientRegistration, JwsAlgorithm> customJwsAlgorithmResolver = mock(Function.class);
|
||||
this.idTokenDecoderFactory.setJwsAlgorithmResolver(customJwsAlgorithmResolver);
|
||||
|
||||
ClientRegistration clientRegistration = this.registration.build();
|
||||
|
||||
given(customJwsAlgorithmResolver.apply(same(clientRegistration))).willReturn(MacAlgorithm.HS256);
|
||||
|
||||
this.idTokenDecoderFactory.createDecoder(clientRegistration);
|
||||
|
||||
verify(customJwsAlgorithmResolver).apply(same(clientRegistration));
|
||||
}
|
||||
|
||||
@@ -176,14 +168,10 @@ public class OidcIdTokenDecoderFactoryTests {
|
||||
Function<ClientRegistration, Converter<Map<String, Object>, Map<String, Object>>> customClaimTypeConverterFactory = mock(
|
||||
Function.class);
|
||||
this.idTokenDecoderFactory.setClaimTypeConverterFactory(customClaimTypeConverterFactory);
|
||||
|
||||
ClientRegistration clientRegistration = this.registration.build();
|
||||
|
||||
given(customClaimTypeConverterFactory.apply(same(clientRegistration)))
|
||||
.willReturn(new ClaimTypeConverter(OidcIdTokenDecoderFactory.createDefaultClaimTypeConverters()));
|
||||
|
||||
this.idTokenDecoderFactory.createDecoder(clientRegistration);
|
||||
|
||||
verify(customClaimTypeConverterFactory).apply(same(clientRegistration));
|
||||
}
|
||||
|
||||
|
||||
@@ -102,7 +102,6 @@ public class OidcIdTokenValidatorTests {
|
||||
* issuer in the ID Token, the validation must fail
|
||||
*/
|
||||
this.registration = this.registration.issuerUri("https://somethingelse.com");
|
||||
|
||||
assertThat(this.validateIdToken()).hasSize(1).extracting(OAuth2Error::getDescription)
|
||||
.allMatch((msg) -> msg.contains(IdTokenClaimNames.ISS));
|
||||
}
|
||||
@@ -114,7 +113,6 @@ public class OidcIdTokenValidatorTests {
|
||||
* in the ID Token, the validation must succeed
|
||||
*/
|
||||
this.registration = this.registration.issuerUri("https://example.com");
|
||||
|
||||
assertThat(this.validateIdToken()).isEmpty();
|
||||
}
|
||||
|
||||
|
||||
@@ -146,14 +146,10 @@ public class ReactiveOidcIdTokenDecoderFactoryTests {
|
||||
public void createDecoderWhenCustomJwtValidatorFactorySetThenApplied() {
|
||||
Function<ClientRegistration, OAuth2TokenValidator<Jwt>> customJwtValidatorFactory = mock(Function.class);
|
||||
this.idTokenDecoderFactory.setJwtValidatorFactory(customJwtValidatorFactory);
|
||||
|
||||
ClientRegistration clientRegistration = this.registration.build();
|
||||
|
||||
given(customJwtValidatorFactory.apply(same(clientRegistration)))
|
||||
.willReturn(new OidcIdTokenValidator(clientRegistration));
|
||||
|
||||
this.idTokenDecoderFactory.createDecoder(clientRegistration);
|
||||
|
||||
verify(customJwtValidatorFactory).apply(same(clientRegistration));
|
||||
}
|
||||
|
||||
@@ -161,13 +157,9 @@ public class ReactiveOidcIdTokenDecoderFactoryTests {
|
||||
public void createDecoderWhenCustomJwsAlgorithmResolverSetThenApplied() {
|
||||
Function<ClientRegistration, JwsAlgorithm> customJwsAlgorithmResolver = mock(Function.class);
|
||||
this.idTokenDecoderFactory.setJwsAlgorithmResolver(customJwsAlgorithmResolver);
|
||||
|
||||
ClientRegistration clientRegistration = this.registration.build();
|
||||
|
||||
given(customJwsAlgorithmResolver.apply(same(clientRegistration))).willReturn(MacAlgorithm.HS256);
|
||||
|
||||
this.idTokenDecoderFactory.createDecoder(clientRegistration);
|
||||
|
||||
verify(customJwsAlgorithmResolver).apply(same(clientRegistration));
|
||||
}
|
||||
|
||||
@@ -176,14 +168,10 @@ public class ReactiveOidcIdTokenDecoderFactoryTests {
|
||||
Function<ClientRegistration, Converter<Map<String, Object>, Map<String, Object>>> customClaimTypeConverterFactory = mock(
|
||||
Function.class);
|
||||
this.idTokenDecoderFactory.setClaimTypeConverterFactory(customClaimTypeConverterFactory);
|
||||
|
||||
ClientRegistration clientRegistration = this.registration.build();
|
||||
|
||||
given(customClaimTypeConverterFactory.apply(same(clientRegistration)))
|
||||
.willReturn(new ClaimTypeConverter(OidcIdTokenDecoderFactory.createDefaultClaimTypeConverters()));
|
||||
|
||||
this.idTokenDecoderFactory.createDecoder(clientRegistration);
|
||||
|
||||
verify(customClaimTypeConverterFactory).apply(same(clientRegistration));
|
||||
}
|
||||
|
||||
|
||||
@@ -104,18 +104,14 @@ public class OidcReactiveOAuth2UserServiceTests {
|
||||
@Test
|
||||
public void loadUserWhenUserInfoUriNullThenUserInfoNotRetrieved() {
|
||||
this.registration.userInfoUri(null);
|
||||
|
||||
OidcUser user = this.userService.loadUser(userRequest()).block();
|
||||
|
||||
assertThat(user.getUserInfo()).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void loadUserWhenOAuth2UserEmptyThenNullUserInfo() {
|
||||
given(this.oauth2UserService.loadUser(any())).willReturn(Mono.empty());
|
||||
|
||||
OidcUser user = this.userService.loadUser(userRequest()).block();
|
||||
|
||||
assertThat(user.getUserInfo()).isNull();
|
||||
}
|
||||
|
||||
@@ -124,7 +120,6 @@ public class OidcReactiveOAuth2UserServiceTests {
|
||||
OAuth2User oauth2User = new DefaultOAuth2User(AuthorityUtils.createAuthorityList("ROLE_USER"),
|
||||
Collections.singletonMap("user", "rob"), "user");
|
||||
given(this.oauth2UserService.loadUser(any())).willReturn(Mono.just(oauth2User));
|
||||
|
||||
assertThatCode(() -> this.userService.loadUser(userRequest()).block())
|
||||
.isInstanceOf(OAuth2AuthenticationException.class);
|
||||
}
|
||||
@@ -137,7 +132,6 @@ public class OidcReactiveOAuth2UserServiceTests {
|
||||
OAuth2User oauth2User = new DefaultOAuth2User(AuthorityUtils.createAuthorityList("ROLE_USER"), attributes,
|
||||
"user");
|
||||
given(this.oauth2UserService.loadUser(any())).willReturn(Mono.just(oauth2User));
|
||||
|
||||
assertThatCode(() -> this.userService.loadUser(userRequest()).block())
|
||||
.isInstanceOf(OAuth2AuthenticationException.class);
|
||||
}
|
||||
@@ -150,7 +144,6 @@ public class OidcReactiveOAuth2UserServiceTests {
|
||||
OAuth2User oauth2User = new DefaultOAuth2User(AuthorityUtils.createAuthorityList("ROLE_USER"), attributes,
|
||||
"user");
|
||||
given(this.oauth2UserService.loadUser(any())).willReturn(Mono.just(oauth2User));
|
||||
|
||||
assertThat(this.userService.loadUser(userRequest()).block().getUserInfo()).isNotNull();
|
||||
}
|
||||
|
||||
@@ -163,7 +156,6 @@ public class OidcReactiveOAuth2UserServiceTests {
|
||||
OAuth2User oauth2User = new DefaultOAuth2User(AuthorityUtils.createAuthorityList("ROLE_USER"), attributes,
|
||||
"user");
|
||||
given(this.oauth2UserService.loadUser(any())).willReturn(Mono.just(oauth2User));
|
||||
|
||||
assertThat(this.userService.loadUser(userRequest()).block().getName()).isEqualTo("rob");
|
||||
}
|
||||
|
||||
@@ -175,18 +167,13 @@ public class OidcReactiveOAuth2UserServiceTests {
|
||||
OAuth2User oauth2User = new DefaultOAuth2User(AuthorityUtils.createAuthorityList("ROLE_USER"), attributes,
|
||||
"user");
|
||||
given(this.oauth2UserService.loadUser(any())).willReturn(Mono.just(oauth2User));
|
||||
|
||||
OidcUserRequest userRequest = userRequest();
|
||||
|
||||
Function<ClientRegistration, Converter<Map<String, Object>, Map<String, Object>>> customClaimTypeConverterFactory = mock(
|
||||
Function.class);
|
||||
this.userService.setClaimTypeConverterFactory(customClaimTypeConverterFactory);
|
||||
|
||||
given(customClaimTypeConverterFactory.apply(same(userRequest.getClientRegistration())))
|
||||
.willReturn(new ClaimTypeConverter(OidcReactiveOAuth2UserService.createDefaultClaimTypeConverters()));
|
||||
|
||||
this.userService.loadUser(userRequest).block().getUserInfo();
|
||||
|
||||
verify(customClaimTypeConverterFactory).apply(same(userRequest.getClientRegistration()));
|
||||
}
|
||||
|
||||
@@ -196,7 +183,6 @@ public class OidcReactiveOAuth2UserServiceTests {
|
||||
OidcUserRequest request = new OidcUserRequest(TestClientRegistrations.clientRegistration().build(),
|
||||
TestOAuth2AccessTokens.scopes("message:read", "message:write"), TestOidcIdTokens.idToken().build());
|
||||
OidcUser user = userService.loadUser(request).block();
|
||||
|
||||
assertThat(user.getAuthorities()).hasSize(3);
|
||||
Iterator<? extends GrantedAuthority> authorities = user.getAuthorities().iterator();
|
||||
assertThat(authorities.next()).isInstanceOf(OAuth2UserAuthority.class);
|
||||
@@ -210,7 +196,6 @@ public class OidcReactiveOAuth2UserServiceTests {
|
||||
OidcUserRequest request = new OidcUserRequest(TestClientRegistrations.clientRegistration().build(),
|
||||
TestOAuth2AccessTokens.noScopes(), TestOidcIdTokens.idToken().build());
|
||||
OidcUser user = userService.loadUser(request).block();
|
||||
|
||||
assertThat(user.getAuthorities()).hasSize(1);
|
||||
Iterator<? extends GrantedAuthority> authorities = user.getAuthorities().iterator();
|
||||
assertThat(authorities.next()).isInstanceOf(OAuth2UserAuthority.class);
|
||||
|
||||
@@ -82,7 +82,6 @@ public class OidcUserRequestTests {
|
||||
public void constructorWhenAllParametersProvidedAndValidThenCreated() {
|
||||
OidcUserRequest userRequest = new OidcUserRequest(this.clientRegistration, this.accessToken, this.idToken,
|
||||
this.additionalParameters);
|
||||
|
||||
assertThat(userRequest.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(userRequest.getAccessToken()).isEqualTo(this.accessToken);
|
||||
assertThat(userRequest.getIdToken()).isEqualTo(this.idToken);
|
||||
|
||||
@@ -52,21 +52,18 @@ public class OidcUserRequestUtilsTests {
|
||||
@Test
|
||||
public void shouldRetrieveUserInfoWhenNoUserInfoUriThenFalse() {
|
||||
this.registration.userInfoUri(null);
|
||||
|
||||
assertThat(OidcUserRequestUtils.shouldRetrieveUserInfo(userRequest())).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldRetrieveUserInfoWhenDifferentScopesThenFalse() {
|
||||
this.registration.scope("notintoken");
|
||||
|
||||
assertThat(OidcUserRequestUtils.shouldRetrieveUserInfo(userRequest())).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldRetrieveUserInfoWhenNotAuthorizationCodeThenFalse() {
|
||||
this.registration.authorizationGrantType(AuthorizationGrantType.IMPLICIT);
|
||||
|
||||
assertThat(OidcUserRequestUtils.shouldRetrieveUserInfo(userRequest())).isFalse();
|
||||
}
|
||||
|
||||
|
||||
@@ -90,14 +90,11 @@ public class OidcUserServiceTests {
|
||||
this.clientRegistrationBuilder = TestClientRegistrations.clientRegistration().userInfoUri(null)
|
||||
.userInfoAuthenticationMethod(AuthenticationMethod.HEADER)
|
||||
.userNameAttributeName(StandardClaimNames.SUB);
|
||||
|
||||
this.accessToken = TestOAuth2AccessTokens.scopes(OidcScopes.OPENID, OidcScopes.PROFILE);
|
||||
|
||||
Map<String, Object> idTokenClaims = new HashMap<>();
|
||||
idTokenClaims.put(IdTokenClaimNames.ISS, "https://provider.com");
|
||||
idTokenClaims.put(IdTokenClaimNames.SUB, "subject1");
|
||||
this.idToken = new OidcIdToken("access-token", Instant.MIN, Instant.MAX, idTokenClaims);
|
||||
|
||||
this.userService.setOauth2UserService(new DefaultOAuth2UserService());
|
||||
}
|
||||
|
||||
@@ -155,7 +152,6 @@ public class OidcUserServiceTests {
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri("https://provider.com/user")
|
||||
.build();
|
||||
this.accessToken = TestOAuth2AccessTokens.scopes("scope1", "scope2");
|
||||
|
||||
OidcUser user = this.userService
|
||||
.loadUser(new OidcUserRequest(clientRegistration, this.accessToken, this.idToken));
|
||||
assertThat(user.getUserInfo()).isNull();
|
||||
@@ -168,14 +164,10 @@ public class OidcUserServiceTests {
|
||||
+ " \"given_name\": \"first\",\n" + " \"family_name\": \"last\",\n"
|
||||
+ " \"preferred_username\": \"user1\",\n" + " \"email\": \"user1@example.com\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(userInfoResponse));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri).build();
|
||||
|
||||
this.accessToken = TestOAuth2AccessTokens.scopes("scope1", "scope2");
|
||||
this.userService.setAccessibleScopes(Collections.singleton("scope2"));
|
||||
|
||||
OidcUser user = this.userService
|
||||
.loadUser(new OidcUserRequest(clientRegistration, this.accessToken, this.idToken));
|
||||
assertThat(user.getUserInfo()).isNotNull();
|
||||
@@ -188,14 +180,10 @@ public class OidcUserServiceTests {
|
||||
+ " \"given_name\": \"first\",\n" + " \"family_name\": \"last\",\n"
|
||||
+ " \"preferred_username\": \"user1\",\n" + " \"email\": \"user1@example.com\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(userInfoResponse));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri).build();
|
||||
|
||||
this.accessToken = TestOAuth2AccessTokens.scopes("scope1", "scope2");
|
||||
this.userService.setAccessibleScopes(Collections.emptySet());
|
||||
|
||||
OidcUser user = this.userService
|
||||
.loadUser(new OidcUserRequest(clientRegistration, this.accessToken, this.idToken));
|
||||
assertThat(user.getUserInfo()).isNotNull();
|
||||
@@ -208,11 +196,8 @@ public class OidcUserServiceTests {
|
||||
+ " \"given_name\": \"first\",\n" + " \"family_name\": \"last\",\n"
|
||||
+ " \"preferred_username\": \"user1\",\n" + " \"email\": \"user1@example.com\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(userInfoResponse));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri).build();
|
||||
|
||||
OidcUser user = this.userService
|
||||
.loadUser(new OidcUserRequest(clientRegistration, this.accessToken, this.idToken));
|
||||
assertThat(user.getUserInfo()).isNotNull();
|
||||
@@ -224,14 +209,10 @@ public class OidcUserServiceTests {
|
||||
+ " \"given_name\": \"first\",\n" + " \"family_name\": \"last\",\n"
|
||||
+ " \"preferred_username\": \"user1\",\n" + " \"email\": \"user1@example.com\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(userInfoResponse));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri).build();
|
||||
|
||||
OidcUser user = this.userService
|
||||
.loadUser(new OidcUserRequest(clientRegistration, this.accessToken, this.idToken));
|
||||
|
||||
assertThat(user.getIdToken()).isNotNull();
|
||||
assertThat(user.getUserInfo()).isNotNull();
|
||||
assertThat(user.getUserInfo().getClaims().size()).isEqualTo(6);
|
||||
@@ -243,7 +224,6 @@ public class OidcUserServiceTests {
|
||||
assertThat(user.getUserInfo().getFamilyName()).isEqualTo("last");
|
||||
assertThat(user.getUserInfo().getPreferredUsername()).isEqualTo("user1");
|
||||
assertThat(user.getUserInfo().getEmail()).isEqualTo("user1@example.com");
|
||||
|
||||
assertThat(user.getAuthorities().size()).isEqualTo(3);
|
||||
assertThat(user.getAuthorities().iterator().next()).isInstanceOf(OidcUserAuthority.class);
|
||||
OidcUserAuthority userAuthority = (OidcUserAuthority) user.getAuthorities().iterator().next();
|
||||
@@ -257,16 +237,12 @@ public class OidcUserServiceTests {
|
||||
public void loadUserWhenUserInfoSuccessResponseAndUserInfoSubjectIsNullThenThrowOAuth2AuthenticationException() {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString("invalid_user_info_response"));
|
||||
|
||||
String userInfoResponse = "{\n" + " \"email\": \"full_name@provider.com\",\n" + " \"name\": \"full name\"\n"
|
||||
+ "}\n";
|
||||
this.server.enqueue(jsonResponse(userInfoResponse));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri)
|
||||
.userNameAttributeName(StandardClaimNames.EMAIL).build();
|
||||
|
||||
this.userService.loadUser(new OidcUserRequest(clientRegistration, this.accessToken, this.idToken));
|
||||
}
|
||||
|
||||
@@ -274,14 +250,10 @@ public class OidcUserServiceTests {
|
||||
public void loadUserWhenUserInfoSuccessResponseAndUserInfoSubjectNotSameAsIdTokenSubjectThenThrowOAuth2AuthenticationException() {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString("invalid_user_info_response"));
|
||||
|
||||
String userInfoResponse = "{\n" + " \"sub\": \"other-subject\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(userInfoResponse));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri).build();
|
||||
|
||||
this.userService.loadUser(new OidcUserRequest(clientRegistration, this.accessToken, this.idToken));
|
||||
}
|
||||
|
||||
@@ -290,17 +262,13 @@ public class OidcUserServiceTests {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString(
|
||||
"[invalid_user_info_response] An error occurred while attempting to retrieve the UserInfo Resource"));
|
||||
|
||||
String userInfoResponse = "{\n" + " \"sub\": \"subject1\",\n" + " \"name\": \"first last\",\n"
|
||||
+ " \"given_name\": \"first\",\n" + " \"family_name\": \"last\",\n"
|
||||
+ " \"preferred_username\": \"user1\",\n" + " \"email\": \"user1@example.com\"\n";
|
||||
// "}\n"; // Make the JSON invalid/malformed
|
||||
this.server.enqueue(jsonResponse(userInfoResponse));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri).build();
|
||||
|
||||
this.userService.loadUser(new OidcUserRequest(clientRegistration, this.accessToken, this.idToken));
|
||||
}
|
||||
|
||||
@@ -309,13 +277,9 @@ public class OidcUserServiceTests {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString(
|
||||
"[invalid_user_info_response] An error occurred while attempting to retrieve the UserInfo Resource: 500 Server Error"));
|
||||
|
||||
this.server.enqueue(new MockResponse().setResponseCode(500));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri).build();
|
||||
|
||||
this.userService.loadUser(new OidcUserRequest(clientRegistration, this.accessToken, this.idToken));
|
||||
}
|
||||
|
||||
@@ -324,11 +288,8 @@ public class OidcUserServiceTests {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString(
|
||||
"[invalid_user_info_response] An error occurred while attempting to retrieve the UserInfo Resource"));
|
||||
|
||||
String userInfoUri = "https://invalid-provider.com/user";
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri).build();
|
||||
|
||||
this.userService.loadUser(new OidcUserRequest(clientRegistration, this.accessToken, this.idToken));
|
||||
}
|
||||
|
||||
@@ -338,15 +299,11 @@ public class OidcUserServiceTests {
|
||||
+ " \"given_name\": \"first\",\n" + " \"family_name\": \"last\",\n"
|
||||
+ " \"preferred_username\": \"user1\",\n" + " \"email\": \"user1@example.com\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(userInfoResponse));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri)
|
||||
.userNameAttributeName(StandardClaimNames.EMAIL).build();
|
||||
|
||||
OidcUser user = this.userService
|
||||
.loadUser(new OidcUserRequest(clientRegistration, this.accessToken, this.idToken));
|
||||
|
||||
assertThat(user.getName()).isEqualTo("user1@example.com");
|
||||
}
|
||||
|
||||
@@ -357,11 +314,8 @@ public class OidcUserServiceTests {
|
||||
+ " \"given_name\": \"first\",\n" + " \"family_name\": \"last\",\n"
|
||||
+ " \"preferred_username\": \"user1\",\n" + " \"email\": \"user1@example.com\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(userInfoResponse));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri).build();
|
||||
|
||||
this.userService.loadUser(new OidcUserRequest(clientRegistration, this.accessToken, this.idToken));
|
||||
assertThat(this.server.takeRequest(1, TimeUnit.SECONDS).getHeader(HttpHeaders.ACCEPT))
|
||||
.isEqualTo(MediaType.APPLICATION_JSON_VALUE);
|
||||
@@ -374,11 +328,8 @@ public class OidcUserServiceTests {
|
||||
+ " \"given_name\": \"first\",\n" + " \"family_name\": \"last\",\n"
|
||||
+ " \"preferred_username\": \"user1\",\n" + " \"email\": \"user1@example.com\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(userInfoResponse));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri).build();
|
||||
|
||||
this.userService.loadUser(new OidcUserRequest(clientRegistration, this.accessToken, this.idToken));
|
||||
RecordedRequest request = this.server.takeRequest();
|
||||
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET.name());
|
||||
@@ -394,12 +345,9 @@ public class OidcUserServiceTests {
|
||||
+ " \"given_name\": \"first\",\n" + " \"family_name\": \"last\",\n"
|
||||
+ " \"preferred_username\": \"user1\",\n" + " \"email\": \"user1@example.com\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(userInfoResponse));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri)
|
||||
.userInfoAuthenticationMethod(AuthenticationMethod.FORM).build();
|
||||
|
||||
this.userService.loadUser(new OidcUserRequest(clientRegistration, this.accessToken, this.idToken));
|
||||
RecordedRequest request = this.server.takeRequest();
|
||||
assertThat(request.getMethod()).isEqualTo(HttpMethod.POST.name());
|
||||
@@ -414,20 +362,14 @@ public class OidcUserServiceTests {
|
||||
+ " \"given_name\": \"first\",\n" + " \"family_name\": \"last\",\n"
|
||||
+ " \"preferred_username\": \"user1\",\n" + " \"email\": \"user1@example.com\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(userInfoResponse));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri).build();
|
||||
|
||||
Function<ClientRegistration, Converter<Map<String, Object>, Map<String, Object>>> customClaimTypeConverterFactory = mock(
|
||||
Function.class);
|
||||
this.userService.setClaimTypeConverterFactory(customClaimTypeConverterFactory);
|
||||
|
||||
given(customClaimTypeConverterFactory.apply(same(clientRegistration)))
|
||||
.willReturn(new ClaimTypeConverter(OidcUserService.createDefaultClaimTypeConverters()));
|
||||
|
||||
this.userService.loadUser(new OidcUserRequest(clientRegistration, this.accessToken, this.idToken));
|
||||
|
||||
verify(customClaimTypeConverterFactory).apply(same(clientRegistration));
|
||||
}
|
||||
|
||||
@@ -437,7 +379,6 @@ public class OidcUserServiceTests {
|
||||
OidcUserRequest request = new OidcUserRequest(TestClientRegistrations.clientRegistration().build(),
|
||||
TestOAuth2AccessTokens.scopes("message:read", "message:write"), TestOidcIdTokens.idToken().build());
|
||||
OidcUser user = userService.loadUser(request);
|
||||
|
||||
assertThat(user.getAuthorities()).hasSize(3);
|
||||
Iterator<? extends GrantedAuthority> authorities = user.getAuthorities().iterator();
|
||||
assertThat(authorities.next()).isInstanceOf(OidcUserAuthority.class);
|
||||
@@ -451,7 +392,6 @@ public class OidcUserServiceTests {
|
||||
OidcUserRequest request = new OidcUserRequest(TestClientRegistrations.clientRegistration().build(),
|
||||
TestOAuth2AccessTokens.noScopes(), TestOidcIdTokens.idToken().build());
|
||||
OidcUser user = userService.loadUser(request);
|
||||
|
||||
assertThat(user.getAuthorities()).hasSize(1);
|
||||
Iterator<? extends GrantedAuthority> authorities = user.getAuthorities().iterator();
|
||||
assertThat(authorities.next()).isInstanceOf(OidcUserAuthority.class);
|
||||
|
||||
@@ -72,21 +72,17 @@ public class OidcClientInitiatedLogoutSuccessHandlerTests {
|
||||
public void logoutWhenOidcRedirectUrlConfiguredThenRedirects() throws IOException, ServletException {
|
||||
OAuth2AuthenticationToken token = new OAuth2AuthenticationToken(TestOidcUsers.create(),
|
||||
AuthorityUtils.NO_AUTHORITIES, this.registration.getRegistrationId());
|
||||
|
||||
this.request.setUserPrincipal(token);
|
||||
this.handler.onLogoutSuccess(this.request, this.response, token);
|
||||
|
||||
assertThat(this.response.getRedirectedUrl()).isEqualTo("https://endpoint?id_token_hint=id-token");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void logoutWhenNotOAuth2AuthenticationThenDefaults() throws IOException, ServletException {
|
||||
Authentication token = mock(Authentication.class);
|
||||
|
||||
this.request.setUserPrincipal(token);
|
||||
this.handler.setDefaultTargetUrl("https://default");
|
||||
this.handler.onLogoutSuccess(this.request, this.response, token);
|
||||
|
||||
assertThat(this.response.getRedirectedUrl()).isEqualTo("https://default");
|
||||
}
|
||||
|
||||
@@ -94,41 +90,32 @@ public class OidcClientInitiatedLogoutSuccessHandlerTests {
|
||||
public void logoutWhenNotOidcUserThenDefaults() throws IOException, ServletException {
|
||||
OAuth2AuthenticationToken token = new OAuth2AuthenticationToken(TestOAuth2Users.create(),
|
||||
AuthorityUtils.NO_AUTHORITIES, this.registration.getRegistrationId());
|
||||
|
||||
this.request.setUserPrincipal(token);
|
||||
this.handler.setDefaultTargetUrl("https://default");
|
||||
this.handler.onLogoutSuccess(this.request, this.response, token);
|
||||
|
||||
assertThat(this.response.getRedirectedUrl()).isEqualTo("https://default");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void logoutWhenClientRegistrationHasNoEndSessionEndpointThenDefaults() throws Exception {
|
||||
|
||||
ClientRegistration registration = TestClientRegistrations.clientRegistration().build();
|
||||
ClientRegistrationRepository repository = new InMemoryClientRegistrationRepository(registration);
|
||||
OidcClientInitiatedLogoutSuccessHandler handler = new OidcClientInitiatedLogoutSuccessHandler(repository);
|
||||
|
||||
OAuth2AuthenticationToken token = new OAuth2AuthenticationToken(TestOidcUsers.create(),
|
||||
AuthorityUtils.NO_AUTHORITIES, registration.getRegistrationId());
|
||||
|
||||
this.request.setUserPrincipal(token);
|
||||
handler.setDefaultTargetUrl("https://default");
|
||||
handler.onLogoutSuccess(this.request, this.response, token);
|
||||
|
||||
assertThat(this.response.getRedirectedUrl()).isEqualTo("https://default");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void logoutWhenUsingPostLogoutRedirectUriThenIncludesItInRedirect() throws IOException, ServletException {
|
||||
|
||||
OAuth2AuthenticationToken token = new OAuth2AuthenticationToken(TestOidcUsers.create(),
|
||||
AuthorityUtils.NO_AUTHORITIES, this.registration.getRegistrationId());
|
||||
|
||||
this.handler.setPostLogoutRedirectUri(URI.create("https://postlogout?encodedparam=value"));
|
||||
this.request.setUserPrincipal(token);
|
||||
this.handler.onLogoutSuccess(this.request, this.response, token);
|
||||
|
||||
assertThat(this.response.getRedirectedUrl()).isEqualTo("https://endpoint?" + "id_token_hint=id-token&"
|
||||
+ "post_logout_redirect_uri=https://postlogout?encodedparam%3Dvalue");
|
||||
}
|
||||
@@ -136,7 +123,6 @@ public class OidcClientInitiatedLogoutSuccessHandlerTests {
|
||||
@Test
|
||||
public void logoutWhenUsingPostLogoutRedirectUriTemplateThenBuildsItForRedirect()
|
||||
throws IOException, ServletException {
|
||||
|
||||
OAuth2AuthenticationToken token = new OAuth2AuthenticationToken(TestOidcUsers.create(),
|
||||
AuthorityUtils.NO_AUTHORITIES, this.registration.getRegistrationId());
|
||||
this.handler.setPostLogoutRedirectUri("{baseUrl}");
|
||||
@@ -145,7 +131,6 @@ public class OidcClientInitiatedLogoutSuccessHandlerTests {
|
||||
this.request.setServerName("rp.example.org");
|
||||
this.request.setUserPrincipal(token);
|
||||
this.handler.onLogoutSuccess(this.request, this.response, token);
|
||||
|
||||
assertThat(this.response.getRedirectedUrl()).isEqualTo(
|
||||
"https://endpoint?" + "id_token_hint=id-token&" + "post_logout_redirect_uri=https://rp.example.org");
|
||||
}
|
||||
|
||||
@@ -77,24 +77,19 @@ public class OidcClientInitiatedServerLogoutSuccessHandlerTests {
|
||||
public void logoutWhenOidcRedirectUrlConfiguredThenRedirects() {
|
||||
OAuth2AuthenticationToken token = new OAuth2AuthenticationToken(TestOidcUsers.create(),
|
||||
AuthorityUtils.NO_AUTHORITIES, this.registration.getRegistrationId());
|
||||
|
||||
given(this.exchange.getPrincipal()).willReturn(Mono.just(token));
|
||||
WebFilterExchange f = new WebFilterExchange(this.exchange, this.chain);
|
||||
this.handler.onLogoutSuccess(f, token).block();
|
||||
|
||||
assertThat(redirectedUrl(this.exchange)).isEqualTo("https://endpoint?id_token_hint=id-token");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void logoutWhenNotOAuth2AuthenticationThenDefaults() {
|
||||
Authentication token = mock(Authentication.class);
|
||||
|
||||
given(this.exchange.getPrincipal()).willReturn(Mono.just(token));
|
||||
WebFilterExchange f = new WebFilterExchange(this.exchange, this.chain);
|
||||
|
||||
this.handler.setLogoutSuccessUrl(URI.create("https://default"));
|
||||
this.handler.onLogoutSuccess(f, token).block();
|
||||
|
||||
assertThat(redirectedUrl(this.exchange)).isEqualTo("https://default");
|
||||
}
|
||||
|
||||
@@ -102,49 +97,37 @@ public class OidcClientInitiatedServerLogoutSuccessHandlerTests {
|
||||
public void logoutWhenNotOidcUserThenDefaults() {
|
||||
OAuth2AuthenticationToken token = new OAuth2AuthenticationToken(TestOAuth2Users.create(),
|
||||
AuthorityUtils.NO_AUTHORITIES, this.registration.getRegistrationId());
|
||||
|
||||
given(this.exchange.getPrincipal()).willReturn(Mono.just(token));
|
||||
WebFilterExchange f = new WebFilterExchange(this.exchange, this.chain);
|
||||
|
||||
this.handler.setLogoutSuccessUrl(URI.create("https://default"));
|
||||
this.handler.onLogoutSuccess(f, token).block();
|
||||
|
||||
assertThat(redirectedUrl(this.exchange)).isEqualTo("https://default");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void logoutWhenClientRegistrationHasNoEndSessionEndpointThenDefaults() {
|
||||
|
||||
ClientRegistration registration = TestClientRegistrations.clientRegistration().build();
|
||||
ReactiveClientRegistrationRepository repository = new InMemoryReactiveClientRegistrationRepository(
|
||||
registration);
|
||||
OidcClientInitiatedServerLogoutSuccessHandler handler = new OidcClientInitiatedServerLogoutSuccessHandler(
|
||||
repository);
|
||||
|
||||
OAuth2AuthenticationToken token = new OAuth2AuthenticationToken(TestOidcUsers.create(),
|
||||
AuthorityUtils.NO_AUTHORITIES, registration.getRegistrationId());
|
||||
|
||||
given(this.exchange.getPrincipal()).willReturn(Mono.just(token));
|
||||
WebFilterExchange f = new WebFilterExchange(this.exchange, this.chain);
|
||||
|
||||
handler.setLogoutSuccessUrl(URI.create("https://default"));
|
||||
handler.onLogoutSuccess(f, token).block();
|
||||
|
||||
assertThat(redirectedUrl(this.exchange)).isEqualTo("https://default");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void logoutWhenUsingPostLogoutRedirectUriThenIncludesItInRedirect() {
|
||||
|
||||
OAuth2AuthenticationToken token = new OAuth2AuthenticationToken(TestOidcUsers.create(),
|
||||
AuthorityUtils.NO_AUTHORITIES, this.registration.getRegistrationId());
|
||||
|
||||
given(this.exchange.getPrincipal()).willReturn(Mono.just(token));
|
||||
WebFilterExchange f = new WebFilterExchange(this.exchange, this.chain);
|
||||
|
||||
this.handler.setPostLogoutRedirectUri(URI.create("https://postlogout?encodedparam=value"));
|
||||
this.handler.onLogoutSuccess(f, token).block();
|
||||
|
||||
assertThat(redirectedUrl(this.exchange)).isEqualTo("https://endpoint?" + "id_token_hint=id-token&"
|
||||
+ "post_logout_redirect_uri=https://postlogout?encodedparam%3Dvalue");
|
||||
}
|
||||
@@ -152,17 +135,14 @@ public class OidcClientInitiatedServerLogoutSuccessHandlerTests {
|
||||
@Test
|
||||
public void logoutWhenUsingPostLogoutRedirectUriTemplateThenBuildsItForRedirect()
|
||||
throws IOException, ServletException {
|
||||
|
||||
OAuth2AuthenticationToken token = new OAuth2AuthenticationToken(TestOidcUsers.create(),
|
||||
AuthorityUtils.NO_AUTHORITIES, this.registration.getRegistrationId());
|
||||
given(this.exchange.getPrincipal()).willReturn(Mono.just(token));
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("https://rp.example.org/").build();
|
||||
given(this.exchange.getRequest()).willReturn(request);
|
||||
WebFilterExchange f = new WebFilterExchange(this.exchange, this.chain);
|
||||
|
||||
this.handler.setPostLogoutRedirectUri("{baseUrl}");
|
||||
this.handler.onLogoutSuccess(f, token).block();
|
||||
|
||||
assertThat(redirectedUrl(this.exchange)).isEqualTo(
|
||||
"https://endpoint?" + "id_token_hint=id-token&" + "post_logout_redirect_uri=https://rp.example.org");
|
||||
}
|
||||
|
||||
@@ -87,7 +87,6 @@ public class ClientRegistrationTests {
|
||||
.scope(SCOPES.toArray(new String[0])).authorizationUri(AUTHORIZATION_URI).tokenUri(TOKEN_URI)
|
||||
.userInfoAuthenticationMethod(AuthenticationMethod.FORM).jwkSetUri(JWK_SET_URI).issuerUri(ISSUER_URI)
|
||||
.providerConfigurationMetadata(PROVIDER_CONFIGURATION_METADATA).clientName(CLIENT_NAME).build();
|
||||
|
||||
assertThat(registration.getRegistrationId()).isEqualTo(REGISTRATION_ID);
|
||||
assertThat(registration.getClientId()).isEqualTo(CLIENT_ID);
|
||||
assertThat(registration.getClientSecret()).isEqualTo(CLIENT_SECRET);
|
||||
@@ -274,7 +273,6 @@ public class ClientRegistrationTests {
|
||||
.authorizationGrantType(AuthorizationGrantType.IMPLICIT).redirectUri(REDIRECT_URI)
|
||||
.scope(SCOPES.toArray(new String[0])).authorizationUri(AUTHORIZATION_URI)
|
||||
.userInfoAuthenticationMethod(AuthenticationMethod.FORM).clientName(CLIENT_NAME).build();
|
||||
|
||||
assertThat(registration.getRegistrationId()).isEqualTo(REGISTRATION_ID);
|
||||
assertThat(registration.getClientId()).isEqualTo(CLIENT_ID);
|
||||
assertThat(registration.getAuthorizationGrantType()).isEqualTo(AuthorizationGrantType.IMPLICIT);
|
||||
@@ -345,7 +343,6 @@ public class ClientRegistrationTests {
|
||||
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE).redirectUri(REDIRECT_URI)
|
||||
.scope(SCOPES.toArray(new String[0])).authorizationUri(AUTHORIZATION_URI).tokenUri(TOKEN_URI)
|
||||
.jwkSetUri(JWK_SET_URI).clientName(CLIENT_NAME).build();
|
||||
|
||||
assertThat(registration.getRegistrationId()).isEqualTo(overriddenId);
|
||||
}
|
||||
|
||||
@@ -355,7 +352,6 @@ public class ClientRegistrationTests {
|
||||
.clientSecret(CLIENT_SECRET).clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
|
||||
.authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS).scope(SCOPES.toArray(new String[0]))
|
||||
.tokenUri(TOKEN_URI).clientName(CLIENT_NAME).build();
|
||||
|
||||
assertThat(registration.getRegistrationId()).isEqualTo(REGISTRATION_ID);
|
||||
assertThat(registration.getClientId()).isEqualTo(CLIENT_ID);
|
||||
assertThat(registration.getClientSecret()).isEqualTo(CLIENT_SECRET);
|
||||
@@ -425,7 +421,6 @@ public class ClientRegistrationTests {
|
||||
.clientSecret(CLIENT_SECRET).clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
|
||||
.authorizationGrantType(AuthorizationGrantType.PASSWORD).scope(SCOPES.toArray(new String[0]))
|
||||
.tokenUri(TOKEN_URI).clientName(CLIENT_NAME).build();
|
||||
|
||||
assertThat(registration.getRegistrationId()).isEqualTo(REGISTRATION_ID);
|
||||
assertThat(registration.getClientId()).isEqualTo(CLIENT_ID);
|
||||
assertThat(registration.getClientSecret()).isEqualTo(CLIENT_SECRET);
|
||||
@@ -483,7 +478,6 @@ public class ClientRegistrationTests {
|
||||
.clientSecret(CLIENT_SECRET).clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
|
||||
.authorizationGrantType(customGrantType).scope(SCOPES.toArray(new String[0])).tokenUri(TOKEN_URI)
|
||||
.clientName(CLIENT_NAME).build();
|
||||
|
||||
assertThat(registration.getRegistrationId()).isEqualTo(REGISTRATION_ID);
|
||||
assertThat(registration.getClientId()).isEqualTo(CLIENT_ID);
|
||||
assertThat(registration.getClientSecret()).isEqualTo(CLIENT_SECRET);
|
||||
@@ -518,12 +512,10 @@ public class ClientRegistrationTests {
|
||||
assertThat(clientRegistration.getAuthorizationGrantType()).isEqualTo(updated.getAuthorizationGrantType());
|
||||
assertThat(clientRegistration.getRedirectUri()).isEqualTo(updated.getRedirectUri());
|
||||
assertThat(clientRegistration.getScopes()).isEqualTo(updated.getScopes());
|
||||
|
||||
ClientRegistration.ProviderDetails providerDetails = clientRegistration.getProviderDetails();
|
||||
ClientRegistration.ProviderDetails updatedProviderDetails = updated.getProviderDetails();
|
||||
assertThat(providerDetails.getAuthorizationUri()).isEqualTo(updatedProviderDetails.getAuthorizationUri());
|
||||
assertThat(providerDetails.getTokenUri()).isEqualTo(updatedProviderDetails.getTokenUri());
|
||||
|
||||
ClientRegistration.ProviderDetails.UserInfoEndpoint userInfoEndpoint = providerDetails.getUserInfoEndpoint();
|
||||
ClientRegistration.ProviderDetails.UserInfoEndpoint updatedUserInfoEndpoint = updatedProviderDetails
|
||||
.getUserInfoEndpoint();
|
||||
@@ -532,12 +524,10 @@ public class ClientRegistrationTests {
|
||||
.isEqualTo(updatedUserInfoEndpoint.getAuthenticationMethod());
|
||||
assertThat(userInfoEndpoint.getUserNameAttributeName())
|
||||
.isEqualTo(updatedUserInfoEndpoint.getUserNameAttributeName());
|
||||
|
||||
assertThat(providerDetails.getJwkSetUri()).isEqualTo(updatedProviderDetails.getJwkSetUri());
|
||||
assertThat(providerDetails.getIssuerUri()).isEqualTo(updatedProviderDetails.getIssuerUri());
|
||||
assertThat(providerDetails.getConfigurationMetadata())
|
||||
.isEqualTo(updatedProviderDetails.getConfigurationMetadata());
|
||||
|
||||
assertThat(clientRegistration.getClientName()).isEqualTo(updated.getClientName());
|
||||
}
|
||||
|
||||
@@ -547,7 +537,6 @@ public class ClientRegistrationTests {
|
||||
ClientRegistration updated = ClientRegistration.withClientRegistration(clientRegistration)
|
||||
.clientSecret("a-new-secret").scope("a-new-scope")
|
||||
.providerConfigurationMetadata(Collections.singletonMap("a-new-config", "a-new-value")).build();
|
||||
|
||||
assertThat(clientRegistration.getClientSecret()).isNotEqualTo(updated.getClientSecret());
|
||||
assertThat(updated.getClientSecret()).isEqualTo("a-new-secret");
|
||||
assertThat(clientRegistration.getScopes()).doesNotContain("a-new-scope");
|
||||
|
||||
@@ -200,45 +200,35 @@ public class ClientRegistrationsTests {
|
||||
@Test
|
||||
public void issuerWhenScopesNullThenScopesDefaulted() throws Exception {
|
||||
this.response.remove("scopes_supported");
|
||||
|
||||
ClientRegistration registration = registration("").build();
|
||||
|
||||
assertThat(registration.getScopes()).containsOnly("openid");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void issuerWhenOidcFallbackScopesNullThenScopesDefaulted() throws Exception {
|
||||
this.response.remove("scopes_supported");
|
||||
|
||||
ClientRegistration registration = registrationOidcFallback("", null).build();
|
||||
|
||||
assertThat(registration.getScopes()).containsOnly("openid");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void issuerWhenOAuth2ScopesNullThenScopesDefaulted() throws Exception {
|
||||
this.response.remove("scopes_supported");
|
||||
|
||||
ClientRegistration registration = registrationOAuth2("", null).build();
|
||||
|
||||
assertThat(registration.getScopes()).containsOnly("openid");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void issuerWhenGrantTypesSupportedNullThenDefaulted() throws Exception {
|
||||
this.response.remove("grant_types_supported");
|
||||
|
||||
ClientRegistration registration = registration("").build();
|
||||
|
||||
assertThat(registration.getAuthorizationGrantType()).isEqualTo(AuthorizationGrantType.AUTHORIZATION_CODE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void issuerWhenOAuth2GrantTypesSupportedNullThenDefaulted() throws Exception {
|
||||
this.response.remove("grant_types_supported");
|
||||
|
||||
ClientRegistration registration = registrationOAuth2("", null).build();
|
||||
|
||||
assertThat(registration.getAuthorizationGrantType()).isEqualTo(AuthorizationGrantType.AUTHORIZATION_CODE);
|
||||
}
|
||||
|
||||
@@ -249,7 +239,6 @@ public class ClientRegistrationsTests {
|
||||
@Test
|
||||
public void issuerWhenGrantTypesSupportedInvalidThenException() {
|
||||
this.response.put("grant_types_supported", Arrays.asList("implicit"));
|
||||
|
||||
assertThatThrownBy(() -> registration("")).isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessageContaining("Only AuthorizationGrantType.AUTHORIZATION_CODE is supported. The issuer \""
|
||||
+ this.issuer + "\" returned a configuration of [implicit]");
|
||||
@@ -258,7 +247,6 @@ public class ClientRegistrationsTests {
|
||||
@Test
|
||||
public void issuerWhenOAuth2GrantTypesSupportedInvalidThenException() {
|
||||
this.response.put("grant_types_supported", Arrays.asList("implicit"));
|
||||
|
||||
assertThatThrownBy(() -> registrationOAuth2("", null)).isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessageContaining("Only AuthorizationGrantType.AUTHORIZATION_CODE is supported. The issuer \""
|
||||
+ this.issuer + "\" returned a configuration of [implicit]");
|
||||
@@ -267,54 +255,42 @@ public class ClientRegistrationsTests {
|
||||
@Test
|
||||
public void issuerWhenTokenEndpointAuthMethodsNullThenDefaulted() throws Exception {
|
||||
this.response.remove("token_endpoint_auth_methods_supported");
|
||||
|
||||
ClientRegistration registration = registration("").build();
|
||||
|
||||
assertThat(registration.getClientAuthenticationMethod()).isEqualTo(ClientAuthenticationMethod.BASIC);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void issuerWhenOAuth2TokenEndpointAuthMethodsNullThenDefaulted() throws Exception {
|
||||
this.response.remove("token_endpoint_auth_methods_supported");
|
||||
|
||||
ClientRegistration registration = registrationOAuth2("", null).build();
|
||||
|
||||
assertThat(registration.getClientAuthenticationMethod()).isEqualTo(ClientAuthenticationMethod.BASIC);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void issuerWhenTokenEndpointAuthMethodsPostThenMethodIsPost() throws Exception {
|
||||
this.response.put("token_endpoint_auth_methods_supported", Arrays.asList("client_secret_post"));
|
||||
|
||||
ClientRegistration registration = registration("").build();
|
||||
|
||||
assertThat(registration.getClientAuthenticationMethod()).isEqualTo(ClientAuthenticationMethod.POST);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void issuerWhenOAuth2TokenEndpointAuthMethodsPostThenMethodIsPost() throws Exception {
|
||||
this.response.put("token_endpoint_auth_methods_supported", Arrays.asList("client_secret_post"));
|
||||
|
||||
ClientRegistration registration = registrationOAuth2("", null).build();
|
||||
|
||||
assertThat(registration.getClientAuthenticationMethod()).isEqualTo(ClientAuthenticationMethod.POST);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void issuerWhenTokenEndpointAuthMethodsNoneThenMethodIsNone() throws Exception {
|
||||
this.response.put("token_endpoint_auth_methods_supported", Arrays.asList("none"));
|
||||
|
||||
ClientRegistration registration = registration("").build();
|
||||
|
||||
assertThat(registration.getClientAuthenticationMethod()).isEqualTo(ClientAuthenticationMethod.NONE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void issuerWhenOAuth2TokenEndpointAuthMethodsNoneThenMethodIsNone() throws Exception {
|
||||
this.response.put("token_endpoint_auth_methods_supported", Arrays.asList("none"));
|
||||
|
||||
ClientRegistration registration = registrationOAuth2("", null).build();
|
||||
|
||||
assertThat(registration.getClientAuthenticationMethod()).isEqualTo(ClientAuthenticationMethod.NONE);
|
||||
}
|
||||
|
||||
@@ -325,7 +301,6 @@ public class ClientRegistrationsTests {
|
||||
@Test
|
||||
public void issuerWhenTokenEndpointAuthMethodsInvalidThenException() {
|
||||
this.response.put("token_endpoint_auth_methods_supported", Arrays.asList("tls_client_auth"));
|
||||
|
||||
assertThatThrownBy(() -> registration("")).isInstanceOf(IllegalArgumentException.class).hasMessageContaining(
|
||||
"Only ClientAuthenticationMethod.BASIC, ClientAuthenticationMethod.POST and ClientAuthenticationMethod.NONE are supported. The issuer \""
|
||||
+ this.issuer + "\" returned a configuration of [tls_client_auth]");
|
||||
@@ -334,7 +309,6 @@ public class ClientRegistrationsTests {
|
||||
@Test
|
||||
public void issuerWhenOAuth2TokenEndpointAuthMethodsInvalidThenException() {
|
||||
this.response.put("token_endpoint_auth_methods_supported", Arrays.asList("tls_client_auth"));
|
||||
|
||||
assertThatThrownBy(() -> registrationOAuth2("", null)).isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessageContaining(
|
||||
"Only ClientAuthenticationMethod.BASIC, ClientAuthenticationMethod.POST and ClientAuthenticationMethod.NONE are supported. The issuer \""
|
||||
@@ -384,7 +358,6 @@ public class ClientRegistrationsTests {
|
||||
MockResponse mockResponse = new MockResponse().setBody(body).setHeader(HttpHeaders.CONTENT_TYPE,
|
||||
MediaType.APPLICATION_JSON_VALUE);
|
||||
this.server.enqueue(mockResponse);
|
||||
|
||||
return ClientRegistrations.fromOidcIssuerLocation(this.issuer).clientId("client-id")
|
||||
.clientSecret("client-secret");
|
||||
}
|
||||
@@ -394,7 +367,6 @@ public class ClientRegistrationsTests {
|
||||
this.response.put("issuer", this.issuer);
|
||||
this.issuer = this.server.url(path).toString();
|
||||
final String responseBody = (body != null) ? body : this.mapper.writeValueAsString(this.response);
|
||||
|
||||
final Dispatcher dispatcher = new Dispatcher() {
|
||||
@Override
|
||||
public MockResponse dispatch(RecordedRequest request) {
|
||||
@@ -406,9 +378,7 @@ public class ClientRegistrationsTests {
|
||||
return new MockResponse().setResponseCode(404);
|
||||
}
|
||||
};
|
||||
|
||||
this.server.setDispatcher(dispatcher);
|
||||
|
||||
return ClientRegistrations.fromIssuerLocation(this.issuer).clientId("client-id").clientSecret("client-secret");
|
||||
}
|
||||
|
||||
@@ -428,9 +398,7 @@ public class ClientRegistrationsTests {
|
||||
private ClientRegistration.Builder registrationOidcFallback(String path, String body) throws Exception {
|
||||
this.issuer = createIssuerFromServer(path);
|
||||
this.response.put("issuer", this.issuer);
|
||||
|
||||
String responseBody = (body != null) ? body : this.mapper.writeValueAsString(this.response);
|
||||
|
||||
final Dispatcher dispatcher = new Dispatcher() {
|
||||
@Override
|
||||
public MockResponse dispatch(RecordedRequest request) {
|
||||
@@ -443,7 +411,6 @@ public class ClientRegistrationsTests {
|
||||
}
|
||||
};
|
||||
this.server.setDispatcher(dispatcher);
|
||||
|
||||
return ClientRegistrations.fromIssuerLocation(this.issuer).clientId("client-id").clientSecret("client-secret");
|
||||
}
|
||||
|
||||
|
||||
@@ -71,7 +71,6 @@ public class CustomUserTypesOAuth2UserServiceTests {
|
||||
String registrationId = "client-registration-id-1";
|
||||
this.clientRegistrationBuilder = TestClientRegistrations.clientRegistration().registrationId(registrationId);
|
||||
this.accessToken = TestOAuth2AccessTokens.noScopes();
|
||||
|
||||
Map<String, Class<? extends OAuth2User>> customUserTypes = new HashMap<>();
|
||||
customUserTypes.put(registrationId, CustomOAuth2User.class);
|
||||
this.userService = new CustomUserTypesOAuth2UserService(customUserTypes);
|
||||
@@ -116,7 +115,6 @@ public class CustomUserTypesOAuth2UserServiceTests {
|
||||
public void loadUserWhenCustomUserTypeNotFoundThenReturnNull() {
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientRegistration()
|
||||
.registrationId("other-client-registration-id-1").build();
|
||||
|
||||
OAuth2User user = this.userService.loadUser(new OAuth2UserRequest(clientRegistration, this.accessToken));
|
||||
assertThat(user).isNull();
|
||||
}
|
||||
@@ -126,20 +124,15 @@ public class CustomUserTypesOAuth2UserServiceTests {
|
||||
String userInfoResponse = "{\n" + " \"id\": \"12345\",\n" + " \"name\": \"first last\",\n"
|
||||
+ " \"login\": \"user1\",\n" + " \"email\": \"user1@example.com\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(userInfoResponse));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri).build();
|
||||
|
||||
OAuth2User user = this.userService.loadUser(new OAuth2UserRequest(clientRegistration, this.accessToken));
|
||||
|
||||
assertThat(user.getName()).isEqualTo("first last");
|
||||
assertThat(user.getAttributes().size()).isEqualTo(4);
|
||||
assertThat((String) user.getAttribute("id")).isEqualTo("12345");
|
||||
assertThat((String) user.getAttribute("name")).isEqualTo("first last");
|
||||
assertThat((String) user.getAttribute("login")).isEqualTo("user1");
|
||||
assertThat((String) user.getAttribute("email")).isEqualTo("user1@example.com");
|
||||
|
||||
assertThat(user.getAuthorities().size()).isEqualTo(1);
|
||||
assertThat(user.getAuthorities().iterator().next().getAuthority()).isEqualTo("ROLE_USER");
|
||||
}
|
||||
@@ -149,16 +142,12 @@ public class CustomUserTypesOAuth2UserServiceTests {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString(
|
||||
"[invalid_user_info_response] An error occurred while attempting to retrieve the UserInfo Resource"));
|
||||
|
||||
String userInfoResponse = "{\n" + " \"id\": \"12345\",\n" + " \"name\": \"first last\",\n"
|
||||
+ " \"login\": \"user1\",\n" + " \"email\": \"user1@example.com\"\n";
|
||||
// "}\n"; // Make the JSON invalid/malformed
|
||||
this.server.enqueue(jsonResponse(userInfoResponse));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri).build();
|
||||
|
||||
this.userService.loadUser(new OAuth2UserRequest(clientRegistration, this.accessToken));
|
||||
}
|
||||
|
||||
@@ -167,13 +156,9 @@ public class CustomUserTypesOAuth2UserServiceTests {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString(
|
||||
"[invalid_user_info_response] An error occurred while attempting to retrieve the UserInfo Resource: 500 Server Error"));
|
||||
|
||||
this.server.enqueue(new MockResponse().setResponseCode(500));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri).build();
|
||||
|
||||
this.userService.loadUser(new OAuth2UserRequest(clientRegistration, this.accessToken));
|
||||
}
|
||||
|
||||
@@ -182,11 +167,8 @@ public class CustomUserTypesOAuth2UserServiceTests {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString(
|
||||
"[invalid_user_info_response] An error occurred while attempting to retrieve the UserInfo Resource"));
|
||||
|
||||
String userInfoUri = "https://invalid-provider.com/user";
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri).build();
|
||||
|
||||
this.userService.loadUser(new OAuth2UserRequest(clientRegistration, this.accessToken));
|
||||
}
|
||||
|
||||
|
||||
@@ -112,7 +112,6 @@ public class DefaultOAuth2UserServiceTests {
|
||||
public void loadUserWhenUserInfoUriIsNullThenThrowOAuth2AuthenticationException() {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString("missing_user_info_uri"));
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.build();
|
||||
this.userService.loadUser(new OAuth2UserRequest(clientRegistration, this.accessToken));
|
||||
}
|
||||
@@ -121,7 +120,6 @@ public class DefaultOAuth2UserServiceTests {
|
||||
public void loadUserWhenUserNameAttributeNameIsNullThenThrowOAuth2AuthenticationException() {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString("missing_user_name_attribute"));
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri("https://provider.com/user")
|
||||
.build();
|
||||
this.userService.loadUser(new OAuth2UserRequest(clientRegistration, this.accessToken));
|
||||
@@ -133,14 +131,10 @@ public class DefaultOAuth2UserServiceTests {
|
||||
+ " \"last-name\": \"last\",\n" + " \"middle-name\": \"middle\",\n"
|
||||
+ " \"address\": \"address\",\n" + " \"email\": \"user1@example.com\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(userInfoResponse));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri)
|
||||
.userInfoAuthenticationMethod(AuthenticationMethod.HEADER).userNameAttributeName("user-name").build();
|
||||
|
||||
OAuth2User user = this.userService.loadUser(new OAuth2UserRequest(clientRegistration, this.accessToken));
|
||||
|
||||
assertThat(user.getName()).isEqualTo("user1");
|
||||
assertThat(user.getAttributes().size()).isEqualTo(6);
|
||||
assertThat((String) user.getAttribute("user-name")).isEqualTo("user1");
|
||||
@@ -149,7 +143,6 @@ public class DefaultOAuth2UserServiceTests {
|
||||
assertThat((String) user.getAttribute("middle-name")).isEqualTo("middle");
|
||||
assertThat((String) user.getAttribute("address")).isEqualTo("address");
|
||||
assertThat((String) user.getAttribute("email")).isEqualTo("user1@example.com");
|
||||
|
||||
assertThat(user.getAuthorities().size()).isEqualTo(1);
|
||||
assertThat(user.getAuthorities().iterator().next()).isInstanceOf(OAuth2UserAuthority.class);
|
||||
OAuth2UserAuthority userAuthority = (OAuth2UserAuthority) user.getAuthorities().iterator().next();
|
||||
@@ -162,18 +155,14 @@ public class DefaultOAuth2UserServiceTests {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString(
|
||||
"[invalid_user_info_response] An error occurred while attempting to retrieve the UserInfo Resource"));
|
||||
|
||||
String userInfoResponse = "{\n" + " \"user-name\": \"user1\",\n" + " \"first-name\": \"first\",\n"
|
||||
+ " \"last-name\": \"last\",\n" + " \"middle-name\": \"middle\",\n"
|
||||
+ " \"address\": \"address\",\n" + " \"email\": \"user1@example.com\"\n";
|
||||
// "}\n"; // Make the JSON invalid/malformed
|
||||
this.server.enqueue(jsonResponse(userInfoResponse));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri)
|
||||
.userInfoAuthenticationMethod(AuthenticationMethod.HEADER).userNameAttributeName("user-name").build();
|
||||
|
||||
this.userService.loadUser(new OAuth2UserRequest(clientRegistration, this.accessToken));
|
||||
}
|
||||
|
||||
@@ -184,19 +173,14 @@ public class DefaultOAuth2UserServiceTests {
|
||||
"[invalid_user_info_response] An error occurred while attempting to retrieve the UserInfo Resource"));
|
||||
this.exception.expectMessage(
|
||||
containsString("Error Code: insufficient_scope, Error Description: The access token expired"));
|
||||
|
||||
String wwwAuthenticateHeader = "Bearer realm=\"auth-realm\" error=\"insufficient_scope\" error_description=\"The access token expired\"";
|
||||
|
||||
MockResponse response = new MockResponse();
|
||||
response.setHeader(HttpHeaders.WWW_AUTHENTICATE, wwwAuthenticateHeader);
|
||||
response.setResponseCode(400);
|
||||
this.server.enqueue(response);
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri)
|
||||
.userInfoAuthenticationMethod(AuthenticationMethod.HEADER).userNameAttributeName("user-name").build();
|
||||
|
||||
this.userService.loadUser(new OAuth2UserRequest(clientRegistration, this.accessToken));
|
||||
}
|
||||
|
||||
@@ -206,15 +190,11 @@ public class DefaultOAuth2UserServiceTests {
|
||||
this.exception.expectMessage(containsString(
|
||||
"[invalid_user_info_response] An error occurred while attempting to retrieve the UserInfo Resource"));
|
||||
this.exception.expectMessage(containsString("Error Code: invalid_token"));
|
||||
|
||||
String userInfoErrorResponse = "{\n" + " \"error\": \"invalid_token\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(userInfoErrorResponse).setResponseCode(400));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri)
|
||||
.userInfoAuthenticationMethod(AuthenticationMethod.HEADER).userNameAttributeName("user-name").build();
|
||||
|
||||
this.userService.loadUser(new OAuth2UserRequest(clientRegistration, this.accessToken));
|
||||
}
|
||||
|
||||
@@ -223,14 +203,10 @@ public class DefaultOAuth2UserServiceTests {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString(
|
||||
"[invalid_user_info_response] An error occurred while attempting to retrieve the UserInfo Resource: 500 Server Error"));
|
||||
|
||||
this.server.enqueue(new MockResponse().setResponseCode(500));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri)
|
||||
.userInfoAuthenticationMethod(AuthenticationMethod.HEADER).userNameAttributeName("user-name").build();
|
||||
|
||||
this.userService.loadUser(new OAuth2UserRequest(clientRegistration, this.accessToken));
|
||||
}
|
||||
|
||||
@@ -239,12 +215,9 @@ public class DefaultOAuth2UserServiceTests {
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString(
|
||||
"[invalid_user_info_response] An error occurred while attempting to retrieve the UserInfo Resource"));
|
||||
|
||||
String userInfoUri = "https://invalid-provider.com/user";
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri)
|
||||
.userInfoAuthenticationMethod(AuthenticationMethod.HEADER).userNameAttributeName("user-name").build();
|
||||
|
||||
this.userService.loadUser(new OAuth2UserRequest(clientRegistration, this.accessToken));
|
||||
}
|
||||
|
||||
@@ -255,12 +228,9 @@ public class DefaultOAuth2UserServiceTests {
|
||||
+ " \"last-name\": \"last\",\n" + " \"middle-name\": \"middle\",\n"
|
||||
+ " \"address\": \"address\",\n" + " \"email\": \"user1@example.com\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(userInfoResponse));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri)
|
||||
.userInfoAuthenticationMethod(AuthenticationMethod.HEADER).userNameAttributeName("user-name").build();
|
||||
|
||||
this.userService.loadUser(new OAuth2UserRequest(clientRegistration, this.accessToken));
|
||||
assertThat(this.server.takeRequest(1, TimeUnit.SECONDS).getHeader(HttpHeaders.ACCEPT))
|
||||
.isEqualTo(MediaType.APPLICATION_JSON_VALUE);
|
||||
@@ -273,12 +243,9 @@ public class DefaultOAuth2UserServiceTests {
|
||||
+ " \"last-name\": \"last\",\n" + " \"middle-name\": \"middle\",\n"
|
||||
+ " \"address\": \"address\",\n" + " \"email\": \"user1@example.com\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(userInfoResponse));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri)
|
||||
.userInfoAuthenticationMethod(AuthenticationMethod.HEADER).userNameAttributeName("user-name").build();
|
||||
|
||||
this.userService.loadUser(new OAuth2UserRequest(clientRegistration, this.accessToken));
|
||||
RecordedRequest request = this.server.takeRequest();
|
||||
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET.name());
|
||||
@@ -294,12 +261,9 @@ public class DefaultOAuth2UserServiceTests {
|
||||
+ " \"last-name\": \"last\",\n" + " \"middle-name\": \"middle\",\n"
|
||||
+ " \"address\": \"address\",\n" + " \"email\": \"user1@example.com\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(userInfoResponse));
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri)
|
||||
.userInfoAuthenticationMethod(AuthenticationMethod.FORM).userNameAttributeName("user-name").build();
|
||||
|
||||
this.userService.loadUser(new OAuth2UserRequest(clientRegistration, this.accessToken));
|
||||
RecordedRequest request = this.server.takeRequest();
|
||||
assertThat(request.getMethod()).isEqualTo(HttpMethod.POST.name());
|
||||
@@ -316,7 +280,6 @@ public class DefaultOAuth2UserServiceTests {
|
||||
OAuth2UserRequest request = new OAuth2UserRequest(TestClientRegistrations.clientRegistration().build(),
|
||||
TestOAuth2AccessTokens.scopes("message:read", "message:write"));
|
||||
OAuth2User user = userService.loadUser(request);
|
||||
|
||||
assertThat(user.getAuthorities()).hasSize(3);
|
||||
Iterator<? extends GrantedAuthority> authorities = user.getAuthorities().iterator();
|
||||
assertThat(authorities.next()).isInstanceOf(OAuth2UserAuthority.class);
|
||||
@@ -332,7 +295,6 @@ public class DefaultOAuth2UserServiceTests {
|
||||
OAuth2UserRequest request = new OAuth2UserRequest(TestClientRegistrations.clientRegistration().build(),
|
||||
TestOAuth2AccessTokens.noScopes());
|
||||
OAuth2User user = userService.loadUser(request);
|
||||
|
||||
assertThat(user.getAuthorities()).hasSize(1);
|
||||
Iterator<? extends GrantedAuthority> authorities = user.getAuthorities().iterator();
|
||||
assertThat(authorities.next()).isInstanceOf(OAuth2UserAuthority.class);
|
||||
@@ -342,20 +304,16 @@ public class DefaultOAuth2UserServiceTests {
|
||||
@Test
|
||||
public void loadUserWhenUserInfoSuccessResponseInvalidContentTypeThenThrowOAuth2AuthenticationException() {
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
this.exception.expect(OAuth2AuthenticationException.class);
|
||||
this.exception.expectMessage(containsString(
|
||||
"[invalid_user_info_response] An error occurred while attempting to retrieve the UserInfo Resource "
|
||||
+ "from '" + userInfoUri + "': response contains invalid content type 'text/plain'."));
|
||||
|
||||
MockResponse response = new MockResponse();
|
||||
response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE);
|
||||
response.setBody("invalid content type");
|
||||
this.server.enqueue(response);
|
||||
|
||||
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri)
|
||||
.userInfoAuthenticationMethod(AuthenticationMethod.HEADER).userNameAttributeName("user-name").build();
|
||||
|
||||
this.userService.loadUser(new OAuth2UserRequest(clientRegistration, this.accessToken));
|
||||
}
|
||||
|
||||
|
||||
@@ -77,9 +77,7 @@ public class DefaultReactiveOAuth2UserServiceTests {
|
||||
public void setup() throws Exception {
|
||||
this.server = new MockWebServer();
|
||||
this.server.start();
|
||||
|
||||
String userInfoUri = this.server.url("/user").toString();
|
||||
|
||||
this.clientRegistration = TestClientRegistrations.clientRegistration().userInfoUri(userInfoUri);
|
||||
}
|
||||
|
||||
@@ -97,7 +95,6 @@ public class DefaultReactiveOAuth2UserServiceTests {
|
||||
@Test
|
||||
public void loadUserWhenUserInfoUriIsNullThenThrowOAuth2AuthenticationException() {
|
||||
this.clientRegistration.userInfoUri(null);
|
||||
|
||||
StepVerifier.create(this.userService.loadUser(oauth2UserRequest())).expectErrorSatisfies((t) -> assertThat(t)
|
||||
.isInstanceOf(OAuth2AuthenticationException.class).hasMessageContaining("missing_user_info_uri"))
|
||||
.verify();
|
||||
@@ -106,7 +103,6 @@ public class DefaultReactiveOAuth2UserServiceTests {
|
||||
@Test
|
||||
public void loadUserWhenUserNameAttributeNameIsNullThenThrowOAuth2AuthenticationException() {
|
||||
this.clientRegistration.userNameAttributeName(null);
|
||||
|
||||
StepVerifier.create(this.userService.loadUser(oauth2UserRequest())).expectErrorSatisfies((t) -> assertThat(t)
|
||||
.isInstanceOf(OAuth2AuthenticationException.class).hasMessageContaining("missing_user_name_attribute"))
|
||||
.verify();
|
||||
@@ -118,9 +114,7 @@ public class DefaultReactiveOAuth2UserServiceTests {
|
||||
+ " \"last-name\": \"last\",\n" + " \"middle-name\": \"middle\",\n"
|
||||
+ " \"address\": \"address\",\n" + " \"email\": \"user1@example.com\"\n" + "}\n";
|
||||
enqueueApplicationJsonBody(userInfoResponse);
|
||||
|
||||
OAuth2User user = this.userService.loadUser(oauth2UserRequest()).block();
|
||||
|
||||
assertThat(user.getName()).isEqualTo("user1");
|
||||
assertThat(user.getAttributes().size()).isEqualTo(6);
|
||||
assertThat((String) user.getAttribute("id")).isEqualTo("user1");
|
||||
@@ -129,7 +123,6 @@ public class DefaultReactiveOAuth2UserServiceTests {
|
||||
assertThat((String) user.getAttribute("middle-name")).isEqualTo("middle");
|
||||
assertThat((String) user.getAttribute("address")).isEqualTo("address");
|
||||
assertThat((String) user.getAttribute("email")).isEqualTo("user1@example.com");
|
||||
|
||||
assertThat(user.getAuthorities().size()).isEqualTo(1);
|
||||
assertThat(user.getAuthorities().iterator().next()).isInstanceOf(OAuth2UserAuthority.class);
|
||||
OAuth2UserAuthority userAuthority = (OAuth2UserAuthority) user.getAuthorities().iterator().next();
|
||||
@@ -145,9 +138,7 @@ public class DefaultReactiveOAuth2UserServiceTests {
|
||||
+ " \"last-name\": \"last\",\n" + " \"middle-name\": \"middle\",\n"
|
||||
+ " \"address\": \"address\",\n" + " \"email\": \"user1@example.com\"\n" + "}\n";
|
||||
enqueueApplicationJsonBody(userInfoResponse);
|
||||
|
||||
this.userService.loadUser(oauth2UserRequest()).block();
|
||||
|
||||
RecordedRequest request = this.server.takeRequest();
|
||||
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET.name());
|
||||
assertThat(request.getHeader(HttpHeaders.ACCEPT)).isEqualTo(MediaType.APPLICATION_JSON_VALUE);
|
||||
@@ -163,9 +154,7 @@ public class DefaultReactiveOAuth2UserServiceTests {
|
||||
+ " \"last-name\": \"last\",\n" + " \"middle-name\": \"middle\",\n"
|
||||
+ " \"address\": \"address\",\n" + " \"email\": \"user1@example.com\"\n" + "}\n";
|
||||
enqueueApplicationJsonBody(userInfoResponse);
|
||||
|
||||
this.userService.loadUser(oauth2UserRequest()).block();
|
||||
|
||||
RecordedRequest request = this.server.takeRequest();
|
||||
assertThat(request.getMethod()).isEqualTo(HttpMethod.POST.name());
|
||||
assertThat(request.getHeader(HttpHeaders.ACCEPT)).isEqualTo(MediaType.APPLICATION_JSON_VALUE);
|
||||
@@ -180,7 +169,6 @@ public class DefaultReactiveOAuth2UserServiceTests {
|
||||
+ " \"address\": \"address\",\n" + " \"email\": \"user1@example.com\"\n";
|
||||
// "}\n"; // Make the JSON invalid/malformed
|
||||
enqueueApplicationJsonBody(userInfoResponse);
|
||||
|
||||
assertThatThrownBy(() -> this.userService.loadUser(oauth2UserRequest()).block())
|
||||
.isInstanceOf(OAuth2AuthenticationException.class).hasMessageContaining("invalid_user_info_response");
|
||||
}
|
||||
@@ -189,7 +177,6 @@ public class DefaultReactiveOAuth2UserServiceTests {
|
||||
public void loadUserWhenUserInfoErrorResponseThenThrowOAuth2AuthenticationException() {
|
||||
this.server.enqueue(new MockResponse().setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
|
||||
.setResponseCode(500).setBody("{}"));
|
||||
|
||||
assertThatThrownBy(() -> this.userService.loadUser(oauth2UserRequest()).block())
|
||||
.isInstanceOf(OAuth2AuthenticationException.class).hasMessageContaining("invalid_user_info_response");
|
||||
}
|
||||
@@ -209,7 +196,6 @@ public class DefaultReactiveOAuth2UserServiceTests {
|
||||
OAuth2UserRequest request = new OAuth2UserRequest(TestClientRegistrations.clientRegistration().build(),
|
||||
TestOAuth2AccessTokens.scopes("message:read", "message:write"));
|
||||
OAuth2User user = userService.loadUser(request).block();
|
||||
|
||||
assertThat(user.getAuthorities()).hasSize(3);
|
||||
Iterator<? extends GrantedAuthority> authorities = user.getAuthorities().iterator();
|
||||
assertThat(authorities.next()).isInstanceOf(OAuth2UserAuthority.class);
|
||||
@@ -225,7 +211,6 @@ public class DefaultReactiveOAuth2UserServiceTests {
|
||||
OAuth2UserRequest request = new OAuth2UserRequest(TestClientRegistrations.clientRegistration().build(),
|
||||
TestOAuth2AccessTokens.noScopes());
|
||||
OAuth2User user = userService.loadUser(request).block();
|
||||
|
||||
assertThat(user.getAuthorities()).hasSize(1);
|
||||
Iterator<? extends GrantedAuthority> authorities = user.getAuthorities().iterator();
|
||||
assertThat(authorities.next()).isInstanceOf(OAuth2UserAuthority.class);
|
||||
@@ -238,9 +223,7 @@ public class DefaultReactiveOAuth2UserServiceTests {
|
||||
response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE);
|
||||
response.setBody("invalid content type");
|
||||
this.server.enqueue(response);
|
||||
|
||||
OAuth2UserRequest userRequest = oauth2UserRequest();
|
||||
|
||||
assertThatThrownBy(() -> this.userService.loadUser(userRequest).block())
|
||||
.isInstanceOf(OAuth2AuthenticationException.class).hasMessageContaining(
|
||||
"[invalid_user_info_response] An error occurred while attempting to retrieve the UserInfo Resource from '"
|
||||
@@ -258,7 +241,6 @@ public class DefaultReactiveOAuth2UserServiceTests {
|
||||
given(spec.retrieve()).willReturn(clientResponse);
|
||||
given(clientResponse.onStatus(any(Predicate.class), any(Function.class))).willReturn(clientResponse);
|
||||
given(clientResponse.bodyToMono(any(ParameterizedTypeReference.class))).willReturn(Mono.just(body));
|
||||
|
||||
DefaultReactiveOAuth2UserService userService = new DefaultReactiveOAuth2UserService();
|
||||
userService.setWebClient(rest);
|
||||
return userService;
|
||||
@@ -269,7 +251,6 @@ public class DefaultReactiveOAuth2UserServiceTests {
|
||||
}
|
||||
|
||||
private void enqueueApplicationJsonBody(String json) {
|
||||
|
||||
this.server.enqueue(
|
||||
new MockResponse().setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).setBody(json));
|
||||
}
|
||||
|
||||
@@ -62,10 +62,8 @@ public class DelegatingOAuth2UserServiceTests {
|
||||
OAuth2UserService<OAuth2UserRequest, OAuth2User> userService3 = mock(OAuth2UserService.class);
|
||||
OAuth2User mockUser = mock(OAuth2User.class);
|
||||
given(userService3.loadUser(any(OAuth2UserRequest.class))).willReturn(mockUser);
|
||||
|
||||
DelegatingOAuth2UserService<OAuth2UserRequest, OAuth2User> delegatingUserService = new DelegatingOAuth2UserService<>(
|
||||
Arrays.asList(userService1, userService2, userService3));
|
||||
|
||||
OAuth2User loadedUser = delegatingUserService.loadUser(mock(OAuth2UserRequest.class));
|
||||
assertThat(loadedUser).isEqualTo(mockUser);
|
||||
}
|
||||
@@ -76,10 +74,8 @@ public class DelegatingOAuth2UserServiceTests {
|
||||
OAuth2UserService<OAuth2UserRequest, OAuth2User> userService1 = mock(OAuth2UserService.class);
|
||||
OAuth2UserService<OAuth2UserRequest, OAuth2User> userService2 = mock(OAuth2UserService.class);
|
||||
OAuth2UserService<OAuth2UserRequest, OAuth2User> userService3 = mock(OAuth2UserService.class);
|
||||
|
||||
DelegatingOAuth2UserService<OAuth2UserRequest, OAuth2User> delegatingUserService = new DelegatingOAuth2UserService<>(
|
||||
Arrays.asList(userService1, userService2, userService3));
|
||||
|
||||
OAuth2User loadedUser = delegatingUserService.loadUser(mock(OAuth2UserRequest.class));
|
||||
assertThat(loadedUser).isNull();
|
||||
}
|
||||
|
||||
@@ -49,13 +49,10 @@ public class OAuth2UserRequestEntityConverterTests {
|
||||
public void convertWhenAuthenticationMethodHeaderThenGetRequest() {
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientRegistration().build();
|
||||
OAuth2UserRequest userRequest = new OAuth2UserRequest(clientRegistration, this.createAccessToken());
|
||||
|
||||
RequestEntity<?> requestEntity = this.converter.convert(userRequest);
|
||||
|
||||
assertThat(requestEntity.getMethod()).isEqualTo(HttpMethod.GET);
|
||||
assertThat(requestEntity.getUrl().toASCIIString())
|
||||
.isEqualTo(clientRegistration.getProviderDetails().getUserInfoEndpoint().getUri());
|
||||
|
||||
HttpHeaders headers = requestEntity.getHeaders();
|
||||
assertThat(headers.getAccept()).contains(MediaType.APPLICATION_JSON);
|
||||
assertThat(headers.getFirst(HttpHeaders.AUTHORIZATION))
|
||||
@@ -68,18 +65,14 @@ public class OAuth2UserRequestEntityConverterTests {
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientRegistration()
|
||||
.userInfoAuthenticationMethod(AuthenticationMethod.FORM).build();
|
||||
OAuth2UserRequest userRequest = new OAuth2UserRequest(clientRegistration, this.createAccessToken());
|
||||
|
||||
RequestEntity<?> requestEntity = this.converter.convert(userRequest);
|
||||
|
||||
assertThat(requestEntity.getMethod()).isEqualTo(HttpMethod.POST);
|
||||
assertThat(requestEntity.getUrl().toASCIIString())
|
||||
.isEqualTo(clientRegistration.getProviderDetails().getUserInfoEndpoint().getUri());
|
||||
|
||||
HttpHeaders headers = requestEntity.getHeaders();
|
||||
assertThat(headers.getAccept()).contains(MediaType.APPLICATION_JSON);
|
||||
assertThat(headers.getContentType())
|
||||
.isEqualTo(MediaType.valueOf(MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8"));
|
||||
|
||||
MultiValueMap<String, String> formParameters = (MultiValueMap<String, String>) requestEntity.getBody();
|
||||
assertThat(formParameters.getFirst(OAuth2ParameterNames.ACCESS_TOKEN))
|
||||
.isEqualTo(userRequest.getAccessToken().getTokenValue());
|
||||
|
||||
@@ -77,7 +77,6 @@ public class OAuth2UserRequestTests {
|
||||
public void constructorWhenAllParametersProvidedAndValidThenCreated() {
|
||||
OAuth2UserRequest userRequest = new OAuth2UserRequest(this.clientRegistration, this.accessToken,
|
||||
this.additionalParameters);
|
||||
|
||||
assertThat(userRequest.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(userRequest.getAccessToken()).isEqualTo(this.accessToken);
|
||||
assertThat(userRequest.getAdditionalParameters()).containsAllEntriesOf(this.additionalParameters);
|
||||
|
||||
@@ -107,7 +107,6 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
String requestUri = "/path";
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
|
||||
assertThat(authorizationRequest).isNull();
|
||||
}
|
||||
@@ -120,9 +119,7 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
request.setContent("foo".getBytes(StandardCharsets.UTF_8));
|
||||
request.setCharacterEncoding(StandardCharsets.UTF_8.name());
|
||||
HttpServletRequest spyRequest = Mockito.spy(request);
|
||||
|
||||
this.resolver.resolve(spyRequest);
|
||||
|
||||
Mockito.verify(spyRequest, Mockito.never()).getReader();
|
||||
Mockito.verify(spyRequest, Mockito.never()).getInputStream();
|
||||
Mockito.verify(spyRequest, Mockito.never()).getParameter(ArgumentMatchers.anyString());
|
||||
@@ -138,7 +135,6 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
+ "-invalid";
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
assertThatThrownBy(() -> this.resolver.resolve(request)).isInstanceOf(IllegalArgumentException.class)
|
||||
.hasMessage(
|
||||
"Invalid Client Registration with Id: " + clientRegistration.getRegistrationId() + "-invalid");
|
||||
@@ -150,7 +146,6 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
String requestUri = this.authorizationRequestBaseUri + "/" + clientRegistration.getRegistrationId();
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
|
||||
assertThat(authorizationRequest).isNotNull();
|
||||
assertThat(authorizationRequest.getAuthorizationUri())
|
||||
@@ -178,7 +173,6 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
String requestUri = "/path";
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request,
|
||||
clientRegistration.getRegistrationId());
|
||||
assertThat(authorizationRequest).isNotNull();
|
||||
@@ -192,7 +186,6 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
String requestUri = this.authorizationRequestBaseUri + "/" + clientRegistration.getRegistrationId();
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
|
||||
assertThat(authorizationRequest.getRedirectUri()).isNotEqualTo(clientRegistration.getRedirectUri());
|
||||
assertThat(authorizationRequest.getRedirectUri())
|
||||
@@ -206,7 +199,6 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.setServerPort(8080);
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
|
||||
assertThat(authorizationRequest.getRedirectUri()).isNotEqualTo(clientRegistration.getRedirectUri());
|
||||
assertThat(authorizationRequest.getRedirectUri())
|
||||
@@ -221,7 +213,6 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
request.setScheme("https");
|
||||
request.setServerPort(8081);
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
|
||||
assertThat(authorizationRequest.getRedirectUri()).isNotEqualTo(clientRegistration.getRedirectUri());
|
||||
assertThat(authorizationRequest.getRedirectUri())
|
||||
@@ -236,7 +227,6 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
request.setScheme("http");
|
||||
request.setServerPort(80);
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
|
||||
assertThat(authorizationRequest.getRedirectUri()).isNotEqualTo(clientRegistration.getRedirectUri());
|
||||
assertThat(authorizationRequest.getRedirectUri())
|
||||
@@ -251,7 +241,6 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
request.setScheme("https");
|
||||
request.setServerPort(443);
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
|
||||
assertThat(authorizationRequest.getRedirectUri()).isNotEqualTo(clientRegistration.getRedirectUri());
|
||||
assertThat(authorizationRequest.getRedirectUri())
|
||||
@@ -266,7 +255,6 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
request.setScheme("https");
|
||||
request.setServerPort(-1);
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
|
||||
assertThat(authorizationRequest.getRedirectUri()).isNotEqualTo(clientRegistration.getRedirectUri());
|
||||
assertThat(authorizationRequest.getRedirectUri())
|
||||
@@ -281,7 +269,6 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.setServletPath(requestUri);
|
||||
request.setQueryString("foo=bar");
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
|
||||
assertThat(authorizationRequest.getRedirectUri()).isNotEqualTo(clientRegistration.getRedirectUri());
|
||||
assertThat(authorizationRequest.getRedirectUri())
|
||||
@@ -297,7 +284,6 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
request.setServerName("localhost");
|
||||
request.setServerPort(80);
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri())
|
||||
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
|
||||
@@ -314,7 +300,6 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
request.setServerName("example.com");
|
||||
request.setServerPort(443);
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri())
|
||||
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
|
||||
@@ -328,7 +313,6 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
String requestUri = "/path";
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request,
|
||||
clientRegistration.getRegistrationId());
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri())
|
||||
@@ -343,7 +327,6 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
String requestUri = this.authorizationRequestBaseUri + "/" + clientRegistration.getRegistrationId();
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri())
|
||||
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id-2&"
|
||||
@@ -358,7 +341,6 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.addParameter("action", "authorize");
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri())
|
||||
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
|
||||
@@ -373,7 +355,6 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.addParameter("action", "login");
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri())
|
||||
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id-2&"
|
||||
@@ -387,7 +368,6 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
String requestUri = this.authorizationRequestBaseUri + "/" + clientRegistration.getRegistrationId();
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
|
||||
assertThat(authorizationRequest).isNotNull();
|
||||
assertThat(authorizationRequest.getAuthorizationUri())
|
||||
@@ -422,7 +402,6 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
String requestUri = this.authorizationRequestBaseUri + "/" + clientRegistration.getRegistrationId();
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
|
||||
assertThat(authorizationRequest).isNotNull();
|
||||
assertThat(authorizationRequest.getAuthorizationUri())
|
||||
@@ -456,11 +435,9 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
String requestUri = this.authorizationRequestBaseUri + "/" + clientRegistration.getRegistrationId();
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
this.resolver.setAuthorizationRequestCustomizer(
|
||||
(customizer) -> customizer.additionalParameters((params) -> params.remove(OidcParameterNames.NONCE))
|
||||
.attributes((attrs) -> attrs.remove(OidcParameterNames.NONCE)));
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
|
||||
assertThat(authorizationRequest.getAdditionalParameters()).doesNotContainKey(OidcParameterNames.NONCE);
|
||||
assertThat(authorizationRequest.getAttributes()).doesNotContainKey(OidcParameterNames.NONCE);
|
||||
@@ -477,13 +454,11 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
String requestUri = this.authorizationRequestBaseUri + "/" + clientRegistration.getRegistrationId();
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
this.resolver
|
||||
.setAuthorizationRequestCustomizer((customizer) -> customizer.authorizationRequestUri((uriBuilder) -> {
|
||||
uriBuilder.queryParam("param1", "value1");
|
||||
return uriBuilder.build();
|
||||
}));
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri())
|
||||
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
|
||||
@@ -498,12 +473,10 @@ public class DefaultOAuth2AuthorizationRequestResolverTests {
|
||||
String requestUri = this.authorizationRequestBaseUri + "/" + clientRegistration.getRegistrationId();
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.setServletPath(requestUri);
|
||||
|
||||
this.resolver.setAuthorizationRequestCustomizer((customizer) -> customizer.parameters((params) -> {
|
||||
params.put("appid", params.get("client_id"));
|
||||
params.remove("client_id");
|
||||
}));
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri()).matches(
|
||||
"https://example.com/login/oauth/authorize\\?" + "response_type=code&" + "scope=openid&state=.{15,}&"
|
||||
|
||||
@@ -208,7 +208,6 @@ public class DefaultOAuth2AuthorizedClientManagerTests {
|
||||
public void authorizeWhenNotAuthorizedAndUnsupportedProviderThenNotAuthorized() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(this.clientRegistration);
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.attributes((attrs) -> {
|
||||
@@ -216,15 +215,12 @@ public class DefaultOAuth2AuthorizedClientManagerTests {
|
||||
attrs.put(HttpServletResponse.class.getName(), this.response);
|
||||
}).build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(authorizeRequest);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
assertThat(authorizedClient).isNull();
|
||||
verifyNoInteractions(this.authorizationSuccessHandler);
|
||||
verify(this.authorizedClientRepository, never()).saveAuthorizedClient(any(), any(), any(), any());
|
||||
@@ -235,10 +231,8 @@ public class DefaultOAuth2AuthorizedClientManagerTests {
|
||||
public void authorizeWhenNotAuthorizedAndSupportedProviderThenAuthorized() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(this.clientRegistration);
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(this.authorizedClient);
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.attributes((attrs) -> {
|
||||
@@ -246,15 +240,12 @@ public class DefaultOAuth2AuthorizedClientManagerTests {
|
||||
attrs.put(HttpServletResponse.class.getName(), this.response);
|
||||
}).build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(authorizeRequest);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
assertThat(authorizedClient).isSameAs(this.authorizedClient);
|
||||
verify(this.authorizationSuccessHandler).onAuthorizationSuccess(eq(this.authorizedClient), eq(this.principal),
|
||||
any());
|
||||
@@ -269,13 +260,10 @@ public class DefaultOAuth2AuthorizedClientManagerTests {
|
||||
.willReturn(this.clientRegistration);
|
||||
given(this.authorizedClientRepository.loadAuthorizedClient(eq(this.clientRegistration.getRegistrationId()),
|
||||
eq(this.principal), eq(this.request))).willReturn(this.authorizedClient);
|
||||
|
||||
OAuth2AuthorizedClient reauthorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), TestOAuth2AccessTokens.noScopes(), TestOAuth2RefreshTokens.refreshToken());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(reauthorizedClient);
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.attributes((attrs) -> {
|
||||
@@ -283,15 +271,12 @@ public class DefaultOAuth2AuthorizedClientManagerTests {
|
||||
attrs.put(HttpServletResponse.class.getName(), this.response);
|
||||
}).build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(authorizeRequest);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(any());
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isSameAs(this.authorizedClient);
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
assertThat(authorizedClient).isSameAs(reauthorizedClient);
|
||||
verify(this.authorizationSuccessHandler).onAuthorizationSuccess(eq(reauthorizedClient), eq(this.principal),
|
||||
any());
|
||||
@@ -303,10 +288,8 @@ public class DefaultOAuth2AuthorizedClientManagerTests {
|
||||
public void authorizeWhenRequestParameterUsernamePasswordThenMappedToContext() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(this.clientRegistration);
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(this.authorizedClient);
|
||||
|
||||
// Set custom contextAttributesMapper
|
||||
this.authorizedClientManager.setContextAttributesMapper((authorizeRequest) -> {
|
||||
Map<String, Object> contextAttributes = new HashMap<>();
|
||||
@@ -319,10 +302,8 @@ public class DefaultOAuth2AuthorizedClientManagerTests {
|
||||
}
|
||||
return contextAttributes;
|
||||
});
|
||||
|
||||
this.request.addParameter(OAuth2ParameterNames.USERNAME, "username");
|
||||
this.request.addParameter(OAuth2ParameterNames.PASSWORD, "password");
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.attributes((attrs) -> {
|
||||
@@ -330,9 +311,7 @@ public class DefaultOAuth2AuthorizedClientManagerTests {
|
||||
attrs.put(HttpServletResponse.class.getName(), this.response);
|
||||
}).build();
|
||||
this.authorizedClientManager.authorize(authorizeRequest);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
String username = authorizationContext.getAttribute(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME);
|
||||
assertThat(username).isEqualTo("username");
|
||||
@@ -349,15 +328,12 @@ public class DefaultOAuth2AuthorizedClientManagerTests {
|
||||
attrs.put(HttpServletResponse.class.getName(), this.response);
|
||||
}).build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(reauthorizeRequest);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(reauthorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isSameAs(this.authorizedClient);
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
assertThat(authorizedClient).isSameAs(this.authorizedClient);
|
||||
verifyNoInteractions(this.authorizationSuccessHandler);
|
||||
verify(this.authorizedClientRepository, never()).saveAuthorizedClient(any(OAuth2AuthorizedClient.class),
|
||||
@@ -369,25 +345,20 @@ public class DefaultOAuth2AuthorizedClientManagerTests {
|
||||
public void reauthorizeWhenSupportedProviderThenReauthorized() {
|
||||
OAuth2AuthorizedClient reauthorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), TestOAuth2AccessTokens.noScopes(), TestOAuth2RefreshTokens.refreshToken());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(reauthorizedClient);
|
||||
|
||||
OAuth2AuthorizeRequest reauthorizeRequest = OAuth2AuthorizeRequest.withAuthorizedClient(this.authorizedClient)
|
||||
.principal(this.principal).attributes((attrs) -> {
|
||||
attrs.put(HttpServletRequest.class.getName(), this.request);
|
||||
attrs.put(HttpServletResponse.class.getName(), this.response);
|
||||
}).build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(reauthorizeRequest);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(reauthorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isSameAs(this.authorizedClient);
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
assertThat(authorizedClient).isSameAs(reauthorizedClient);
|
||||
verify(this.authorizationSuccessHandler).onAuthorizationSuccess(eq(reauthorizedClient), eq(this.principal),
|
||||
any());
|
||||
@@ -399,25 +370,19 @@ public class DefaultOAuth2AuthorizedClientManagerTests {
|
||||
public void reauthorizeWhenRequestParameterScopeThenMappedToContext() {
|
||||
OAuth2AuthorizedClient reauthorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), TestOAuth2AccessTokens.noScopes(), TestOAuth2RefreshTokens.refreshToken());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(reauthorizedClient);
|
||||
|
||||
// Override the mock with the default
|
||||
this.authorizedClientManager
|
||||
.setContextAttributesMapper(new DefaultOAuth2AuthorizedClientManager.DefaultContextAttributesMapper());
|
||||
|
||||
this.request.addParameter(OAuth2ParameterNames.SCOPE, "read write");
|
||||
|
||||
OAuth2AuthorizeRequest reauthorizeRequest = OAuth2AuthorizeRequest.withAuthorizedClient(this.authorizedClient)
|
||||
.principal(this.principal).attributes((attrs) -> {
|
||||
attrs.put(HttpServletRequest.class.getName(), this.request);
|
||||
attrs.put(HttpServletResponse.class.getName(), this.response);
|
||||
}).build();
|
||||
this.authorizedClientManager.authorize(reauthorizeRequest);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
String[] requestScopeAttribute = authorizationContext
|
||||
.getAttribute(OAuth2AuthorizationContext.REQUEST_SCOPE_ATTRIBUTE_NAME);
|
||||
@@ -429,19 +394,15 @@ public class DefaultOAuth2AuthorizedClientManagerTests {
|
||||
ClientAuthorizationException authorizationException = new ClientAuthorizationException(
|
||||
new OAuth2Error(OAuth2ErrorCodes.INVALID_GRANT, null, null),
|
||||
this.clientRegistration.getRegistrationId());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willThrow(authorizationException);
|
||||
|
||||
OAuth2AuthorizeRequest reauthorizeRequest = OAuth2AuthorizeRequest.withAuthorizedClient(this.authorizedClient)
|
||||
.principal(this.principal).attributes((attrs) -> {
|
||||
attrs.put(HttpServletRequest.class.getName(), this.request);
|
||||
attrs.put(HttpServletResponse.class.getName(), this.response);
|
||||
}).build();
|
||||
|
||||
assertThatCode(() -> this.authorizedClientManager.authorize(reauthorizeRequest))
|
||||
.isEqualTo(authorizationException);
|
||||
|
||||
verify(this.authorizationFailureHandler).onAuthorizationFailure(eq(authorizationException), eq(this.principal),
|
||||
any());
|
||||
verify(this.authorizedClientRepository).removeAuthorizedClient(eq(this.clientRegistration.getRegistrationId()),
|
||||
@@ -452,19 +413,15 @@ public class DefaultOAuth2AuthorizedClientManagerTests {
|
||||
public void reauthorizeWhenErrorCodeDoesNotMatchThenDoNotRemoveAuthorizedClient() {
|
||||
ClientAuthorizationException authorizationException = new ClientAuthorizationException(
|
||||
new OAuth2Error("non-matching-error-code", null, null), this.clientRegistration.getRegistrationId());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willThrow(authorizationException);
|
||||
|
||||
OAuth2AuthorizeRequest reauthorizeRequest = OAuth2AuthorizeRequest.withAuthorizedClient(this.authorizedClient)
|
||||
.principal(this.principal).attributes((attrs) -> {
|
||||
attrs.put(HttpServletRequest.class.getName(), this.request);
|
||||
attrs.put(HttpServletResponse.class.getName(), this.response);
|
||||
}).build();
|
||||
|
||||
assertThatCode(() -> this.authorizedClientManager.authorize(reauthorizeRequest))
|
||||
.isEqualTo(authorizationException);
|
||||
|
||||
verify(this.authorizationFailureHandler).onAuthorizationFailure(eq(authorizationException), eq(this.principal),
|
||||
any());
|
||||
verifyNoInteractions(this.authorizedClientRepository);
|
||||
|
||||
@@ -199,21 +199,17 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
||||
public void authorizeWhenNotAuthorizedAndUnsupportedProviderThenNotAuthorized() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(authorizeRequest)
|
||||
.subscriberContext(this.context).block();
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
assertThat(authorizedClient).isNull();
|
||||
this.loadAuthorizedClientProbe.assertWasSubscribed();
|
||||
this.saveAuthorizedClientProbe.assertWasNotSubscribed();
|
||||
@@ -226,21 +222,17 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.just(this.authorizedClient));
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(authorizeRequest)
|
||||
.subscriberContext(this.context).block();
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
assertThat(authorizedClient).isSameAs(this.authorizedClient);
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(eq(this.authorizedClient), eq(this.principal),
|
||||
eq(this.serverWebExchange));
|
||||
@@ -255,26 +247,20 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.just(this.authorizedClient));
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
|
||||
PublisherProbe<Void> authorizationSuccessHandlerProbe = PublisherProbe.empty();
|
||||
this.authorizedClientManager.setAuthorizationSuccessHandler(
|
||||
(client, principal, attributes) -> authorizationSuccessHandlerProbe.mono());
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(authorizeRequest)
|
||||
.subscriberContext(this.context).block();
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
assertThat(authorizedClient).isSameAs(this.authorizedClient);
|
||||
authorizationSuccessHandlerProbe.assertWasSubscribed();
|
||||
verify(this.authorizedClientRepository, never()).saveAuthorizedClient(any(), any(), any());
|
||||
@@ -286,30 +272,23 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
||||
public void authorizeWhenInvalidTokenThenRemoveAuthorizedClient() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
|
||||
ClientAuthorizationException exception = new ClientAuthorizationException(
|
||||
new OAuth2Error(OAuth2ErrorCodes.INVALID_TOKEN, null, null),
|
||||
this.clientRegistration.getRegistrationId());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.error(exception));
|
||||
|
||||
assertThatCode(
|
||||
() -> this.authorizedClientManager.authorize(authorizeRequest).subscriberContext(this.context).block())
|
||||
.isEqualTo(exception);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
verify(this.authorizedClientRepository).removeAuthorizedClient(eq(this.clientRegistration.getRegistrationId()),
|
||||
eq(this.principal), eq(this.serverWebExchange));
|
||||
this.removeAuthorizedClientProbe.assertWasSubscribed();
|
||||
@@ -321,30 +300,23 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
||||
public void authorizeWhenInvalidGrantThenRemoveAuthorizedClient() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
|
||||
ClientAuthorizationException exception = new ClientAuthorizationException(
|
||||
new OAuth2Error(OAuth2ErrorCodes.INVALID_GRANT, null, null),
|
||||
this.clientRegistration.getRegistrationId());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.error(exception));
|
||||
|
||||
assertThatCode(
|
||||
() -> this.authorizedClientManager.authorize(authorizeRequest).subscriberContext(this.context).block())
|
||||
.isEqualTo(exception);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
verify(this.authorizedClientRepository).removeAuthorizedClient(eq(this.clientRegistration.getRegistrationId()),
|
||||
eq(this.principal), eq(this.serverWebExchange));
|
||||
this.removeAuthorizedClientProbe.assertWasSubscribed();
|
||||
@@ -356,30 +328,23 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
||||
public void authorizeWhenServerErrorThenDoNotRemoveAuthorizedClient() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
|
||||
ClientAuthorizationException exception = new ClientAuthorizationException(
|
||||
new OAuth2Error(OAuth2ErrorCodes.SERVER_ERROR, null, null),
|
||||
this.clientRegistration.getRegistrationId());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.error(exception));
|
||||
|
||||
assertThatCode(
|
||||
() -> this.authorizedClientManager.authorize(authorizeRequest).subscriberContext(this.context).block())
|
||||
.isEqualTo(exception);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
verify(this.authorizedClientRepository, never()).removeAuthorizedClient(any(), any(), any());
|
||||
verify(this.authorizedClientRepository, never()).saveAuthorizedClient(any(), any(), any());
|
||||
}
|
||||
@@ -389,29 +354,22 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
||||
public void authorizeWhenOAuth2AuthorizationExceptionThenDoNotRemoveAuthorizedClient() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
|
||||
OAuth2AuthorizationException exception = new OAuth2AuthorizationException(
|
||||
new OAuth2Error(OAuth2ErrorCodes.INVALID_GRANT, null, null));
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.error(exception));
|
||||
|
||||
assertThatCode(
|
||||
() -> this.authorizedClientManager.authorize(authorizeRequest).subscriberContext(this.context).block())
|
||||
.isEqualTo(exception);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
verify(this.authorizedClientRepository, never()).removeAuthorizedClient(any(), any(), any());
|
||||
verify(this.authorizedClientRepository, never()).saveAuthorizedClient(any(), any(), any());
|
||||
}
|
||||
@@ -421,33 +379,25 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
||||
public void authorizeWhenOAuth2AuthorizationExceptionAndCustomFailureHandlerThenInvokeCustomFailureHandler() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
|
||||
OAuth2AuthorizationException exception = new OAuth2AuthorizationException(
|
||||
new OAuth2Error(OAuth2ErrorCodes.INVALID_GRANT, null, null));
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.error(exception));
|
||||
|
||||
PublisherProbe<Void> authorizationFailureHandlerProbe = PublisherProbe.empty();
|
||||
this.authorizedClientManager.setAuthorizationFailureHandler(
|
||||
(client, principal, attributes) -> authorizationFailureHandlerProbe.mono());
|
||||
|
||||
assertThatCode(
|
||||
() -> this.authorizedClientManager.authorize(authorizeRequest).subscriberContext(this.context).block())
|
||||
.isEqualTo(exception);
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(authorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isNull();
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
authorizationFailureHandlerProbe.assertWasSubscribed();
|
||||
verify(this.authorizedClientRepository, never()).removeAuthorizedClient(any(), any(), any());
|
||||
verify(this.authorizedClientRepository, never()).saveAuthorizedClient(any(), any(), any());
|
||||
@@ -461,27 +411,21 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
||||
this.loadAuthorizedClientProbe = PublisherProbe.of(Mono.just(this.authorizedClient));
|
||||
given(this.authorizedClientRepository.loadAuthorizedClient(eq(this.clientRegistration.getRegistrationId()),
|
||||
eq(this.principal), eq(this.serverWebExchange))).willReturn(this.loadAuthorizedClientProbe.mono());
|
||||
|
||||
OAuth2AuthorizedClient reauthorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), TestOAuth2AccessTokens.noScopes(), TestOAuth2RefreshTokens.refreshToken());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.just(reauthorizedClient));
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(authorizeRequest)
|
||||
.subscriberContext(this.context).block();
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(any());
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isSameAs(this.authorizedClient);
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
assertThat(authorizedClient).isSameAs(reauthorizedClient);
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(eq(reauthorizedClient), eq(this.principal),
|
||||
eq(this.serverWebExchange));
|
||||
@@ -493,10 +437,8 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
||||
public void authorizeWhenRequestFormParameterUsernamePasswordThenMappedToContext() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(this.clientRegistration.getRegistrationId())))
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.just(this.authorizedClient));
|
||||
|
||||
// Set custom contextAttributesMapper capable of mapping the form parameters
|
||||
this.authorizedClientManager.setContextAttributesMapper((authorizeRequest) -> currentServerWebExchange()
|
||||
.flatMap(ServerWebExchange::getFormData).map((formData) -> {
|
||||
@@ -507,19 +449,15 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
||||
contextAttributes.put(OAuth2AuthorizationContext.PASSWORD_ATTRIBUTE_NAME, password);
|
||||
return contextAttributes;
|
||||
}));
|
||||
|
||||
this.serverWebExchange = MockServerWebExchange.builder(MockServerHttpRequest.post("/")
|
||||
.contentType(MediaType.APPLICATION_FORM_URLENCODED).body("username=username&password=password"))
|
||||
.build();
|
||||
this.context = Context.of(ServerWebExchange.class, this.serverWebExchange);
|
||||
|
||||
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
|
||||
.withClientRegistrationId(this.clientRegistration.getRegistrationId()).principal(this.principal)
|
||||
.build();
|
||||
this.authorizedClientManager.authorize(authorizeRequest).subscriberContext(this.context).block();
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
String username = authorizationContext.getAttribute(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME);
|
||||
assertThat(username).isEqualTo("username");
|
||||
@@ -534,15 +472,12 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
||||
.principal(this.principal).build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(reauthorizeRequest)
|
||||
.subscriberContext(this.context).block();
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(reauthorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isSameAs(this.authorizedClient);
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
assertThat(authorizedClient).isSameAs(this.authorizedClient);
|
||||
this.saveAuthorizedClientProbe.assertWasNotSubscribed();
|
||||
}
|
||||
@@ -552,23 +487,18 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
||||
public void reauthorizeWhenSupportedProviderThenReauthorized() {
|
||||
OAuth2AuthorizedClient reauthorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), TestOAuth2AccessTokens.noScopes(), TestOAuth2RefreshTokens.refreshToken());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.just(reauthorizedClient));
|
||||
|
||||
OAuth2AuthorizeRequest reauthorizeRequest = OAuth2AuthorizeRequest.withAuthorizedClient(this.authorizedClient)
|
||||
.principal(this.principal).build();
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(reauthorizeRequest)
|
||||
.subscriberContext(this.context).block();
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
verify(this.contextAttributesMapper).apply(eq(reauthorizeRequest));
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
assertThat(authorizationContext.getClientRegistration()).isEqualTo(this.clientRegistration);
|
||||
assertThat(authorizationContext.getAuthorizedClient()).isSameAs(this.authorizedClient);
|
||||
assertThat(authorizationContext.getPrincipal()).isEqualTo(this.principal);
|
||||
|
||||
assertThat(authorizedClient).isSameAs(reauthorizedClient);
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(eq(reauthorizedClient), eq(this.principal),
|
||||
eq(this.serverWebExchange));
|
||||
@@ -580,24 +510,18 @@ public class DefaultReactiveOAuth2AuthorizedClientManagerTests {
|
||||
public void reauthorizeWhenRequestParameterScopeThenMappedToContext() {
|
||||
OAuth2AuthorizedClient reauthorizedClient = new OAuth2AuthorizedClient(this.clientRegistration,
|
||||
this.principal.getName(), TestOAuth2AccessTokens.noScopes(), TestOAuth2RefreshTokens.refreshToken());
|
||||
|
||||
given(this.authorizedClientProvider.authorize(any(OAuth2AuthorizationContext.class)))
|
||||
.willReturn(Mono.just(reauthorizedClient));
|
||||
|
||||
// Override the mock with the default
|
||||
this.authorizedClientManager.setContextAttributesMapper(
|
||||
new DefaultReactiveOAuth2AuthorizedClientManager.DefaultContextAttributesMapper());
|
||||
|
||||
this.serverWebExchange = MockServerWebExchange
|
||||
.builder(MockServerHttpRequest.get("/").queryParam(OAuth2ParameterNames.SCOPE, "read write")).build();
|
||||
this.context = Context.of(ServerWebExchange.class, this.serverWebExchange);
|
||||
|
||||
OAuth2AuthorizeRequest reauthorizeRequest = OAuth2AuthorizeRequest.withAuthorizedClient(this.authorizedClient)
|
||||
.principal(this.principal).build();
|
||||
this.authorizedClientManager.authorize(reauthorizeRequest).subscriberContext(this.context).block();
|
||||
|
||||
verify(this.authorizedClientProvider).authorize(this.authorizationContextCaptor.capture());
|
||||
|
||||
OAuth2AuthorizationContext authorizationContext = this.authorizationContextCaptor.getValue();
|
||||
String[] requestScopeAttribute = authorizationContext
|
||||
.getAttribute(OAuth2AuthorizationContext.REQUEST_SCOPE_ATTRIBUTE_NAME);
|
||||
|
||||
@@ -53,7 +53,6 @@ public class HttpSessionOAuth2AuthorizationRequestRepositoryTests {
|
||||
request.addParameter(OAuth2ParameterNames.STATE, "state-1234");
|
||||
OAuth2AuthorizationRequest authorizationRequest = this.authorizationRequestRepository
|
||||
.loadAuthorizationRequest(request);
|
||||
|
||||
assertThat(authorizationRequest).isNull();
|
||||
}
|
||||
|
||||
@@ -61,14 +60,11 @@ public class HttpSessionOAuth2AuthorizationRequestRepositoryTests {
|
||||
public void loadAuthorizationRequestWhenSavedThenReturnAuthorizationRequest() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = createAuthorizationRequest().build();
|
||||
|
||||
this.authorizationRequestRepository.saveAuthorizationRequest(authorizationRequest, request, response);
|
||||
request.addParameter(OAuth2ParameterNames.STATE, authorizationRequest.getState());
|
||||
OAuth2AuthorizationRequest loadedAuthorizationRequest = this.authorizationRequestRepository
|
||||
.loadAuthorizationRequest(request);
|
||||
|
||||
assertThat(loadedAuthorizationRequest).isEqualTo(authorizationRequest);
|
||||
}
|
||||
|
||||
@@ -77,30 +73,24 @@ public class HttpSessionOAuth2AuthorizationRequestRepositoryTests {
|
||||
public void loadAuthorizationRequestWhenMultipleSavedThenReturnMatchingAuthorizationRequest() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
|
||||
String state1 = "state-1122";
|
||||
OAuth2AuthorizationRequest authorizationRequest1 = createAuthorizationRequest().state(state1).build();
|
||||
this.authorizationRequestRepository.saveAuthorizationRequest(authorizationRequest1, request, response);
|
||||
|
||||
String state2 = "state-3344";
|
||||
OAuth2AuthorizationRequest authorizationRequest2 = createAuthorizationRequest().state(state2).build();
|
||||
this.authorizationRequestRepository.saveAuthorizationRequest(authorizationRequest2, request, response);
|
||||
|
||||
String state3 = "state-5566";
|
||||
OAuth2AuthorizationRequest authorizationRequest3 = createAuthorizationRequest().state(state3).build();
|
||||
this.authorizationRequestRepository.saveAuthorizationRequest(authorizationRequest3, request, response);
|
||||
|
||||
request.addParameter(OAuth2ParameterNames.STATE, state1);
|
||||
OAuth2AuthorizationRequest loadedAuthorizationRequest1 = this.authorizationRequestRepository
|
||||
.loadAuthorizationRequest(request);
|
||||
assertThat(loadedAuthorizationRequest1).isEqualTo(authorizationRequest1);
|
||||
|
||||
request.removeParameter(OAuth2ParameterNames.STATE);
|
||||
request.addParameter(OAuth2ParameterNames.STATE, state2);
|
||||
OAuth2AuthorizationRequest loadedAuthorizationRequest2 = this.authorizationRequestRepository
|
||||
.loadAuthorizationRequest(request);
|
||||
assertThat(loadedAuthorizationRequest2).isEqualTo(authorizationRequest2);
|
||||
|
||||
request.removeParameter(OAuth2ParameterNames.STATE);
|
||||
request.addParameter(OAuth2ParameterNames.STATE, state3);
|
||||
OAuth2AuthorizationRequest loadedAuthorizationRequest3 = this.authorizationRequestRepository
|
||||
@@ -111,18 +101,15 @@ public class HttpSessionOAuth2AuthorizationRequestRepositoryTests {
|
||||
@Test
|
||||
public void loadAuthorizationRequestWhenSavedAndStateParameterNullThenReturnNull() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = createAuthorizationRequest().build();
|
||||
this.authorizationRequestRepository.saveAuthorizationRequest(authorizationRequest, request,
|
||||
new MockHttpServletResponse());
|
||||
|
||||
assertThat(this.authorizationRequestRepository.loadAuthorizationRequest(request)).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void saveAuthorizationRequestWhenHttpServletRequestIsNullThenThrowIllegalArgumentException() {
|
||||
OAuth2AuthorizationRequest authorizationRequest = createAuthorizationRequest().build();
|
||||
|
||||
assertThatThrownBy(() -> this.authorizationRequestRepository.saveAuthorizationRequest(authorizationRequest,
|
||||
null, new MockHttpServletResponse())).isInstanceOf(IllegalArgumentException.class);
|
||||
}
|
||||
@@ -130,7 +117,6 @@ public class HttpSessionOAuth2AuthorizationRequestRepositoryTests {
|
||||
@Test
|
||||
public void saveAuthorizationRequestWhenHttpServletResponseIsNullThenThrowIllegalArgumentException() {
|
||||
OAuth2AuthorizationRequest authorizationRequest = createAuthorizationRequest().build();
|
||||
|
||||
assertThatThrownBy(() -> this.authorizationRequestRepository.saveAuthorizationRequest(authorizationRequest,
|
||||
new MockHttpServletRequest(), null)).isInstanceOf(IllegalArgumentException.class);
|
||||
}
|
||||
@@ -146,15 +132,12 @@ public class HttpSessionOAuth2AuthorizationRequestRepositoryTests {
|
||||
@Test
|
||||
public void saveAuthorizationRequestWhenNotNullThenSaved() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = createAuthorizationRequest().build();
|
||||
this.authorizationRequestRepository.saveAuthorizationRequest(authorizationRequest, request,
|
||||
new MockHttpServletResponse());
|
||||
|
||||
request.addParameter(OAuth2ParameterNames.STATE, authorizationRequest.getState());
|
||||
OAuth2AuthorizationRequest loadedAuthorizationRequest = this.authorizationRequestRepository
|
||||
.loadAuthorizationRequest(request);
|
||||
|
||||
assertThat(loadedAuthorizationRequest).isEqualTo(authorizationRequest);
|
||||
}
|
||||
|
||||
@@ -162,15 +145,12 @@ public class HttpSessionOAuth2AuthorizationRequestRepositoryTests {
|
||||
public void saveAuthorizationRequestWhenNoExistingSessionAndDistributedSessionThenSaved() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.setSession(new MockDistributedHttpSession());
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = createAuthorizationRequest().build();
|
||||
this.authorizationRequestRepository.saveAuthorizationRequest(authorizationRequest, request,
|
||||
new MockHttpServletResponse());
|
||||
|
||||
request.addParameter(OAuth2ParameterNames.STATE, authorizationRequest.getState());
|
||||
OAuth2AuthorizationRequest loadedAuthorizationRequest = this.authorizationRequestRepository
|
||||
.loadAuthorizationRequest(request);
|
||||
|
||||
assertThat(loadedAuthorizationRequest).isEqualTo(authorizationRequest);
|
||||
}
|
||||
|
||||
@@ -178,19 +158,15 @@ public class HttpSessionOAuth2AuthorizationRequestRepositoryTests {
|
||||
public void saveAuthorizationRequestWhenExistingSessionAndDistributedSessionThenSaved() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.setSession(new MockDistributedHttpSession());
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest1 = createAuthorizationRequest().build();
|
||||
this.authorizationRequestRepository.saveAuthorizationRequest(authorizationRequest1, request,
|
||||
new MockHttpServletResponse());
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest2 = createAuthorizationRequest().build();
|
||||
this.authorizationRequestRepository.saveAuthorizationRequest(authorizationRequest2, request,
|
||||
new MockHttpServletResponse());
|
||||
|
||||
request.addParameter(OAuth2ParameterNames.STATE, authorizationRequest2.getState());
|
||||
OAuth2AuthorizationRequest loadedAuthorizationRequest = this.authorizationRequestRepository
|
||||
.loadAuthorizationRequest(request);
|
||||
|
||||
assertThat(loadedAuthorizationRequest).isEqualTo(authorizationRequest2);
|
||||
}
|
||||
|
||||
@@ -224,17 +200,13 @@ public class HttpSessionOAuth2AuthorizationRequestRepositoryTests {
|
||||
public void removeAuthorizationRequestWhenSavedThenRemoved() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = createAuthorizationRequest().build();
|
||||
|
||||
this.authorizationRequestRepository.saveAuthorizationRequest(authorizationRequest, request, response);
|
||||
|
||||
request.addParameter(OAuth2ParameterNames.STATE, authorizationRequest.getState());
|
||||
OAuth2AuthorizationRequest removedAuthorizationRequest = this.authorizationRequestRepository
|
||||
.removeAuthorizationRequest(request, response);
|
||||
OAuth2AuthorizationRequest loadedAuthorizationRequest = this.authorizationRequestRepository
|
||||
.loadAuthorizationRequest(request);
|
||||
|
||||
assertThat(removedAuthorizationRequest).isNotNull();
|
||||
assertThat(loadedAuthorizationRequest).isNull();
|
||||
}
|
||||
@@ -244,18 +216,13 @@ public class HttpSessionOAuth2AuthorizationRequestRepositoryTests {
|
||||
public void removeAuthorizationRequestWhenSavedThenRemovedFromSession() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = createAuthorizationRequest().build();
|
||||
|
||||
this.authorizationRequestRepository.saveAuthorizationRequest(authorizationRequest, request, response);
|
||||
|
||||
request.addParameter(OAuth2ParameterNames.STATE, authorizationRequest.getState());
|
||||
OAuth2AuthorizationRequest removedAuthorizationRequest = this.authorizationRequestRepository
|
||||
.removeAuthorizationRequest(request, response);
|
||||
|
||||
String sessionAttributeName = HttpSessionOAuth2AuthorizationRequestRepository.class.getName()
|
||||
+ ".AUTHORIZATION_REQUEST";
|
||||
|
||||
assertThat(removedAuthorizationRequest).isNotNull();
|
||||
assertThat(request.getSession().getAttribute(sessionAttributeName)).isNull();
|
||||
}
|
||||
@@ -264,12 +231,9 @@ public class HttpSessionOAuth2AuthorizationRequestRepositoryTests {
|
||||
public void removeAuthorizationRequestWhenNotSavedThenNotRemoved() {
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.addParameter(OAuth2ParameterNames.STATE, "state-1234");
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
|
||||
OAuth2AuthorizationRequest removedAuthorizationRequest = this.authorizationRequestRepository
|
||||
.removeAuthorizationRequest(request, response);
|
||||
|
||||
assertThat(removedAuthorizationRequest).isNull();
|
||||
}
|
||||
|
||||
|
||||
@@ -92,7 +92,6 @@ public class HttpSessionOAuth2AuthorizedClientRepositoryTests {
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration1, this.principalName1,
|
||||
mock(OAuth2AccessToken.class));
|
||||
this.authorizedClientRepository.saveAuthorizedClient(authorizedClient, null, this.request, this.response);
|
||||
|
||||
OAuth2AuthorizedClient loadedAuthorizedClient = this.authorizedClientRepository
|
||||
.loadAuthorizedClient(this.registrationId1, null, this.request);
|
||||
assertThat(loadedAuthorizedClient).isEqualTo(authorizedClient);
|
||||
@@ -135,10 +134,8 @@ public class HttpSessionOAuth2AuthorizedClientRepositoryTests {
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration2, this.principalName1,
|
||||
mock(OAuth2AccessToken.class));
|
||||
this.authorizedClientRepository.saveAuthorizedClient(authorizedClient, null, this.request, this.response);
|
||||
|
||||
HttpSession session = this.request.getSession(false);
|
||||
assertThat(session).isNotNull();
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, OAuth2AuthorizedClient> authorizedClients = (Map<String, OAuth2AuthorizedClient>) session
|
||||
.getAttribute(HttpSessionOAuth2AuthorizedClientRepository.class.getName() + ".AUTHORIZED_CLIENTS");
|
||||
@@ -181,10 +178,8 @@ public class HttpSessionOAuth2AuthorizedClientRepositoryTests {
|
||||
OAuth2AuthorizedClient authorizedClient1 = new OAuth2AuthorizedClient(this.registration1, this.principalName1,
|
||||
mock(OAuth2AccessToken.class));
|
||||
this.authorizedClientRepository.saveAuthorizedClient(authorizedClient1, null, this.request, this.response);
|
||||
|
||||
// Remove registrationId2 (never added so is not removed either)
|
||||
this.authorizedClientRepository.removeAuthorizedClient(this.registrationId2, null, this.request, this.response);
|
||||
|
||||
OAuth2AuthorizedClient loadedAuthorizedClient1 = this.authorizedClientRepository
|
||||
.loadAuthorizedClient(this.registrationId1, null, this.request);
|
||||
assertThat(loadedAuthorizedClient1).isNotNull();
|
||||
@@ -214,7 +209,6 @@ public class HttpSessionOAuth2AuthorizedClientRepositoryTests {
|
||||
.loadAuthorizedClient(this.registrationId1, null, this.request);
|
||||
assertThat(loadedAuthorizedClient).isSameAs(authorizedClient);
|
||||
this.authorizedClientRepository.removeAuthorizedClient(this.registrationId1, null, this.request, this.response);
|
||||
|
||||
HttpSession session = this.request.getSession(false);
|
||||
assertThat(session).isNotNull();
|
||||
assertThat(session
|
||||
@@ -227,13 +221,10 @@ public class HttpSessionOAuth2AuthorizedClientRepositoryTests {
|
||||
OAuth2AuthorizedClient authorizedClient1 = new OAuth2AuthorizedClient(this.registration1, this.principalName1,
|
||||
mock(OAuth2AccessToken.class));
|
||||
this.authorizedClientRepository.saveAuthorizedClient(authorizedClient1, null, this.request, this.response);
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient2 = new OAuth2AuthorizedClient(this.registration2, this.principalName1,
|
||||
mock(OAuth2AccessToken.class));
|
||||
this.authorizedClientRepository.saveAuthorizedClient(authorizedClient2, null, this.request, this.response);
|
||||
|
||||
this.authorizedClientRepository.removeAuthorizedClient(this.registrationId1, null, this.request, this.response);
|
||||
|
||||
OAuth2AuthorizedClient loadedAuthorizedClient2 = this.authorizedClientRepository
|
||||
.loadAuthorizedClient(this.registrationId2, null, this.request);
|
||||
assertThat(loadedAuthorizedClient2).isNotNull();
|
||||
|
||||
@@ -157,9 +157,7 @@ public class OAuth2AuthorizationCodeGrantFilterTests {
|
||||
// parameter.
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
verify(filterChain).doFilter(any(HttpServletRequest.class), any(HttpServletResponse.class));
|
||||
}
|
||||
|
||||
@@ -169,9 +167,7 @@ public class OAuth2AuthorizationCodeGrantFilterTests {
|
||||
MockHttpServletRequest authorizationResponse = createAuthorizationResponse(authorizationRequest);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
this.filter.doFilter(authorizationResponse, response, filterChain);
|
||||
|
||||
verify(filterChain).doFilter(any(HttpServletRequest.class), any(HttpServletResponse.class));
|
||||
}
|
||||
|
||||
@@ -184,9 +180,7 @@ public class OAuth2AuthorizationCodeGrantFilterTests {
|
||||
this.setUpAuthorizationRequest(authorizationRequest, response, this.registration1);
|
||||
authorizationResponse.setRequestURI(requestUri + "-no-match");
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
this.filter.doFilter(authorizationResponse, response, filterChain);
|
||||
|
||||
verify(filterChain).doFilter(any(HttpServletRequest.class), any(HttpServletResponse.class));
|
||||
}
|
||||
|
||||
@@ -206,7 +200,6 @@ public class OAuth2AuthorizationCodeGrantFilterTests {
|
||||
MockHttpServletRequest authorizationResponse = createAuthorizationResponse(authorizationRequest);
|
||||
this.filter.doFilter(authorizationResponse, response, filterChain);
|
||||
verifyNoInteractions(filterChain);
|
||||
|
||||
// 2) redirect_uri with query parameters AND authorization response additional
|
||||
// parameters
|
||||
Map<String, String> additionalParameters = new LinkedHashMap<>();
|
||||
@@ -231,7 +224,6 @@ public class OAuth2AuthorizationCodeGrantFilterTests {
|
||||
this.setUpAuthorizationRequest(authorizationRequest, response, this.registration1);
|
||||
this.setUpAuthenticationResult(this.registration1);
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
// 1) Parameter value
|
||||
Map<String, String> parametersNotMatch = new LinkedHashMap<>(parameters);
|
||||
parametersNotMatch.put("param2", "value8");
|
||||
@@ -240,7 +232,6 @@ public class OAuth2AuthorizationCodeGrantFilterTests {
|
||||
authorizationResponse.setSession(authorizationRequest.getSession());
|
||||
this.filter.doFilter(authorizationResponse, response, filterChain);
|
||||
verify(filterChain, times(1)).doFilter(any(HttpServletRequest.class), any(HttpServletResponse.class));
|
||||
|
||||
// 2) Parameter order
|
||||
parametersNotMatch = new LinkedHashMap<>();
|
||||
parametersNotMatch.put("param2", "value2");
|
||||
@@ -249,7 +240,6 @@ public class OAuth2AuthorizationCodeGrantFilterTests {
|
||||
authorizationResponse.setSession(authorizationRequest.getSession());
|
||||
this.filter.doFilter(authorizationResponse, response, filterChain);
|
||||
verify(filterChain, times(2)).doFilter(any(HttpServletRequest.class), any(HttpServletResponse.class));
|
||||
|
||||
// 3) Parameter missing
|
||||
parametersNotMatch = new LinkedHashMap<>(parameters);
|
||||
parametersNotMatch.remove("param2");
|
||||
@@ -267,9 +257,7 @@ public class OAuth2AuthorizationCodeGrantFilterTests {
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
this.setUpAuthorizationRequest(authorizationRequest, response, this.registration1);
|
||||
this.setUpAuthenticationResult(this.registration1);
|
||||
|
||||
this.filter.doFilter(authorizationResponse, response, filterChain);
|
||||
|
||||
assertThat(this.authorizationRequestRepository.loadAuthorizationRequest(authorizationResponse)).isNull();
|
||||
}
|
||||
|
||||
@@ -280,13 +268,10 @@ public class OAuth2AuthorizationCodeGrantFilterTests {
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
this.setUpAuthorizationRequest(authorizationRequest, response, this.registration1);
|
||||
|
||||
OAuth2Error error = new OAuth2Error(OAuth2ErrorCodes.INVALID_GRANT);
|
||||
given(this.authenticationManager.authenticate(any(Authentication.class)))
|
||||
.willThrow(new OAuth2AuthorizationException(error));
|
||||
|
||||
this.filter.doFilter(authorizationResponse, response, filterChain);
|
||||
|
||||
assertThat(response.getRedirectedUrl()).isEqualTo("http://localhost/callback/client-1?error=invalid_grant");
|
||||
}
|
||||
|
||||
@@ -298,9 +283,7 @@ public class OAuth2AuthorizationCodeGrantFilterTests {
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
this.setUpAuthorizationRequest(authorizationRequest, response, this.registration1);
|
||||
this.setUpAuthenticationResult(this.registration1);
|
||||
|
||||
this.filter.doFilter(authorizationResponse, response, filterChain);
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientService
|
||||
.loadAuthorizedClient(this.registration1.getRegistrationId(), this.principalName1);
|
||||
assertThat(authorizedClient).isNotNull();
|
||||
@@ -318,9 +301,7 @@ public class OAuth2AuthorizationCodeGrantFilterTests {
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
this.setUpAuthorizationRequest(authorizationRequest, response, this.registration1);
|
||||
this.setUpAuthenticationResult(this.registration1);
|
||||
|
||||
this.filter.doFilter(authorizationResponse, response, filterChain);
|
||||
|
||||
assertThat(response.getRedirectedUrl()).isEqualTo("http://localhost/callback/client-1");
|
||||
}
|
||||
|
||||
@@ -338,9 +319,7 @@ public class OAuth2AuthorizationCodeGrantFilterTests {
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
this.setUpAuthorizationRequest(request, response, this.registration1);
|
||||
this.setUpAuthenticationResult(this.registration1);
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
assertThat(response.getRedirectedUrl()).isEqualTo("http://localhost/saved-request");
|
||||
}
|
||||
|
||||
@@ -349,19 +328,14 @@ public class OAuth2AuthorizationCodeGrantFilterTests {
|
||||
MockHttpServletRequest authorizationRequest = createAuthorizationRequest("/callback/client-1");
|
||||
MockHttpServletRequest authorizationResponse = createAuthorizationResponse(authorizationRequest);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
this.setUpAuthorizationRequest(authorizationRequest, response, this.registration1);
|
||||
this.setUpAuthenticationResult(this.registration1);
|
||||
|
||||
RequestCache requestCache = spy(HttpSessionRequestCache.class);
|
||||
this.filter.setRequestCache(requestCache);
|
||||
|
||||
authorizationRequest.setRequestURI("/saved-request");
|
||||
requestCache.saveRequest(authorizationRequest, response);
|
||||
|
||||
this.filter.doFilter(authorizationResponse, response, filterChain);
|
||||
|
||||
verify(requestCache).getRequest(any(HttpServletRequest.class), any(HttpServletResponse.class));
|
||||
assertThat(response.getRedirectedUrl()).isEqualTo("http://localhost/saved-request");
|
||||
}
|
||||
@@ -374,26 +348,21 @@ public class OAuth2AuthorizationCodeGrantFilterTests {
|
||||
SecurityContext securityContext = SecurityContextHolder.createEmptyContext();
|
||||
securityContext.setAuthentication(anonymousPrincipal);
|
||||
SecurityContextHolder.setContext(securityContext);
|
||||
|
||||
MockHttpServletRequest authorizationRequest = createAuthorizationRequest("/callback/client-1");
|
||||
MockHttpServletRequest authorizationResponse = createAuthorizationResponse(authorizationRequest);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
this.setUpAuthorizationRequest(authorizationRequest, response, this.registration1);
|
||||
this.setUpAuthenticationResult(this.registration1);
|
||||
|
||||
this.filter.doFilter(authorizationResponse, response, filterChain);
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientRepository.loadAuthorizedClient(
|
||||
this.registration1.getRegistrationId(), anonymousPrincipal, authorizationResponse);
|
||||
assertThat(authorizedClient).isNotNull();
|
||||
assertThat(authorizedClient.getClientRegistration()).isEqualTo(this.registration1);
|
||||
assertThat(authorizedClient.getPrincipalName()).isEqualTo(anonymousPrincipal.getName());
|
||||
assertThat(authorizedClient.getAccessToken()).isNotNull();
|
||||
|
||||
HttpSession session = authorizationResponse.getSession(false);
|
||||
assertThat(session).isNotNull();
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, OAuth2AuthorizedClient> authorizedClients = (Map<String, OAuth2AuthorizedClient>) session
|
||||
.getAttribute(HttpSessionOAuth2AuthorizedClientRepository.class.getName() + ".AUTHORIZED_CLIENTS");
|
||||
@@ -407,26 +376,21 @@ public class OAuth2AuthorizationCodeGrantFilterTests {
|
||||
throws Exception {
|
||||
SecurityContext securityContext = SecurityContextHolder.createEmptyContext();
|
||||
SecurityContextHolder.setContext(securityContext); // null Authentication
|
||||
|
||||
MockHttpServletRequest authorizationRequest = createAuthorizationRequest("/callback/client-1");
|
||||
MockHttpServletRequest authorizationResponse = createAuthorizationResponse(authorizationRequest);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
this.setUpAuthorizationRequest(authorizationRequest, response, this.registration1);
|
||||
this.setUpAuthenticationResult(this.registration1);
|
||||
|
||||
this.filter.doFilter(authorizationResponse, response, filterChain);
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientRepository
|
||||
.loadAuthorizedClient(this.registration1.getRegistrationId(), null, authorizationResponse);
|
||||
assertThat(authorizedClient).isNotNull();
|
||||
assertThat(authorizedClient.getClientRegistration()).isEqualTo(this.registration1);
|
||||
assertThat(authorizedClient.getPrincipalName()).isEqualTo("anonymousUser");
|
||||
assertThat(authorizedClient.getAccessToken()).isNotNull();
|
||||
|
||||
HttpSession session = authorizationResponse.getSession(false);
|
||||
assertThat(session).isNotNull();
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, OAuth2AuthorizedClient> authorizedClients = (Map<String, OAuth2AuthorizedClient>) session
|
||||
.getAttribute(HttpSessionOAuth2AuthorizedClientRepository.class.getName() + ".AUTHORIZED_CLIENTS");
|
||||
|
||||
@@ -125,9 +125,7 @@ public class OAuth2AuthorizationRequestRedirectFilterTests {
|
||||
request.setServletPath(requestUri);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
verify(filterChain).doFilter(any(HttpServletRequest.class), any(HttpServletResponse.class));
|
||||
}
|
||||
|
||||
@@ -139,11 +137,8 @@ public class OAuth2AuthorizationRequestRedirectFilterTests {
|
||||
request.setServletPath(requestUri);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
verifyZeroInteractions(filterChain);
|
||||
|
||||
assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR.value());
|
||||
assertThat(response.getErrorMessage()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase());
|
||||
}
|
||||
@@ -156,11 +151,8 @@ public class OAuth2AuthorizationRequestRedirectFilterTests {
|
||||
request.setServletPath(requestUri);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
verifyZeroInteractions(filterChain);
|
||||
|
||||
assertThat(response.getRedirectedUrl()).matches("https://example.com/login/oauth/authorize\\?"
|
||||
+ "response_type=code&client_id=client-id&" + "scope=read:user&state=.{15,}&"
|
||||
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id");
|
||||
@@ -174,13 +166,10 @@ public class OAuth2AuthorizationRequestRedirectFilterTests {
|
||||
request.setServletPath(requestUri);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
AuthorizationRequestRepository<OAuth2AuthorizationRequest> authorizationRequestRepository = mock(
|
||||
AuthorizationRequestRepository.class);
|
||||
this.filter.setAuthorizationRequestRepository(authorizationRequestRepository);
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
verifyZeroInteractions(filterChain);
|
||||
verify(authorizationRequestRepository).saveAuthorizationRequest(any(OAuth2AuthorizationRequest.class),
|
||||
any(HttpServletRequest.class), any(HttpServletResponse.class));
|
||||
@@ -194,11 +183,8 @@ public class OAuth2AuthorizationRequestRedirectFilterTests {
|
||||
request.setServletPath(requestUri);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
verifyZeroInteractions(filterChain);
|
||||
|
||||
assertThat(response.getRedirectedUrl()).matches("https://example.com/login/oauth/authorize\\?"
|
||||
+ "response_type=token&client_id=client-id&" + "scope=read:user&state=.{15,}&"
|
||||
+ "redirect_uri=http://localhost/authorize/oauth2/implicit/registration-3");
|
||||
@@ -212,13 +198,10 @@ public class OAuth2AuthorizationRequestRedirectFilterTests {
|
||||
request.setServletPath(requestUri);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
AuthorizationRequestRepository<OAuth2AuthorizationRequest> authorizationRequestRepository = mock(
|
||||
AuthorizationRequestRepository.class);
|
||||
this.filter.setAuthorizationRequestRepository(authorizationRequestRepository);
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
verifyZeroInteractions(filterChain);
|
||||
verify(authorizationRequestRepository, times(0)).saveAuthorizationRequest(any(OAuth2AuthorizationRequest.class),
|
||||
any(HttpServletRequest.class), any(HttpServletResponse.class));
|
||||
@@ -229,17 +212,13 @@ public class OAuth2AuthorizationRequestRedirectFilterTests {
|
||||
String authorizationRequestBaseUri = "/custom/authorization";
|
||||
this.filter = new OAuth2AuthorizationRequestRedirectFilter(this.clientRegistrationRepository,
|
||||
authorizationRequestBaseUri);
|
||||
|
||||
String requestUri = authorizationRequestBaseUri + "/" + this.registration1.getRegistrationId();
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.setServletPath(requestUri);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
verifyZeroInteractions(filterChain);
|
||||
|
||||
assertThat(response.getRedirectedUrl()).matches("https://example.com/login/oauth/authorize\\?"
|
||||
+ "response_type=code&client_id=client-id&" + "scope=read:user&state=.{15,}&"
|
||||
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id");
|
||||
@@ -253,14 +232,10 @@ public class OAuth2AuthorizationRequestRedirectFilterTests {
|
||||
request.setServletPath(requestUri);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
willThrow(new ClientAuthorizationRequiredException(this.registration1.getRegistrationId())).given(filterChain)
|
||||
.doFilter(any(ServletRequest.class), any(ServletResponse.class));
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
verify(filterChain).doFilter(any(HttpServletRequest.class), any(HttpServletResponse.class));
|
||||
|
||||
assertThat(response.getRedirectedUrl()).matches("https://example.com/login/oauth/authorize\\?"
|
||||
+ "response_type=code&client_id=client-id&" + "scope=read:user&state=.{15,}&"
|
||||
+ "redirect_uri=http://localhost/authorize/oauth2/code/registration-id");
|
||||
@@ -275,19 +250,13 @@ public class OAuth2AuthorizationRequestRedirectFilterTests {
|
||||
request.setServletPath(requestUri);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
willThrow(new ClientAuthorizationRequiredException(this.registration1.getRegistrationId())).given(filterChain)
|
||||
.doFilter(any(ServletRequest.class), any(ServletResponse.class));
|
||||
|
||||
OAuth2AuthorizationRequestResolver resolver = mock(OAuth2AuthorizationRequestResolver.class);
|
||||
OAuth2AuthorizationRequestRedirectFilter filter = new OAuth2AuthorizationRequestRedirectFilter(resolver);
|
||||
|
||||
filter.doFilter(request, response, filterChain);
|
||||
|
||||
verify(filterChain).doFilter(any(HttpServletRequest.class), any(HttpServletResponse.class));
|
||||
|
||||
verifyZeroInteractions(filterChain);
|
||||
|
||||
assertThat(response.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR.value());
|
||||
assertThat(response.getErrorMessage()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase());
|
||||
}
|
||||
@@ -303,22 +272,17 @@ public class OAuth2AuthorizationRequestRedirectFilterTests {
|
||||
request.addParameter("idp", "https://other.provider.com");
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
OAuth2AuthorizationRequestResolver defaultAuthorizationRequestResolver = new DefaultOAuth2AuthorizationRequestResolver(
|
||||
this.clientRegistrationRepository,
|
||||
OAuth2AuthorizationRequestRedirectFilter.DEFAULT_AUTHORIZATION_REQUEST_BASE_URI);
|
||||
|
||||
OAuth2AuthorizationRequestResolver resolver = mock(OAuth2AuthorizationRequestResolver.class);
|
||||
OAuth2AuthorizationRequest result = OAuth2AuthorizationRequest
|
||||
.from(defaultAuthorizationRequestResolver.resolve(request))
|
||||
.additionalParameters(Collections.singletonMap("idp", request.getParameter("idp"))).build();
|
||||
given(resolver.resolve(any())).willReturn(result);
|
||||
OAuth2AuthorizationRequestRedirectFilter filter = new OAuth2AuthorizationRequestRedirectFilter(resolver);
|
||||
|
||||
filter.doFilter(request, response, filterChain);
|
||||
|
||||
verifyZeroInteractions(filterChain);
|
||||
|
||||
assertThat(response.getRedirectedUrl()).matches("https://example.com/login/oauth/authorize\\?"
|
||||
+ "response_type=code&client_id=client-id&" + "scope=read:user&state=.{15,}&"
|
||||
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id&"
|
||||
@@ -337,13 +301,10 @@ public class OAuth2AuthorizationRequestRedirectFilterTests {
|
||||
request.addParameter(loginHintParamName, "user@provider.com");
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
OAuth2AuthorizationRequestResolver defaultAuthorizationRequestResolver = new DefaultOAuth2AuthorizationRequestResolver(
|
||||
this.clientRegistrationRepository,
|
||||
OAuth2AuthorizationRequestRedirectFilter.DEFAULT_AUTHORIZATION_REQUEST_BASE_URI);
|
||||
|
||||
OAuth2AuthorizationRequestResolver resolver = mock(OAuth2AuthorizationRequestResolver.class);
|
||||
|
||||
OAuth2AuthorizationRequest defaultAuthorizationRequest = defaultAuthorizationRequestResolver.resolve(request);
|
||||
Map<String, Object> additionalParameters = new HashMap<>(defaultAuthorizationRequest.getAdditionalParameters());
|
||||
additionalParameters.put(loginHintParamName, request.getParameter(loginHintParamName));
|
||||
@@ -355,13 +316,9 @@ public class OAuth2AuthorizationRequestRedirectFilterTests {
|
||||
.additionalParameters(Collections.singletonMap("idp", request.getParameter("idp")))
|
||||
.authorizationRequestUri(customAuthorizationRequestUri).build();
|
||||
given(resolver.resolve(any())).willReturn(result);
|
||||
|
||||
OAuth2AuthorizationRequestRedirectFilter filter = new OAuth2AuthorizationRequestRedirectFilter(resolver);
|
||||
|
||||
filter.doFilter(request, response, filterChain);
|
||||
|
||||
verifyZeroInteractions(filterChain);
|
||||
|
||||
assertThat(response.getRedirectedUrl()).matches("https://example.com/login/oauth/authorize\\?"
|
||||
+ "response_type=code&client_id=client-id&" + "scope=read:user&state=.{15,}&"
|
||||
+ "redirect_uri=http://localhost/login/oauth2/code/registration-id&"
|
||||
|
||||
@@ -158,9 +158,7 @@ public class OAuth2LoginAuthenticationFilterTests {
|
||||
request.setServletPath(requestUri);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
verify(filterChain).doFilter(any(HttpServletRequest.class), any(HttpServletResponse.class));
|
||||
verify(this.filter, never()).attemptAuthentication(any(HttpServletRequest.class),
|
||||
any(HttpServletResponse.class));
|
||||
@@ -174,17 +172,13 @@ public class OAuth2LoginAuthenticationFilterTests {
|
||||
// NOTE:
|
||||
// A valid Authorization Response contains either a 'code' or 'error' parameter.
|
||||
// Don't set it to force an invalid Authorization Response.
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
ArgumentCaptor<AuthenticationException> authenticationExceptionArgCaptor = ArgumentCaptor
|
||||
.forClass(AuthenticationException.class);
|
||||
verify(this.failureHandler).onAuthenticationFailure(any(HttpServletRequest.class),
|
||||
any(HttpServletResponse.class), authenticationExceptionArgCaptor.capture());
|
||||
|
||||
assertThat(authenticationExceptionArgCaptor.getValue()).isInstanceOf(OAuth2AuthenticationException.class);
|
||||
OAuth2AuthenticationException authenticationException = (OAuth2AuthenticationException) authenticationExceptionArgCaptor
|
||||
.getValue();
|
||||
@@ -199,17 +193,13 @@ public class OAuth2LoginAuthenticationFilterTests {
|
||||
request.setServletPath(requestUri);
|
||||
request.addParameter(OAuth2ParameterNames.CODE, "code");
|
||||
request.addParameter(OAuth2ParameterNames.STATE, "state");
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
ArgumentCaptor<AuthenticationException> authenticationExceptionArgCaptor = ArgumentCaptor
|
||||
.forClass(AuthenticationException.class);
|
||||
verify(this.failureHandler).onAuthenticationFailure(any(HttpServletRequest.class),
|
||||
any(HttpServletResponse.class), authenticationExceptionArgCaptor.capture());
|
||||
|
||||
assertThat(authenticationExceptionArgCaptor.getValue()).isInstanceOf(OAuth2AuthenticationException.class);
|
||||
OAuth2AuthenticationException authenticationException = (OAuth2AuthenticationException) authenticationExceptionArgCaptor
|
||||
.getValue();
|
||||
@@ -226,10 +216,8 @@ public class OAuth2LoginAuthenticationFilterTests {
|
||||
request.setServletPath(requestUri);
|
||||
request.addParameter(OAuth2ParameterNames.CODE, "code");
|
||||
request.addParameter(OAuth2ParameterNames.STATE, "state");
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
ClientRegistration registrationNotFound = ClientRegistration.withRegistrationId("registration-not-found")
|
||||
.clientId("client-1").clientSecret("secret")
|
||||
.clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
|
||||
@@ -239,14 +227,11 @@ public class OAuth2LoginAuthenticationFilterTests {
|
||||
.userInfoUri("https://provider.com/oauth2/user").userNameAttributeName("id").clientName("client-1")
|
||||
.build();
|
||||
this.setUpAuthorizationRequest(request, response, registrationNotFound, state);
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
ArgumentCaptor<AuthenticationException> authenticationExceptionArgCaptor = ArgumentCaptor
|
||||
.forClass(AuthenticationException.class);
|
||||
verify(this.failureHandler).onAuthenticationFailure(any(HttpServletRequest.class),
|
||||
any(HttpServletResponse.class), authenticationExceptionArgCaptor.capture());
|
||||
|
||||
assertThat(authenticationExceptionArgCaptor.getValue()).isInstanceOf(OAuth2AuthenticationException.class);
|
||||
OAuth2AuthenticationException authenticationException = (OAuth2AuthenticationException) authenticationExceptionArgCaptor
|
||||
.getValue();
|
||||
@@ -261,15 +246,11 @@ public class OAuth2LoginAuthenticationFilterTests {
|
||||
request.setServletPath(requestUri);
|
||||
request.addParameter(OAuth2ParameterNames.CODE, "code");
|
||||
request.addParameter(OAuth2ParameterNames.STATE, state);
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
this.setUpAuthorizationRequest(request, response, this.registration2, state);
|
||||
this.setUpAuthenticationResult(this.registration2);
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
assertThat(this.authorizationRequestRepository.loadAuthorizationRequest(request)).isNull();
|
||||
}
|
||||
|
||||
@@ -281,15 +262,11 @@ public class OAuth2LoginAuthenticationFilterTests {
|
||||
request.setServletPath(requestUri);
|
||||
request.addParameter(OAuth2ParameterNames.CODE, "code");
|
||||
request.addParameter(OAuth2ParameterNames.STATE, state);
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
this.setUpAuthorizationRequest(request, response, this.registration1, state);
|
||||
this.setUpAuthenticationResult(this.registration1);
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient = this.authorizedClientRepository
|
||||
.loadAuthorizedClient(this.registration1.getRegistrationId(), this.loginAuthentication, request);
|
||||
assertThat(authorizedClient).isNotNull();
|
||||
@@ -305,22 +282,17 @@ public class OAuth2LoginAuthenticationFilterTests {
|
||||
this.filter = spy(new OAuth2LoginAuthenticationFilter(this.clientRegistrationRepository,
|
||||
this.authorizedClientRepository, filterProcessesUrl));
|
||||
this.filter.setAuthenticationManager(this.authenticationManager);
|
||||
|
||||
String requestUri = "/login/oauth2/custom/" + this.registration2.getRegistrationId();
|
||||
String state = "state";
|
||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||
request.setServletPath(requestUri);
|
||||
request.addParameter(OAuth2ParameterNames.CODE, "code");
|
||||
request.addParameter(OAuth2ParameterNames.STATE, state);
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
this.setUpAuthorizationRequest(request, response, this.registration2, state);
|
||||
this.setUpAuthenticationResult(this.registration2);
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
verifyZeroInteractions(filterChain);
|
||||
verify(this.filter).attemptAuthentication(any(HttpServletRequest.class), any(HttpServletResponse.class));
|
||||
}
|
||||
@@ -338,25 +310,19 @@ public class OAuth2LoginAuthenticationFilterTests {
|
||||
request.setServletPath(requestUri);
|
||||
request.addParameter(OAuth2ParameterNames.CODE, "code");
|
||||
request.addParameter(OAuth2ParameterNames.STATE, "state");
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
this.setUpAuthorizationRequest(request, response, this.registration2, state);
|
||||
this.setUpAuthenticationResult(this.registration2);
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
ArgumentCaptor<Authentication> authenticationArgCaptor = ArgumentCaptor.forClass(Authentication.class);
|
||||
verify(this.authenticationManager).authenticate(authenticationArgCaptor.capture());
|
||||
|
||||
OAuth2LoginAuthenticationToken authentication = (OAuth2LoginAuthenticationToken) authenticationArgCaptor
|
||||
.getValue();
|
||||
OAuth2AuthorizationRequest authorizationRequest = authentication.getAuthorizationExchange()
|
||||
.getAuthorizationRequest();
|
||||
OAuth2AuthorizationResponse authorizationResponse = authentication.getAuthorizationExchange()
|
||||
.getAuthorizationResponse();
|
||||
|
||||
String expectedRedirectUri = "http://localhost/login/oauth2/code/registration-id-2";
|
||||
assertThat(authorizationRequest.getRedirectUri()).isEqualTo(expectedRedirectUri);
|
||||
assertThat(authorizationResponse.getRedirectUri()).isEqualTo(expectedRedirectUri);
|
||||
@@ -375,25 +341,19 @@ public class OAuth2LoginAuthenticationFilterTests {
|
||||
request.setServletPath(requestUri);
|
||||
request.addParameter(OAuth2ParameterNames.CODE, "code");
|
||||
request.addParameter(OAuth2ParameterNames.STATE, "state");
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
this.setUpAuthorizationRequest(request, response, this.registration2, state);
|
||||
this.setUpAuthenticationResult(this.registration2);
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
ArgumentCaptor<Authentication> authenticationArgCaptor = ArgumentCaptor.forClass(Authentication.class);
|
||||
verify(this.authenticationManager).authenticate(authenticationArgCaptor.capture());
|
||||
|
||||
OAuth2LoginAuthenticationToken authentication = (OAuth2LoginAuthenticationToken) authenticationArgCaptor
|
||||
.getValue();
|
||||
OAuth2AuthorizationRequest authorizationRequest = authentication.getAuthorizationExchange()
|
||||
.getAuthorizationRequest();
|
||||
OAuth2AuthorizationResponse authorizationResponse = authentication.getAuthorizationExchange()
|
||||
.getAuthorizationResponse();
|
||||
|
||||
String expectedRedirectUri = "https://example.com/login/oauth2/code/registration-id-2";
|
||||
assertThat(authorizationRequest.getRedirectUri()).isEqualTo(expectedRedirectUri);
|
||||
assertThat(authorizationResponse.getRedirectUri()).isEqualTo(expectedRedirectUri);
|
||||
@@ -412,25 +372,19 @@ public class OAuth2LoginAuthenticationFilterTests {
|
||||
request.setServletPath(requestUri);
|
||||
request.addParameter(OAuth2ParameterNames.CODE, "code");
|
||||
request.addParameter(OAuth2ParameterNames.STATE, "state");
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
FilterChain filterChain = mock(FilterChain.class);
|
||||
|
||||
this.setUpAuthorizationRequest(request, response, this.registration2, state);
|
||||
this.setUpAuthenticationResult(this.registration2);
|
||||
|
||||
this.filter.doFilter(request, response, filterChain);
|
||||
|
||||
ArgumentCaptor<Authentication> authenticationArgCaptor = ArgumentCaptor.forClass(Authentication.class);
|
||||
verify(this.authenticationManager).authenticate(authenticationArgCaptor.capture());
|
||||
|
||||
OAuth2LoginAuthenticationToken authentication = (OAuth2LoginAuthenticationToken) authenticationArgCaptor
|
||||
.getValue();
|
||||
OAuth2AuthorizationRequest authorizationRequest = authentication.getAuthorizationExchange()
|
||||
.getAuthorizationRequest();
|
||||
OAuth2AuthorizationResponse authorizationResponse = authentication.getAuthorizationExchange()
|
||||
.getAuthorizationResponse();
|
||||
|
||||
String expectedRedirectUri = "https://example.com:9090/login/oauth2/code/registration-id-2";
|
||||
assertThat(authorizationRequest.getRedirectUri()).isEqualTo(expectedRedirectUri);
|
||||
assertThat(authorizationResponse.getRedirectUri()).isEqualTo(expectedRedirectUri);
|
||||
@@ -445,17 +399,12 @@ public class OAuth2LoginAuthenticationFilterTests {
|
||||
request.setServletPath(requestUri);
|
||||
request.addParameter(OAuth2ParameterNames.CODE, "code");
|
||||
request.addParameter(OAuth2ParameterNames.STATE, state);
|
||||
|
||||
WebAuthenticationDetails webAuthenticationDetails = mock(WebAuthenticationDetails.class);
|
||||
given(this.authenticationDetailsSource.buildDetails(any())).willReturn(webAuthenticationDetails);
|
||||
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
|
||||
this.setUpAuthorizationRequest(request, response, this.registration2, state);
|
||||
this.setUpAuthenticationResult(this.registration2);
|
||||
|
||||
Authentication result = this.filter.attemptAuthentication(request, response);
|
||||
|
||||
assertThat(result.getDetails()).isEqualTo(webAuthenticationDetails);
|
||||
}
|
||||
|
||||
@@ -473,12 +422,10 @@ public class OAuth2LoginAuthenticationFilterTests {
|
||||
private String expandRedirectUri(HttpServletRequest request, ClientRegistration clientRegistration) {
|
||||
String baseUrl = UriComponentsBuilder.fromHttpUrl(UrlUtils.buildFullRequestUrl(request)).replaceQuery(null)
|
||||
.replacePath(request.getContextPath()).build().toUriString();
|
||||
|
||||
Map<String, String> uriVariables = new HashMap<>();
|
||||
uriVariables.put("baseUrl", baseUrl);
|
||||
uriVariables.put("action", "login");
|
||||
uriVariables.put("registrationId", clientRegistration.getRegistrationId());
|
||||
|
||||
return UriComponentsBuilder.fromUriString(clientRegistration.getRedirectUri()).buildAndExpand(uriVariables)
|
||||
.toUriString();
|
||||
}
|
||||
|
||||
@@ -108,7 +108,6 @@ public class OAuth2AuthorizedClientArgumentResolverTests {
|
||||
SecurityContext securityContext = SecurityContextHolder.createEmptyContext();
|
||||
securityContext.setAuthentication(this.authentication);
|
||||
SecurityContextHolder.setContext(securityContext);
|
||||
|
||||
this.registration1 = ClientRegistration.withRegistrationId("client1").clientId("client-1")
|
||||
.clientSecret("secret").clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
|
||||
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
|
||||
@@ -268,24 +267,19 @@ public class OAuth2AuthorizedClientArgumentResolverTests {
|
||||
this.clientRegistrationRepository, this.authorizedClientRepository);
|
||||
authorizedClientManager.setAuthorizedClientProvider(clientCredentialsAuthorizedClientProvider);
|
||||
this.argumentResolver = new OAuth2AuthorizedClientArgumentResolver(authorizedClientManager);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = OAuth2AccessTokenResponse.withToken("access-token-1234")
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).expiresIn(3600).build();
|
||||
given(clientCredentialsTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse);
|
||||
|
||||
given(this.authorizedClientRepository.loadAuthorizedClient(anyString(), any(), any(HttpServletRequest.class)))
|
||||
.willReturn(null);
|
||||
MethodParameter methodParameter = this.getMethodParameter("clientCredentialsClient",
|
||||
OAuth2AuthorizedClient.class);
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient = (OAuth2AuthorizedClient) this.argumentResolver
|
||||
.resolveArgument(methodParameter, null, new ServletWebRequest(this.request, this.response), null);
|
||||
|
||||
assertThat(authorizedClient).isNotNull();
|
||||
assertThat(authorizedClient.getClientRegistration()).isSameAs(this.registration2);
|
||||
assertThat(authorizedClient.getPrincipalName()).isEqualTo(this.principalName);
|
||||
assertThat(authorizedClient.getAccessToken()).isSameAs(accessTokenResponse.getAccessToken());
|
||||
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(eq(authorizedClient), eq(this.authentication),
|
||||
any(HttpServletRequest.class), any(HttpServletResponse.class));
|
||||
}
|
||||
@@ -301,7 +295,6 @@ public class OAuth2AuthorizedClientArgumentResolverTests {
|
||||
DefaultOAuth2AuthorizedClientManager authorizedClientManager = new DefaultOAuth2AuthorizedClientManager(
|
||||
this.clientRegistrationRepository, this.authorizedClientRepository);
|
||||
authorizedClientManager.setAuthorizedClientProvider(passwordAuthorizedClientProvider);
|
||||
|
||||
// Set custom contextAttributesMapper
|
||||
authorizedClientManager.setContextAttributesMapper((authorizeRequest) -> {
|
||||
Map<String, Object> contextAttributes = new HashMap<>();
|
||||
@@ -314,28 +307,21 @@ public class OAuth2AuthorizedClientArgumentResolverTests {
|
||||
}
|
||||
return contextAttributes;
|
||||
});
|
||||
|
||||
this.argumentResolver = new OAuth2AuthorizedClientArgumentResolver(authorizedClientManager);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = OAuth2AccessTokenResponse.withToken("access-token-1234")
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).expiresIn(3600).build();
|
||||
given(passwordTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse);
|
||||
|
||||
given(this.authorizedClientRepository.loadAuthorizedClient(anyString(), any(), any(HttpServletRequest.class)))
|
||||
.willReturn(null);
|
||||
MethodParameter methodParameter = this.getMethodParameter("passwordClient", OAuth2AuthorizedClient.class);
|
||||
|
||||
this.request.setParameter(OAuth2ParameterNames.USERNAME, "username");
|
||||
this.request.setParameter(OAuth2ParameterNames.PASSWORD, "password");
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient = (OAuth2AuthorizedClient) this.argumentResolver
|
||||
.resolveArgument(methodParameter, null, new ServletWebRequest(this.request, this.response), null);
|
||||
|
||||
assertThat(authorizedClient).isNotNull();
|
||||
assertThat(authorizedClient.getClientRegistration()).isSameAs(this.registration3);
|
||||
assertThat(authorizedClient.getPrincipalName()).isEqualTo(this.principalName);
|
||||
assertThat(authorizedClient.getAccessToken()).isSameAs(accessTokenResponse.getAccessToken());
|
||||
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(eq(authorizedClient), eq(this.authentication),
|
||||
any(HttpServletRequest.class), any(HttpServletResponse.class));
|
||||
}
|
||||
|
||||
@@ -92,7 +92,6 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionITests {
|
||||
final ServerOAuth2AuthorizedClientRepository delegate = new AuthenticatedPrincipalServerOAuth2AuthorizedClientRepository(
|
||||
new InMemoryReactiveOAuth2AuthorizedClientService(this.clientRegistrationRepository));
|
||||
this.authorizedClientRepository = spy(new ServerOAuth2AuthorizedClientRepository() {
|
||||
|
||||
@Override
|
||||
public <T extends OAuth2AuthorizedClient> Mono<T> loadAuthorizedClient(String clientRegistrationId,
|
||||
Authentication principal, ServerWebExchange exchange) {
|
||||
@@ -110,7 +109,6 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionITests {
|
||||
ServerWebExchange exchange) {
|
||||
return delegate.removeAuthorizedClient(clientRegistrationId, principal, exchange);
|
||||
}
|
||||
|
||||
});
|
||||
this.authorizedClientFilter = new ServerOAuth2AuthorizedClientExchangeFilterFunction(
|
||||
this.clientRegistrationRepository, this.authorizedClientRepository);
|
||||
@@ -135,21 +133,17 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionITests {
|
||||
String clientResponse = "{\n" + " \"attribute1\": \"value1\",\n" + " \"attribute2\": \"value2\"\n" + "}\n";
|
||||
this.server.enqueue(jsonResponse(accessTokenResponse));
|
||||
this.server.enqueue(jsonResponse(clientResponse));
|
||||
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientCredentials().tokenUri(this.serverUrl)
|
||||
.build();
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(clientRegistration.getRegistrationId())))
|
||||
.willReturn(Mono.just(clientRegistration));
|
||||
|
||||
this.webClient.get().uri(this.serverUrl)
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.clientRegistrationId(clientRegistration.getRegistrationId()))
|
||||
.retrieve().bodyToMono(String.class)
|
||||
.subscriberContext(Context.of(ServerWebExchange.class, this.exchange))
|
||||
.subscriberContext(ReactiveSecurityContextHolder.withAuthentication(this.authentication)).block();
|
||||
|
||||
assertThat(this.server.getRequestCount()).isEqualTo(2);
|
||||
|
||||
ArgumentCaptor<OAuth2AuthorizedClient> authorizedClientCaptor = ArgumentCaptor
|
||||
.forClass(OAuth2AuthorizedClient.class);
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(authorizedClientCaptor.capture(),
|
||||
@@ -162,15 +156,12 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionITests {
|
||||
String accessTokenResponse = "{\n" + " \"access_token\": \"refreshed-access-token\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
String clientResponse = "{\n" + " \"attribute1\": \"value1\",\n" + " \"attribute2\": \"value2\"\n" + "}\n";
|
||||
|
||||
this.server.enqueue(jsonResponse(accessTokenResponse));
|
||||
this.server.enqueue(jsonResponse(clientResponse));
|
||||
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientRegistration().tokenUri(this.serverUrl)
|
||||
.build();
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(clientRegistration.getRegistrationId())))
|
||||
.willReturn(Mono.just(clientRegistration));
|
||||
|
||||
Instant issuedAt = Instant.now().minus(Duration.ofDays(1));
|
||||
Instant expiresAt = issuedAt.plus(Duration.ofHours(1));
|
||||
OAuth2AccessToken accessToken = new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,
|
||||
@@ -180,16 +171,13 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionITests {
|
||||
this.authentication.getName(), accessToken, refreshToken);
|
||||
doReturn(Mono.just(authorizedClient)).when(this.authorizedClientRepository).loadAuthorizedClient(
|
||||
eq(clientRegistration.getRegistrationId()), eq(this.authentication), eq(this.exchange));
|
||||
|
||||
this.webClient.get().uri(this.serverUrl)
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.clientRegistrationId(clientRegistration.getRegistrationId()))
|
||||
.retrieve().bodyToMono(String.class)
|
||||
.subscriberContext(Context.of(ServerWebExchange.class, this.exchange))
|
||||
.subscriberContext(ReactiveSecurityContextHolder.withAuthentication(this.authentication)).block();
|
||||
|
||||
assertThat(this.server.getRequestCount()).isEqualTo(2);
|
||||
|
||||
ArgumentCaptor<OAuth2AuthorizedClient> authorizedClientCaptor = ArgumentCaptor
|
||||
.forClass(OAuth2AuthorizedClient.class);
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(authorizedClientCaptor.capture(),
|
||||
@@ -205,25 +193,20 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionITests {
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\",\n"
|
||||
+ " \"scope\": \"read write\"\n" + "}\n";
|
||||
String clientResponse = "{\n" + " \"attribute1\": \"value1\",\n" + " \"attribute2\": \"value2\"\n" + "}\n";
|
||||
|
||||
// Client 1
|
||||
this.server.enqueue(jsonResponse(accessTokenResponse));
|
||||
this.server.enqueue(jsonResponse(clientResponse));
|
||||
|
||||
ClientRegistration clientRegistration1 = TestClientRegistrations.clientCredentials().registrationId("client-1")
|
||||
.tokenUri(this.serverUrl).build();
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(clientRegistration1.getRegistrationId())))
|
||||
.willReturn(Mono.just(clientRegistration1));
|
||||
|
||||
// Client 2
|
||||
this.server.enqueue(jsonResponse(accessTokenResponse));
|
||||
this.server.enqueue(jsonResponse(clientResponse));
|
||||
|
||||
ClientRegistration clientRegistration2 = TestClientRegistrations.clientCredentials().registrationId("client-2")
|
||||
.tokenUri(this.serverUrl).build();
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(clientRegistration2.getRegistrationId())))
|
||||
.willReturn(Mono.just(clientRegistration2));
|
||||
|
||||
this.webClient.get().uri(this.serverUrl)
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.clientRegistrationId(clientRegistration1.getRegistrationId()))
|
||||
@@ -234,9 +217,7 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionITests {
|
||||
.retrieve().bodyToMono(String.class))
|
||||
.subscriberContext(Context.of(ServerWebExchange.class, this.exchange))
|
||||
.subscriberContext(ReactiveSecurityContextHolder.withAuthentication(this.authentication)).block();
|
||||
|
||||
assertThat(this.server.getRequestCount()).isEqualTo(4);
|
||||
|
||||
ArgumentCaptor<OAuth2AuthorizedClient> authorizedClientCaptor = ArgumentCaptor
|
||||
.forClass(OAuth2AuthorizedClient.class);
|
||||
verify(this.authorizedClientRepository, times(2)).saveAuthorizedClient(authorizedClientCaptor.capture(),
|
||||
@@ -258,12 +239,10 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionITests {
|
||||
this.server.enqueue(new MockResponse().setResponseCode(HttpStatus.UNAUTHORIZED.value()));
|
||||
this.server.enqueue(jsonResponse(accessTokenResponse));
|
||||
this.server.enqueue(jsonResponse(clientResponse));
|
||||
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientCredentials().tokenUri(this.serverUrl)
|
||||
.build();
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(clientRegistration.getRegistrationId())))
|
||||
.willReturn(Mono.just(clientRegistration));
|
||||
|
||||
OAuth2AccessToken accessToken = TestOAuth2AccessTokens.scopes("read", "write");
|
||||
OAuth2RefreshToken refreshToken = TestOAuth2RefreshTokens.refreshToken();
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(clientRegistration,
|
||||
@@ -271,29 +250,22 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionITests {
|
||||
doReturn(Mono.just(authorizedClient)).doReturn(Mono.empty()).when(this.authorizedClientRepository)
|
||||
.loadAuthorizedClient(eq(clientRegistration.getRegistrationId()), eq(this.authentication),
|
||||
eq(this.exchange));
|
||||
|
||||
Mono<String> requestMono = this.webClient.get().uri(this.serverUrl)
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.clientRegistrationId(clientRegistration.getRegistrationId()))
|
||||
.retrieve().bodyToMono(String.class)
|
||||
.subscriberContext(Context.of(ServerWebExchange.class, this.exchange))
|
||||
.subscriberContext(ReactiveSecurityContextHolder.withAuthentication(this.authentication));
|
||||
|
||||
// first try should fail, and remove the cached authorized client
|
||||
assertThatCode(requestMono::block).isInstanceOfSatisfying(WebClientResponseException.class,
|
||||
(e) -> assertThat(e.getStatusCode()).isEqualTo(HttpStatus.UNAUTHORIZED));
|
||||
|
||||
assertThat(this.server.getRequestCount()).isEqualTo(1);
|
||||
|
||||
verify(this.authorizedClientRepository, never()).saveAuthorizedClient(any(), any(), any());
|
||||
verify(this.authorizedClientRepository).removeAuthorizedClient(eq(clientRegistration.getRegistrationId()),
|
||||
eq(this.authentication), eq(this.exchange));
|
||||
|
||||
// second try should retrieve the authorized client and succeed
|
||||
requestMono.block();
|
||||
|
||||
assertThat(this.server.getRequestCount()).isEqualTo(3);
|
||||
|
||||
ArgumentCaptor<OAuth2AuthorizedClient> authorizedClientCaptor = ArgumentCaptor
|
||||
.forClass(OAuth2AuthorizedClient.class);
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(authorizedClientCaptor.capture(),
|
||||
|
||||
@@ -209,9 +209,7 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
@Test
|
||||
public void filterWhenAuthorizedClientNullThenAuthorizationHeaderNull() {
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com")).build();
|
||||
|
||||
this.function.filter(request, this.exchange).block();
|
||||
|
||||
assertThat(this.exchange.getRequest().headers().getFirst(HttpHeaders.AUTHORIZATION)).isNull();
|
||||
}
|
||||
|
||||
@@ -222,9 +220,7 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange).subscriberContext(serverWebExchange()).block();
|
||||
|
||||
assertThat(this.exchange.getRequest().headers().getFirst(HttpHeaders.AUTHORIZATION))
|
||||
.isEqualTo("Bearer " + this.accessToken.getTokenValue());
|
||||
}
|
||||
@@ -237,9 +233,7 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.header(HttpHeaders.AUTHORIZATION, "Existing")
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange).subscriberContext(serverWebExchange()).block();
|
||||
|
||||
HttpHeaders headers = this.exchange.getRequest().headers();
|
||||
assertThat(headers.get(HttpHeaders.AUTHORIZATION)).containsOnly("Bearer " + this.accessToken.getTokenValue());
|
||||
}
|
||||
@@ -250,7 +244,6 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).expiresIn(360).build();
|
||||
given(this.clientCredentialsTokenResponseClient.getTokenResponse(any()))
|
||||
.willReturn(Mono.just(accessTokenResponse));
|
||||
|
||||
ClientRegistration registration = TestClientRegistrations.clientCredentials().build();
|
||||
Instant issuedAt = Instant.now().minus(Duration.ofDays(1));
|
||||
Instant accessTokenExpiresAt = issuedAt.plus(Duration.ofHours(1));
|
||||
@@ -258,20 +251,15 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
this.accessToken.getTokenValue(), issuedAt, accessTokenExpiresAt);
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(registration, "principalName", accessToken,
|
||||
null);
|
||||
|
||||
TestingAuthenticationToken authentication = new TestingAuthenticationToken("test", "this");
|
||||
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange)
|
||||
.subscriberContext(ReactiveSecurityContextHolder.withAuthentication(authentication))
|
||||
.subscriberContext(serverWebExchange()).block();
|
||||
|
||||
verify(this.clientCredentialsTokenResponseClient).getTokenResponse(any());
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(any(), eq(authentication), any());
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
ClientRequest request1 = requests.get(0);
|
||||
@@ -285,19 +273,15 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
public void filterWhenClientCredentialsTokenNotExpiredThenUseCurrentToken() {
|
||||
TestingAuthenticationToken authentication = new TestingAuthenticationToken("test", "this");
|
||||
ClientRegistration registration = TestClientRegistrations.clientCredentials().build();
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(registration, "principalName",
|
||||
this.accessToken, null);
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange)
|
||||
.subscriberContext(ReactiveSecurityContextHolder.withAuthentication(authentication))
|
||||
.subscriberContext(serverWebExchange()).block();
|
||||
|
||||
verify(this.clientCredentialsTokenResponseClient, never()).getTokenResponse(any());
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
ClientRequest request1 = requests.get(0);
|
||||
@@ -312,7 +296,6 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
OAuth2AccessTokenResponse response = OAuth2AccessTokenResponse.withToken("token-1")
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).expiresIn(3600).refreshToken("refresh-1").build();
|
||||
given(this.refreshTokenTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(response));
|
||||
|
||||
Instant issuedAt = Instant.now().minus(Duration.ofDays(1));
|
||||
Instant accessTokenExpiresAt = issuedAt.plus(Duration.ofHours(1));
|
||||
this.accessToken = new OAuth2AccessToken(this.accessToken.getTokenType(), this.accessToken.getTokenValue(),
|
||||
@@ -320,27 +303,21 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
OAuth2RefreshToken refreshToken = new OAuth2RefreshToken("refresh-token", issuedAt);
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken, refreshToken);
|
||||
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
.build();
|
||||
|
||||
TestingAuthenticationToken authentication = new TestingAuthenticationToken("test", "this");
|
||||
this.function.filter(request, this.exchange)
|
||||
.subscriberContext(ReactiveSecurityContextHolder.withAuthentication(authentication))
|
||||
.subscriberContext(serverWebExchange()).block();
|
||||
|
||||
verify(this.refreshTokenTokenResponseClient).getTokenResponse(any());
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(this.authorizedClientCaptor.capture(),
|
||||
eq(authentication), any());
|
||||
|
||||
OAuth2AuthorizedClient newAuthorizedClient = this.authorizedClientCaptor.getValue();
|
||||
assertThat(newAuthorizedClient.getAccessToken()).isEqualTo(response.getAccessToken());
|
||||
assertThat(newAuthorizedClient.getRefreshToken()).isEqualTo(response.getRefreshToken());
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
|
||||
ClientRequest request0 = requests.get(0);
|
||||
assertThat(request0.headers().getFirst(HttpHeaders.AUTHORIZATION)).isEqualTo("Bearer token-1");
|
||||
assertThat(request0.url().toASCIIString()).isEqualTo("https://example.com");
|
||||
@@ -354,26 +331,20 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).expiresIn(3600).refreshToken("refresh-1").build();
|
||||
given(this.refreshTokenTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(response));
|
||||
Instant issuedAt = Instant.now().minus(Duration.ofDays(1));
|
||||
|
||||
Instant accessTokenExpiresAt = issuedAt.plus(Duration.ofHours(1));
|
||||
this.accessToken = new OAuth2AccessToken(this.accessToken.getTokenType(), this.accessToken.getTokenValue(),
|
||||
issuedAt, accessTokenExpiresAt);
|
||||
|
||||
OAuth2RefreshToken refreshToken = new OAuth2RefreshToken("refresh-token", issuedAt);
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken, refreshToken);
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange).subscriberContext(serverWebExchange()).block();
|
||||
|
||||
verify(this.refreshTokenTokenResponseClient).getTokenResponse(any());
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(any(), any(), any());
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
|
||||
ClientRequest request0 = requests.get(0);
|
||||
assertThat(request0.headers().getFirst(HttpHeaders.AUTHORIZATION)).isEqualTo("Bearer token-1");
|
||||
assertThat(request0.url().toASCIIString()).isEqualTo("https://example.com");
|
||||
@@ -388,12 +359,9 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange).subscriberContext(serverWebExchange()).block();
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
|
||||
ClientRequest request0 = requests.get(0);
|
||||
assertThat(request0.headers().getFirst(HttpHeaders.AUTHORIZATION)).isEqualTo("Bearer token-0");
|
||||
assertThat(request0.url().toASCIIString()).isEqualTo("https://example.com");
|
||||
@@ -409,12 +377,9 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange).subscriberContext(serverWebExchange()).block();
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
|
||||
ClientRequest request0 = requests.get(0);
|
||||
assertThat(request0.headers().getFirst(HttpHeaders.AUTHORIZATION)).isEqualTo("Bearer token-0");
|
||||
assertThat(request0.url().toASCIIString()).isEqualTo("https://example.com");
|
||||
@@ -425,27 +390,20 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
@Test
|
||||
public void filterWhenUnauthorizedThenInvokeFailureHandler() {
|
||||
this.function.setAuthorizationFailureHandler(this.authorizationFailureHandler);
|
||||
|
||||
PublisherProbe<Void> publisherProbe = PublisherProbe.empty();
|
||||
given(this.authorizationFailureHandler.onAuthorizationFailure(any(), any(), any()))
|
||||
.willReturn(publisherProbe.mono());
|
||||
|
||||
OAuth2RefreshToken refreshToken = new OAuth2RefreshToken("refresh-token", this.accessToken.getIssuedAt());
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken, refreshToken);
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
.build();
|
||||
|
||||
given(this.exchange.getResponse().rawStatusCode()).willReturn(HttpStatus.UNAUTHORIZED.value());
|
||||
|
||||
this.function.filter(request, this.exchange).subscriberContext(serverWebExchange()).block();
|
||||
|
||||
assertThat(publisherProbe.wasSubscribed()).isTrue();
|
||||
|
||||
verify(this.authorizationFailureHandler).onAuthorizationFailure(this.authorizationExceptionCaptor.capture(),
|
||||
this.authenticationCaptor.capture(), this.attributesCaptor.capture());
|
||||
|
||||
assertThat(this.authorizationExceptionCaptor.getValue())
|
||||
.isInstanceOfSatisfying(ClientAuthorizationException.class, (e) -> {
|
||||
assertThat(e.getClientRegistrationId()).isEqualTo(this.registration.getRegistrationId());
|
||||
@@ -461,31 +419,23 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
@Test
|
||||
public void filterWhenUnauthorizedWithWebClientExceptionThenInvokeFailureHandler() {
|
||||
this.function.setAuthorizationFailureHandler(this.authorizationFailureHandler);
|
||||
|
||||
PublisherProbe<Void> publisherProbe = PublisherProbe.empty();
|
||||
given(this.authorizationFailureHandler.onAuthorizationFailure(any(), any(), any()))
|
||||
.willReturn(publisherProbe.mono());
|
||||
|
||||
OAuth2RefreshToken refreshToken = new OAuth2RefreshToken("refresh-token", this.accessToken.getIssuedAt());
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken, refreshToken);
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
.build();
|
||||
|
||||
WebClientResponseException exception = WebClientResponseException.create(HttpStatus.UNAUTHORIZED.value(),
|
||||
HttpStatus.UNAUTHORIZED.getReasonPhrase(), HttpHeaders.EMPTY, new byte[0], StandardCharsets.UTF_8);
|
||||
|
||||
ExchangeFunction throwingExchangeFunction = (r) -> Mono.error(exception);
|
||||
|
||||
assertThatCode(() -> this.function.filter(request, throwingExchangeFunction)
|
||||
.subscriberContext(serverWebExchange()).block()).isEqualTo(exception);
|
||||
|
||||
assertThat(publisherProbe.wasSubscribed()).isTrue();
|
||||
|
||||
verify(this.authorizationFailureHandler).onAuthorizationFailure(this.authorizationExceptionCaptor.capture(),
|
||||
this.authenticationCaptor.capture(), this.attributesCaptor.capture());
|
||||
|
||||
assertThat(this.authorizationExceptionCaptor.getValue())
|
||||
.isInstanceOfSatisfying(ClientAuthorizationException.class, (e) -> {
|
||||
assertThat(e.getClientRegistrationId()).isEqualTo(this.registration.getRegistrationId());
|
||||
@@ -501,27 +451,20 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
@Test
|
||||
public void filterWhenForbiddenThenInvokeFailureHandler() {
|
||||
this.function.setAuthorizationFailureHandler(this.authorizationFailureHandler);
|
||||
|
||||
PublisherProbe<Void> publisherProbe = PublisherProbe.empty();
|
||||
given(this.authorizationFailureHandler.onAuthorizationFailure(any(), any(), any()))
|
||||
.willReturn(publisherProbe.mono());
|
||||
|
||||
OAuth2RefreshToken refreshToken = new OAuth2RefreshToken("refresh-token", this.accessToken.getIssuedAt());
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken, refreshToken);
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
.build();
|
||||
|
||||
given(this.exchange.getResponse().rawStatusCode()).willReturn(HttpStatus.FORBIDDEN.value());
|
||||
|
||||
this.function.filter(request, this.exchange).subscriberContext(serverWebExchange()).block();
|
||||
|
||||
assertThat(publisherProbe.wasSubscribed()).isTrue();
|
||||
|
||||
verify(this.authorizationFailureHandler).onAuthorizationFailure(this.authorizationExceptionCaptor.capture(),
|
||||
this.authenticationCaptor.capture(), this.attributesCaptor.capture());
|
||||
|
||||
assertThat(this.authorizationExceptionCaptor.getValue())
|
||||
.isInstanceOfSatisfying(ClientAuthorizationException.class, (e) -> {
|
||||
assertThat(e.getClientRegistrationId()).isEqualTo(this.registration.getRegistrationId());
|
||||
@@ -537,31 +480,23 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
@Test
|
||||
public void filterWhenForbiddenWithWebClientExceptionThenInvokeFailureHandler() {
|
||||
this.function.setAuthorizationFailureHandler(this.authorizationFailureHandler);
|
||||
|
||||
PublisherProbe<Void> publisherProbe = PublisherProbe.empty();
|
||||
given(this.authorizationFailureHandler.onAuthorizationFailure(any(), any(), any()))
|
||||
.willReturn(publisherProbe.mono());
|
||||
|
||||
OAuth2RefreshToken refreshToken = new OAuth2RefreshToken("refresh-token", this.accessToken.getIssuedAt());
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken, refreshToken);
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
.build();
|
||||
|
||||
WebClientResponseException exception = WebClientResponseException.create(HttpStatus.FORBIDDEN.value(),
|
||||
HttpStatus.FORBIDDEN.getReasonPhrase(), HttpHeaders.EMPTY, new byte[0], StandardCharsets.UTF_8);
|
||||
|
||||
ExchangeFunction throwingExchangeFunction = (r) -> Mono.error(exception);
|
||||
|
||||
assertThatCode(() -> this.function.filter(request, throwingExchangeFunction)
|
||||
.subscriberContext(serverWebExchange()).block()).isEqualTo(exception);
|
||||
|
||||
assertThat(publisherProbe.wasSubscribed()).isTrue();
|
||||
|
||||
verify(this.authorizationFailureHandler).onAuthorizationFailure(this.authorizationExceptionCaptor.capture(),
|
||||
this.authenticationCaptor.capture(), this.attributesCaptor.capture());
|
||||
|
||||
assertThat(this.authorizationExceptionCaptor.getValue())
|
||||
.isInstanceOfSatisfying(ClientAuthorizationException.class, (e) -> {
|
||||
assertThat(e.getClientRegistrationId()).isEqualTo(this.registration.getRegistrationId());
|
||||
@@ -577,18 +512,15 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
@Test
|
||||
public void filterWhenWWWAuthenticateHeaderIncludesErrorThenInvokeFailureHandler() {
|
||||
this.function.setAuthorizationFailureHandler(this.authorizationFailureHandler);
|
||||
|
||||
PublisherProbe<Void> publisherProbe = PublisherProbe.empty();
|
||||
given(this.authorizationFailureHandler.onAuthorizationFailure(any(), any(), any()))
|
||||
.willReturn(publisherProbe.mono());
|
||||
|
||||
OAuth2RefreshToken refreshToken = new OAuth2RefreshToken("refresh-token", this.accessToken.getIssuedAt());
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken, refreshToken);
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
.build();
|
||||
|
||||
String wwwAuthenticateHeader = "Bearer error=\"insufficient_scope\", "
|
||||
+ "error_description=\"The request requires higher privileges than provided by the access token.\", "
|
||||
+ "error_uri=\"https://tools.ietf.org/html/rfc6750#section-3.1\"";
|
||||
@@ -596,14 +528,10 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
given(headers.header(eq(HttpHeaders.WWW_AUTHENTICATE)))
|
||||
.willReturn(Collections.singletonList(wwwAuthenticateHeader));
|
||||
given(this.exchange.getResponse().headers()).willReturn(headers);
|
||||
|
||||
this.function.filter(request, this.exchange).subscriberContext(serverWebExchange()).block();
|
||||
|
||||
assertThat(publisherProbe.wasSubscribed()).isTrue();
|
||||
|
||||
verify(this.authorizationFailureHandler).onAuthorizationFailure(this.authorizationExceptionCaptor.capture(),
|
||||
this.authenticationCaptor.capture(), this.attributesCaptor.capture());
|
||||
|
||||
assertThat(this.authorizationExceptionCaptor.getValue())
|
||||
.isInstanceOfSatisfying(ClientAuthorizationException.class, (e) -> {
|
||||
assertThat(e.getClientRegistrationId()).isEqualTo(this.registration.getRegistrationId());
|
||||
@@ -622,31 +550,23 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
@Test
|
||||
public void filterWhenAuthorizationExceptionThenInvokeFailureHandler() {
|
||||
this.function.setAuthorizationFailureHandler(this.authorizationFailureHandler);
|
||||
|
||||
PublisherProbe<Void> publisherProbe = PublisherProbe.empty();
|
||||
given(this.authorizationFailureHandler.onAuthorizationFailure(any(), any(), any()))
|
||||
.willReturn(publisherProbe.mono());
|
||||
|
||||
OAuth2RefreshToken refreshToken = new OAuth2RefreshToken("refresh-token", this.accessToken.getIssuedAt());
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken, refreshToken);
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
.build();
|
||||
|
||||
OAuth2AuthorizationException exception = new OAuth2AuthorizationException(
|
||||
new OAuth2Error(OAuth2ErrorCodes.INVALID_TOKEN, null, null));
|
||||
|
||||
ExchangeFunction throwingExchangeFunction = (r) -> Mono.error(exception);
|
||||
|
||||
assertThatCode(() -> this.function.filter(request, throwingExchangeFunction)
|
||||
.subscriberContext(serverWebExchange()).block()).isEqualTo(exception);
|
||||
|
||||
assertThat(publisherProbe.wasSubscribed()).isTrue();
|
||||
|
||||
verify(this.authorizationFailureHandler).onAuthorizationFailure(this.authorizationExceptionCaptor.capture(),
|
||||
this.authenticationCaptor.capture(), this.attributesCaptor.capture());
|
||||
|
||||
assertThat(this.authorizationExceptionCaptor.getValue()).isSameAs(exception);
|
||||
assertThat(this.authenticationCaptor.getValue()).isInstanceOf(AnonymousAuthenticationToken.class);
|
||||
assertThat(this.attributesCaptor.getValue())
|
||||
@@ -656,18 +576,14 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
@Test
|
||||
public void filterWhenOtherHttpStatusShouldNotInvokeFailureHandler() {
|
||||
this.function.setAuthorizationFailureHandler(this.authorizationFailureHandler);
|
||||
|
||||
OAuth2RefreshToken refreshToken = new OAuth2RefreshToken("refresh-token", this.accessToken.getIssuedAt());
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken, refreshToken);
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
.build();
|
||||
|
||||
given(this.exchange.getResponse().rawStatusCode()).willReturn(HttpStatus.BAD_REQUEST.value());
|
||||
|
||||
this.function.filter(request, this.exchange).subscriberContext(serverWebExchange()).block();
|
||||
|
||||
verify(this.authorizationFailureHandler, never()).onAuthorizationFailure(any(), any(), any());
|
||||
}
|
||||
|
||||
@@ -675,16 +591,13 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
public void filterWhenPasswordClientNotAuthorizedThenGetNewToken() {
|
||||
TestingAuthenticationToken authentication = new TestingAuthenticationToken("test", "this");
|
||||
ClientRegistration registration = TestClientRegistrations.password().build();
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = OAuth2AccessTokenResponse.withToken("new-token")
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).expiresIn(360).build();
|
||||
given(this.passwordTokenResponseClient.getTokenResponse(any())).willReturn(Mono.just(accessTokenResponse));
|
||||
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(registration.getRegistrationId())))
|
||||
.willReturn(Mono.just(registration));
|
||||
given(this.authorizedClientRepository.loadAuthorizedClient(eq(registration.getRegistrationId()),
|
||||
eq(authentication), any())).willReturn(Mono.empty());
|
||||
|
||||
// Set custom contextAttributesMapper capable of mapping the form parameters
|
||||
this.authorizedClientManager.setContextAttributesMapper((authorizeRequest) -> {
|
||||
ServerWebExchange serverWebExchange = authorizeRequest.getAttribute(ServerWebExchange.class.getName());
|
||||
@@ -699,23 +612,18 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
return contextAttributes;
|
||||
});
|
||||
});
|
||||
|
||||
this.serverWebExchange = MockServerWebExchange.builder(MockServerHttpRequest.post("/")
|
||||
.contentType(MediaType.APPLICATION_FORM_URLENCODED).body("username=username&password=password"))
|
||||
.build();
|
||||
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.clientRegistrationId(registration.getRegistrationId()))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange)
|
||||
.subscriberContext(ReactiveSecurityContextHolder.withAuthentication(authentication))
|
||||
.subscriberContext(serverWebExchange()).block();
|
||||
|
||||
verify(this.passwordTokenResponseClient).getTokenResponse(any());
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(any(), eq(authentication), any());
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
ClientRequest request1 = requests.get(0);
|
||||
@@ -736,12 +644,9 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.clientRegistrationId(this.registration.getRegistrationId()))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange).subscriberContext(serverWebExchange()).block();
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
|
||||
ClientRequest request0 = requests.get(0);
|
||||
assertThat(request0.headers().getFirst(HttpHeaders.AUTHORIZATION)).isEqualTo("Bearer token-0");
|
||||
assertThat(request0.url().toASCIIString()).isEqualTo("https://example.com");
|
||||
@@ -758,12 +663,9 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
given(this.authorizedClientRepository.loadAuthorizedClient(any(), any(), any()))
|
||||
.willReturn(Mono.just(authorizedClient));
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com")).build();
|
||||
|
||||
this.function.filter(request, this.exchange).subscriberContext(serverWebExchange()).block();
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
|
||||
ClientRequest request0 = requests.get(0);
|
||||
assertThat(request0.headers().getFirst(HttpHeaders.AUTHORIZATION)).isEqualTo("Bearer token-0");
|
||||
assertThat(request0.url().toASCIIString()).isEqualTo("https://example.com");
|
||||
@@ -774,14 +676,12 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
@Test
|
||||
public void filterWhenClientRegistrationIdFromAuthenticationThenAuthorizedClientResolved() {
|
||||
this.function.setDefaultOAuth2AuthorizedClient(true);
|
||||
|
||||
OAuth2RefreshToken refreshToken = new OAuth2RefreshToken("refresh-token", this.accessToken.getIssuedAt());
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken, refreshToken);
|
||||
given(this.authorizedClientRepository.loadAuthorizedClient(any(), any(), any()))
|
||||
.willReturn(Mono.just(authorizedClient));
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com")).build();
|
||||
|
||||
OAuth2User user = new DefaultOAuth2User(AuthorityUtils.createAuthorityList("ROLE_USER"),
|
||||
Collections.singletonMap("user", "rob"), "user");
|
||||
OAuth2AuthenticationToken authentication = new OAuth2AuthenticationToken(user, user.getAuthorities(),
|
||||
@@ -789,10 +689,8 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
this.function.filter(request, this.exchange)
|
||||
.subscriberContext(ReactiveSecurityContextHolder.withAuthentication(authentication))
|
||||
.subscriberContext(serverWebExchange()).block();
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
|
||||
ClientRequest request0 = requests.get(0);
|
||||
assertThat(request0.headers().getFirst(HttpHeaders.AUTHORIZATION)).isEqualTo("Bearer token-0");
|
||||
assertThat(request0.url().toASCIIString()).isEqualTo("https://example.com");
|
||||
@@ -803,18 +701,14 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
@Test
|
||||
public void filterWhenDefaultOAuth2AuthorizedClientFalseThenEmpty() {
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com")).build();
|
||||
|
||||
OAuth2User user = new DefaultOAuth2User(AuthorityUtils.createAuthorityList("ROLE_USER"),
|
||||
Collections.singletonMap("user", "rob"), "user");
|
||||
OAuth2AuthenticationToken authentication = new OAuth2AuthenticationToken(user, user.getAuthorities(),
|
||||
"client-id");
|
||||
|
||||
this.function.filter(request, this.exchange)
|
||||
.subscriberContext(ReactiveSecurityContextHolder.withAuthentication(authentication)).block();
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
|
||||
verifyZeroInteractions(this.clientRegistrationRepository, this.authorizedClientRepository);
|
||||
}
|
||||
|
||||
@@ -829,9 +723,7 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.clientRegistrationId(this.registration.getRegistrationId()))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange).subscriberContext(serverWebExchange()).block();
|
||||
|
||||
verify(this.authorizedClientRepository).loadAuthorizedClient(eq(this.registration.getRegistrationId()), any(),
|
||||
eq(this.serverWebExchange));
|
||||
}
|
||||
@@ -846,27 +738,21 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
this.function = new ServerOAuth2AuthorizedClientExchangeFilterFunction(this.clientRegistrationRepository,
|
||||
unauthenticatedAuthorizedClientRepository);
|
||||
this.function.setClientCredentialsTokenResponseClient(this.clientCredentialsTokenResponseClient);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = OAuth2AccessTokenResponse.withToken("new-token")
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).expiresIn(360).build();
|
||||
given(this.clientCredentialsTokenResponseClient.getTokenResponse(any()))
|
||||
.willReturn(Mono.just(accessTokenResponse));
|
||||
|
||||
ClientRegistration registration = TestClientRegistrations.clientCredentials().build();
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(registration.getRegistrationId())))
|
||||
.willReturn(Mono.just(registration));
|
||||
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.clientRegistrationId(registration.getRegistrationId()))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange).block();
|
||||
|
||||
verify(unauthenticatedAuthorizedClientRepository).loadAuthorizedClient(any(), any(), any());
|
||||
verify(this.clientCredentialsTokenResponseClient).getTokenResponse(any());
|
||||
verify(unauthenticatedAuthorizedClientRepository).saveAuthorizedClient(any(), any(), any());
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
ClientRequest request1 = requests.get(0);
|
||||
@@ -891,7 +777,6 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
messageWriters.add(new FormHttpMessageWriter());
|
||||
messageWriters.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.allMimeTypes()));
|
||||
messageWriters.add(new MultipartHttpMessageWriter(messageWriters));
|
||||
|
||||
BodyInserter.Context context = new BodyInserter.Context() {
|
||||
@Override
|
||||
public List<HttpMessageWriter<?>> messageWriters() {
|
||||
@@ -908,7 +793,6 @@ public class ServerOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
return new HashMap<>();
|
||||
}
|
||||
};
|
||||
|
||||
MockClientHttpRequest body = new MockClientHttpRequest(HttpMethod.GET, "/");
|
||||
request.body().insert(body, context).block();
|
||||
return body.getBodyAsString().block();
|
||||
|
||||
@@ -152,22 +152,17 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionITests {
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\",\n"
|
||||
+ " \"scope\": \"read write\"\n" + "}\n";
|
||||
String clientResponse = "{\n" + " \"attribute1\": \"value1\",\n" + " \"attribute2\": \"value2\"\n" + "}\n";
|
||||
|
||||
this.server.enqueue(jsonResponse(accessTokenResponse));
|
||||
this.server.enqueue(jsonResponse(clientResponse));
|
||||
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientCredentials().tokenUri(this.serverUrl)
|
||||
.build();
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(clientRegistration.getRegistrationId())))
|
||||
.willReturn(clientRegistration);
|
||||
|
||||
this.webClient.get().uri(this.serverUrl)
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.clientRegistrationId(clientRegistration.getRegistrationId()))
|
||||
.retrieve().bodyToMono(String.class).block();
|
||||
|
||||
assertThat(this.server.getRequestCount()).isEqualTo(2);
|
||||
|
||||
ArgumentCaptor<OAuth2AuthorizedClient> authorizedClientCaptor = ArgumentCaptor
|
||||
.forClass(OAuth2AuthorizedClient.class);
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(authorizedClientCaptor.capture(),
|
||||
@@ -180,15 +175,12 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionITests {
|
||||
String accessTokenResponse = "{\n" + " \"access_token\": \"refreshed-access-token\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\"\n" + "}\n";
|
||||
String clientResponse = "{\n" + " \"attribute1\": \"value1\",\n" + " \"attribute2\": \"value2\"\n" + "}\n";
|
||||
|
||||
this.server.enqueue(jsonResponse(accessTokenResponse));
|
||||
this.server.enqueue(jsonResponse(clientResponse));
|
||||
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientRegistration().tokenUri(this.serverUrl)
|
||||
.build();
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(clientRegistration.getRegistrationId())))
|
||||
.willReturn(clientRegistration);
|
||||
|
||||
Instant issuedAt = Instant.now().minus(Duration.ofDays(1));
|
||||
Instant expiresAt = issuedAt.plus(Duration.ofHours(1));
|
||||
OAuth2AccessToken accessToken = new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER,
|
||||
@@ -198,14 +190,11 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionITests {
|
||||
this.authentication.getName(), accessToken, refreshToken);
|
||||
doReturn(authorizedClient).when(this.authorizedClientRepository).loadAuthorizedClient(
|
||||
eq(clientRegistration.getRegistrationId()), eq(this.authentication), eq(this.request));
|
||||
|
||||
this.webClient.get().uri(this.serverUrl)
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.clientRegistrationId(clientRegistration.getRegistrationId()))
|
||||
.retrieve().bodyToMono(String.class).block();
|
||||
|
||||
assertThat(this.server.getRequestCount()).isEqualTo(2);
|
||||
|
||||
ArgumentCaptor<OAuth2AuthorizedClient> authorizedClientCaptor = ArgumentCaptor
|
||||
.forClass(OAuth2AuthorizedClient.class);
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(authorizedClientCaptor.capture(),
|
||||
@@ -221,25 +210,20 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionITests {
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": \"3600\",\n"
|
||||
+ " \"scope\": \"read write\"\n" + "}\n";
|
||||
String clientResponse = "{\n" + " \"attribute1\": \"value1\",\n" + " \"attribute2\": \"value2\"\n" + "}\n";
|
||||
|
||||
// Client 1
|
||||
this.server.enqueue(jsonResponse(accessTokenResponse));
|
||||
this.server.enqueue(jsonResponse(clientResponse));
|
||||
|
||||
ClientRegistration clientRegistration1 = TestClientRegistrations.clientCredentials().registrationId("client-1")
|
||||
.tokenUri(this.serverUrl).build();
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(clientRegistration1.getRegistrationId())))
|
||||
.willReturn(clientRegistration1);
|
||||
|
||||
// Client 2
|
||||
this.server.enqueue(jsonResponse(accessTokenResponse));
|
||||
this.server.enqueue(jsonResponse(clientResponse));
|
||||
|
||||
ClientRegistration clientRegistration2 = TestClientRegistrations.clientCredentials().registrationId("client-2")
|
||||
.tokenUri(this.serverUrl).build();
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(clientRegistration2.getRegistrationId())))
|
||||
.willReturn(clientRegistration2);
|
||||
|
||||
this.webClient.get().uri(this.serverUrl)
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.clientRegistrationId(clientRegistration1.getRegistrationId()))
|
||||
@@ -249,9 +233,7 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionITests {
|
||||
.clientRegistrationId(clientRegistration2.getRegistrationId()))
|
||||
.retrieve().bodyToMono(String.class))
|
||||
.subscriberContext(context()).block();
|
||||
|
||||
assertThat(this.server.getRequestCount()).isEqualTo(4);
|
||||
|
||||
ArgumentCaptor<OAuth2AuthorizedClient> authorizedClientCaptor = ArgumentCaptor
|
||||
.forClass(OAuth2AuthorizedClient.class);
|
||||
verify(this.authorizedClientRepository, times(2)).saveAuthorizedClient(authorizedClientCaptor.capture(),
|
||||
|
||||
@@ -265,18 +265,14 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
private Map<String, Object> getDefaultRequestAttributes() {
|
||||
this.function.defaultRequest().accept(this.spec);
|
||||
verify(this.spec).attributes(this.attrs.capture());
|
||||
|
||||
this.attrs.getValue().accept(this.result);
|
||||
|
||||
return this.result;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void filterWhenAuthorizedClientNullThenAuthorizationHeaderNull() {
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com")).build();
|
||||
|
||||
this.function.filter(request, this.exchange).block();
|
||||
|
||||
assertThat(this.exchange.getRequest().headers().getFirst(HttpHeaders.AUTHORIZATION)).isNull();
|
||||
}
|
||||
|
||||
@@ -284,7 +280,6 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
public void filterWhenAuthorizedClientThenAuthorizationHeader() {
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken);
|
||||
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(
|
||||
ServletOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
@@ -293,9 +288,7 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.httpServletResponse(new MockHttpServletResponse()))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange).block();
|
||||
|
||||
assertThat(this.exchange.getRequest().headers().getFirst(HttpHeaders.AUTHORIZATION))
|
||||
.isEqualTo("Bearer " + this.accessToken.getTokenValue());
|
||||
}
|
||||
@@ -304,7 +297,6 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
public void filterWhenExistingAuthorizationThenSingleAuthorizationHeader() {
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken);
|
||||
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.header(HttpHeaders.AUTHORIZATION, "Existing")
|
||||
.attributes(
|
||||
@@ -314,9 +306,7 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.httpServletResponse(new MockHttpServletResponse()))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange).block();
|
||||
|
||||
HttpHeaders headers = this.exchange.getRequest().headers();
|
||||
assertThat(headers.get(HttpHeaders.AUTHORIZATION)).containsOnly("Bearer " + this.accessToken.getTokenValue());
|
||||
}
|
||||
@@ -326,7 +316,6 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
OAuth2AccessTokenResponse response = OAuth2AccessTokenResponse.withToken("token-1")
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).expiresIn(3600).refreshToken("refresh-1").build();
|
||||
given(this.refreshTokenTokenResponseClient.getTokenResponse(any())).willReturn(response);
|
||||
|
||||
Instant issuedAt = Instant.now().minus(Duration.ofDays(1));
|
||||
Instant accessTokenExpiresAt = issuedAt.plus(Duration.ofHours(1));
|
||||
this.accessToken = new OAuth2AccessToken(this.accessToken.getTokenType(), this.accessToken.getTokenValue(),
|
||||
@@ -334,7 +323,6 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
OAuth2RefreshToken refreshToken = new OAuth2RefreshToken("refresh-token", issuedAt);
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken, refreshToken);
|
||||
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(
|
||||
ServletOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
@@ -344,20 +332,15 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.httpServletResponse(new MockHttpServletResponse()))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange).block();
|
||||
|
||||
verify(this.refreshTokenTokenResponseClient).getTokenResponse(any());
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(this.authorizedClientCaptor.capture(),
|
||||
eq(this.authentication), any(), any());
|
||||
|
||||
OAuth2AuthorizedClient newAuthorizedClient = this.authorizedClientCaptor.getValue();
|
||||
assertThat(newAuthorizedClient.getAccessToken()).isEqualTo(response.getAccessToken());
|
||||
assertThat(newAuthorizedClient.getRefreshToken()).isEqualTo(response.getRefreshToken());
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
|
||||
ClientRequest request0 = requests.get(0);
|
||||
assertThat(request0.headers().getFirst(HttpHeaders.AUTHORIZATION)).isEqualTo("Bearer token-1");
|
||||
assertThat(request0.url().toASCIIString()).isEqualTo("https://example.com");
|
||||
@@ -371,20 +354,17 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).expiresIn(3600)
|
||||
// .refreshToken(xxx) // No refreshToken in response
|
||||
.build();
|
||||
|
||||
RestOperations refreshTokenClient = mock(RestOperations.class);
|
||||
given(refreshTokenClient.exchange(any(RequestEntity.class), eq(OAuth2AccessTokenResponse.class)))
|
||||
.willReturn(new ResponseEntity(response, HttpStatus.OK));
|
||||
DefaultRefreshTokenTokenResponseClient refreshTokenTokenResponseClient = new DefaultRefreshTokenTokenResponseClient();
|
||||
refreshTokenTokenResponseClient.setRestOperations(refreshTokenClient);
|
||||
|
||||
RefreshTokenOAuth2AuthorizedClientProvider authorizedClientProvider = new RefreshTokenOAuth2AuthorizedClientProvider();
|
||||
authorizedClientProvider.setAccessTokenResponseClient(refreshTokenTokenResponseClient);
|
||||
DefaultOAuth2AuthorizedClientManager authorizedClientManager = new DefaultOAuth2AuthorizedClientManager(
|
||||
this.clientRegistrationRepository, this.authorizedClientRepository);
|
||||
authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);
|
||||
this.function = new ServletOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager);
|
||||
|
||||
Instant issuedAt = Instant.now().minus(Duration.ofDays(1));
|
||||
Instant accessTokenExpiresAt = issuedAt.plus(Duration.ofHours(1));
|
||||
this.accessToken = new OAuth2AccessToken(this.accessToken.getTokenType(), this.accessToken.getTokenValue(),
|
||||
@@ -392,7 +372,6 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
OAuth2RefreshToken refreshToken = new OAuth2RefreshToken("refresh-token", issuedAt);
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken, refreshToken);
|
||||
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(
|
||||
ServletOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
@@ -402,20 +381,15 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.httpServletResponse(new MockHttpServletResponse()))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange).block();
|
||||
|
||||
verify(refreshTokenClient).exchange(any(RequestEntity.class), eq(OAuth2AccessTokenResponse.class));
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(this.authorizedClientCaptor.capture(),
|
||||
eq(this.authentication), any(), any());
|
||||
|
||||
OAuth2AuthorizedClient newAuthorizedClient = this.authorizedClientCaptor.getValue();
|
||||
assertThat(newAuthorizedClient.getAccessToken()).isEqualTo(response.getAccessToken());
|
||||
assertThat(newAuthorizedClient.getRefreshToken().getTokenValue()).isEqualTo(refreshToken.getTokenValue());
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
|
||||
ClientRequest request0 = requests.get(0);
|
||||
assertThat(request0.headers().getFirst(HttpHeaders.AUTHORIZATION)).isEqualTo("Bearer token-1");
|
||||
assertThat(request0.url().toASCIIString()).isEqualTo("https://example.com");
|
||||
@@ -428,7 +402,6 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
this.registration = TestClientRegistrations.clientCredentials().build();
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken, null);
|
||||
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(
|
||||
ServletOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
@@ -438,17 +411,12 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.httpServletResponse(new MockHttpServletResponse()))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange).block();
|
||||
|
||||
verify(this.authorizedClientRepository, never()).saveAuthorizedClient(any(), eq(this.authentication), any(),
|
||||
any());
|
||||
|
||||
verify(this.clientCredentialsTokenResponseClient, never()).getTokenResponse(any());
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
|
||||
ClientRequest request1 = requests.get(0);
|
||||
assertThat(request1.headers().getFirst(HttpHeaders.AUTHORIZATION)).isEqualTo("Bearer token-0");
|
||||
assertThat(request1.url().toASCIIString()).isEqualTo("https://example.com");
|
||||
@@ -459,18 +427,14 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
@Test
|
||||
public void filterWhenClientCredentialsTokenExpiredThenGetNewToken() {
|
||||
this.registration = TestClientRegistrations.clientCredentials().build();
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse().build();
|
||||
given(this.clientCredentialsTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse);
|
||||
|
||||
Instant issuedAt = Instant.now().minus(Duration.ofDays(1));
|
||||
Instant accessTokenExpiresAt = issuedAt.plus(Duration.ofHours(1));
|
||||
this.accessToken = new OAuth2AccessToken(this.accessToken.getTokenType(), this.accessToken.getTokenValue(),
|
||||
issuedAt, accessTokenExpiresAt);
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken, null);
|
||||
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(
|
||||
ServletOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
@@ -480,16 +444,11 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.httpServletResponse(new MockHttpServletResponse()))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange).block();
|
||||
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(any(), eq(this.authentication), any(), any());
|
||||
|
||||
verify(this.clientCredentialsTokenResponseClient).getTokenResponse(any());
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
|
||||
ClientRequest request1 = requests.get(0);
|
||||
assertThat(request1.headers().getFirst(HttpHeaders.AUTHORIZATION)).isEqualTo("Bearer token");
|
||||
assertThat(request1.url().toASCIIString()).isEqualTo("https://example.com");
|
||||
@@ -502,11 +461,9 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
OAuth2AccessTokenResponse accessTokenResponse = OAuth2AccessTokenResponse.withToken("new-token")
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).expiresIn(360).build();
|
||||
given(this.passwordTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse);
|
||||
|
||||
ClientRegistration registration = TestClientRegistrations.password().build();
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(eq(registration.getRegistrationId())))
|
||||
.willReturn(registration);
|
||||
|
||||
// Set custom contextAttributesMapper
|
||||
this.authorizedClientManager.setContextAttributesMapper((authorizeRequest) -> {
|
||||
Map<String, Object> contextAttributes = new HashMap<>();
|
||||
@@ -519,12 +476,10 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
}
|
||||
return contextAttributes;
|
||||
});
|
||||
|
||||
MockHttpServletRequest servletRequest = new MockHttpServletRequest();
|
||||
servletRequest.setParameter(OAuth2ParameterNames.USERNAME, "username");
|
||||
servletRequest.setParameter(OAuth2ParameterNames.PASSWORD, "password");
|
||||
MockHttpServletResponse servletResponse = new MockHttpServletResponse();
|
||||
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.clientRegistrationId(registration.getRegistrationId()))
|
||||
@@ -532,12 +487,9 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction.httpServletRequest(servletRequest))
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction.httpServletResponse(servletResponse))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange).block();
|
||||
|
||||
verify(this.passwordTokenResponseClient).getTokenResponse(any());
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(any(), eq(this.authentication), any(), any());
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
ClientRequest request1 = requests.get(0);
|
||||
@@ -552,7 +504,6 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
OAuth2AccessTokenResponse response = OAuth2AccessTokenResponse.withToken("token-1")
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).expiresIn(3600).refreshToken("refresh-1").build();
|
||||
given(this.refreshTokenTokenResponseClient.getTokenResponse(any())).willReturn(response);
|
||||
|
||||
Instant issuedAt = Instant.now().minus(Duration.ofDays(1));
|
||||
Instant accessTokenExpiresAt = issuedAt.plus(Duration.ofHours(1));
|
||||
this.accessToken = new OAuth2AccessToken(this.accessToken.getTokenType(), this.accessToken.getTokenValue(),
|
||||
@@ -560,7 +511,6 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
OAuth2RefreshToken refreshToken = new OAuth2RefreshToken("refresh-token", issuedAt);
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken, refreshToken);
|
||||
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(
|
||||
ServletOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
@@ -569,15 +519,11 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.httpServletResponse(new MockHttpServletResponse()))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange).block();
|
||||
|
||||
verify(this.refreshTokenTokenResponseClient).getTokenResponse(any());
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(any(), any(), any(), any());
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
|
||||
ClientRequest request0 = requests.get(0);
|
||||
assertThat(request0.headers().getFirst(HttpHeaders.AUTHORIZATION)).isEqualTo("Bearer token-1");
|
||||
assertThat(request0.url().toASCIIString()).isEqualTo("https://example.com");
|
||||
@@ -589,7 +535,6 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
public void filterWhenRefreshTokenNullThenShouldRefreshFalse() {
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken);
|
||||
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(
|
||||
ServletOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
@@ -598,12 +543,9 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.httpServletResponse(new MockHttpServletResponse()))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange).block();
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
|
||||
ClientRequest request0 = requests.get(0);
|
||||
assertThat(request0.headers().getFirst(HttpHeaders.AUTHORIZATION)).isEqualTo("Bearer token-0");
|
||||
assertThat(request0.url().toASCIIString()).isEqualTo("https://example.com");
|
||||
@@ -616,7 +558,6 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
OAuth2RefreshToken refreshToken = new OAuth2RefreshToken("refresh-token", this.accessToken.getIssuedAt());
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken, refreshToken);
|
||||
|
||||
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("https://example.com"))
|
||||
.attributes(
|
||||
ServletOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(authorizedClient))
|
||||
@@ -625,12 +566,9 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction
|
||||
.httpServletResponse(new MockHttpServletResponse()))
|
||||
.build();
|
||||
|
||||
this.function.filter(request, this.exchange).block();
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(1);
|
||||
|
||||
ClientRequest request0 = requests.get(0);
|
||||
assertThat(request0.headers().getFirst(HttpHeaders.AUTHORIZATION)).isEqualTo("Bearer token-0");
|
||||
assertThat(request0.url().toASCIIString()).isEqualTo("https://example.com");
|
||||
@@ -642,44 +580,33 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
@Test
|
||||
public void filterWhenChainedThenDefaultsStillAvailable() throws Exception {
|
||||
this.function.setDefaultOAuth2AuthorizedClient(true);
|
||||
|
||||
MockHttpServletRequest servletRequest = new MockHttpServletRequest();
|
||||
MockHttpServletResponse servletResponse = new MockHttpServletResponse();
|
||||
|
||||
OAuth2User user = mock(OAuth2User.class);
|
||||
List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("ROLE_USER");
|
||||
OAuth2AuthenticationToken authentication = new OAuth2AuthenticationToken(user, authorities,
|
||||
this.registration.getRegistrationId());
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken);
|
||||
|
||||
given(this.authorizedClientRepository.loadAuthorizedClient(
|
||||
eq(authentication.getAuthorizedClientRegistrationId()), eq(authentication), eq(servletRequest)))
|
||||
.willReturn(authorizedClient);
|
||||
|
||||
// Default request attributes set
|
||||
final ClientRequest request1 = ClientRequest.create(HttpMethod.GET, URI.create("https://example1.com"))
|
||||
.attributes((attrs) -> attrs.putAll(getDefaultRequestAttributes())).build();
|
||||
|
||||
// Default request attributes NOT set
|
||||
final ClientRequest request2 = ClientRequest.create(HttpMethod.GET, URI.create("https://example2.com")).build();
|
||||
|
||||
Context context = context(servletRequest, servletResponse, authentication);
|
||||
|
||||
this.function.filter(request1, this.exchange)
|
||||
.flatMap((response) -> this.function.filter(request2, this.exchange)).subscriberContext(context)
|
||||
.block();
|
||||
|
||||
List<ClientRequest> requests = this.exchange.getRequests();
|
||||
assertThat(requests).hasSize(2);
|
||||
|
||||
ClientRequest request = requests.get(0);
|
||||
assertThat(request.headers().getFirst(HttpHeaders.AUTHORIZATION)).isEqualTo("Bearer token-0");
|
||||
assertThat(request.url().toASCIIString()).isEqualTo("https://example1.com");
|
||||
assertThat(request.method()).isEqualTo(HttpMethod.GET);
|
||||
assertThat(getBody(request)).isEmpty();
|
||||
|
||||
request = requests.get(1);
|
||||
assertThat(request.headers().getFirst(HttpHeaders.AUTHORIZATION)).isEqualTo("Bearer token-0");
|
||||
assertThat(request.url().toASCIIString()).isEqualTo("https://example2.com");
|
||||
@@ -708,16 +635,12 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction.httpServletRequest(servletRequest))
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction.httpServletResponse(servletResponse))
|
||||
.build();
|
||||
|
||||
given(this.exchange.getResponse().rawStatusCode()).willReturn(httpStatus.value());
|
||||
given(this.exchange.getResponse().headers()).willReturn(mock(ClientResponse.Headers.class));
|
||||
this.function.setAuthorizationFailureHandler(this.authorizationFailureHandler);
|
||||
|
||||
this.function.filter(request, this.exchange).block();
|
||||
|
||||
verify(this.authorizationFailureHandler).onAuthorizationFailure(this.authorizationExceptionCaptor.capture(),
|
||||
this.authenticationCaptor.capture(), this.attributesCaptor.capture());
|
||||
|
||||
assertThat(this.authorizationExceptionCaptor.getValue())
|
||||
.isInstanceOfSatisfying(ClientAuthorizationException.class, (e) -> {
|
||||
assertThat(e.getClientRegistrationId()).isEqualTo(this.registration.getRegistrationId());
|
||||
@@ -743,7 +666,6 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction.httpServletRequest(servletRequest))
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction.httpServletResponse(servletResponse))
|
||||
.build();
|
||||
|
||||
String wwwAuthenticateHeader = "Bearer error=\"insufficient_scope\", "
|
||||
+ "error_description=\"The request requires higher privileges than provided by the access token.\", "
|
||||
+ "error_uri=\"https://tools.ietf.org/html/rfc6750#section-3.1\"";
|
||||
@@ -752,12 +674,9 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.willReturn(Collections.singletonList(wwwAuthenticateHeader));
|
||||
given(this.exchange.getResponse().headers()).willReturn(headers);
|
||||
this.function.setAuthorizationFailureHandler(this.authorizationFailureHandler);
|
||||
|
||||
this.function.filter(request, this.exchange).block();
|
||||
|
||||
verify(this.authorizationFailureHandler).onAuthorizationFailure(this.authorizationExceptionCaptor.capture(),
|
||||
this.authenticationCaptor.capture(), this.attributesCaptor.capture());
|
||||
|
||||
assertThat(this.authorizationExceptionCaptor.getValue())
|
||||
.isInstanceOfSatisfying(ClientAuthorizationException.class, (e) -> {
|
||||
assertThat(e.getClientRegistrationId()).isEqualTo(this.registration.getRegistrationId());
|
||||
@@ -788,7 +707,6 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
|
||||
private void assertHttpStatusWithWebClientExceptionInvokesFailureHandler(HttpStatus httpStatus,
|
||||
String expectedErrorCode) {
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration, "principalName",
|
||||
this.accessToken);
|
||||
MockHttpServletRequest servletRequest = new MockHttpServletRequest();
|
||||
@@ -799,17 +717,13 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction.httpServletRequest(servletRequest))
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction.httpServletResponse(servletResponse))
|
||||
.build();
|
||||
|
||||
WebClientResponseException exception = WebClientResponseException.create(httpStatus.value(),
|
||||
httpStatus.getReasonPhrase(), HttpHeaders.EMPTY, new byte[0], StandardCharsets.UTF_8);
|
||||
ExchangeFunction throwingExchangeFunction = (r) -> Mono.error(exception);
|
||||
this.function.setAuthorizationFailureHandler(this.authorizationFailureHandler);
|
||||
|
||||
assertThatCode(() -> this.function.filter(request, throwingExchangeFunction).block()).isEqualTo(exception);
|
||||
|
||||
verify(this.authorizationFailureHandler).onAuthorizationFailure(this.authorizationExceptionCaptor.capture(),
|
||||
this.authenticationCaptor.capture(), this.attributesCaptor.capture());
|
||||
|
||||
assertThat(this.authorizationExceptionCaptor.getValue())
|
||||
.isInstanceOfSatisfying(ClientAuthorizationException.class, (e) -> {
|
||||
assertThat(e.getClientRegistrationId()).isEqualTo(this.registration.getRegistrationId());
|
||||
@@ -835,18 +749,14 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction.httpServletRequest(servletRequest))
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction.httpServletResponse(servletResponse))
|
||||
.build();
|
||||
|
||||
OAuth2AuthorizationException authorizationException = new OAuth2AuthorizationException(
|
||||
new OAuth2Error(OAuth2ErrorCodes.INVALID_TOKEN));
|
||||
ExchangeFunction throwingExchangeFunction = (r) -> Mono.error(authorizationException);
|
||||
this.function.setAuthorizationFailureHandler(this.authorizationFailureHandler);
|
||||
|
||||
assertThatCode(() -> this.function.filter(request, throwingExchangeFunction).block())
|
||||
.isEqualTo(authorizationException);
|
||||
|
||||
verify(this.authorizationFailureHandler).onAuthorizationFailure(this.authorizationExceptionCaptor.capture(),
|
||||
this.authenticationCaptor.capture(), this.attributesCaptor.capture());
|
||||
|
||||
assertThat(this.authorizationExceptionCaptor.getValue())
|
||||
.isInstanceOfSatisfying(OAuth2AuthorizationException.class, (e) -> {
|
||||
assertThat(e.getError().getErrorCode()).isEqualTo(authorizationException.getError().getErrorCode());
|
||||
@@ -871,13 +781,10 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction.httpServletRequest(servletRequest))
|
||||
.attributes(ServletOAuth2AuthorizedClientExchangeFilterFunction.httpServletResponse(servletResponse))
|
||||
.build();
|
||||
|
||||
given(this.exchange.getResponse().rawStatusCode()).willReturn(HttpStatus.BAD_REQUEST.value());
|
||||
given(this.exchange.getResponse().headers()).willReturn(mock(ClientResponse.Headers.class));
|
||||
this.function.setAuthorizationFailureHandler(this.authorizationFailureHandler);
|
||||
|
||||
this.function.filter(request, this.exchange).block();
|
||||
|
||||
verifyNoInteractions(this.authorizationFailureHandler);
|
||||
}
|
||||
|
||||
@@ -902,7 +809,6 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
messageWriters.add(new FormHttpMessageWriter());
|
||||
messageWriters.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.allMimeTypes()));
|
||||
messageWriters.add(new MultipartHttpMessageWriter(messageWriters));
|
||||
|
||||
BodyInserter.Context context = new BodyInserter.Context() {
|
||||
@Override
|
||||
public List<HttpMessageWriter<?>> messageWriters() {
|
||||
@@ -919,7 +825,6 @@ public class ServletOAuth2AuthorizedClientExchangeFilterFunctionTests {
|
||||
return new HashMap<>();
|
||||
}
|
||||
};
|
||||
|
||||
MockClientHttpRequest body = new MockClientHttpRequest(HttpMethod.GET, "/");
|
||||
request.body().insert(body, context).block();
|
||||
return body.getBodyAsString().block();
|
||||
|
||||
@@ -77,19 +77,15 @@ public class DefaultServerOAuth2AuthorizationRequestResolverTests {
|
||||
@Test
|
||||
public void resolveWhenClientRegistrationNotFoundMatchThenBadRequest() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(any())).willReturn(Mono.empty());
|
||||
|
||||
ResponseStatusException expected = catchThrowableOfType(() -> resolve("/oauth2/authorization/not-found-id"),
|
||||
ResponseStatusException.class);
|
||||
|
||||
assertThat(expected.getStatus()).isEqualTo(HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolveWhenClientRegistrationFoundThenWorks() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(any())).willReturn(Mono.just(this.registration));
|
||||
|
||||
OAuth2AuthorizationRequest request = resolve("/oauth2/authorization/not-found-id");
|
||||
|
||||
assertThat(request.getAuthorizationRequestUri())
|
||||
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
|
||||
+ "scope=read:user&state=.*?&" + "redirect_uri=/login/oauth2/code/registration-id");
|
||||
@@ -100,9 +96,7 @@ public class DefaultServerOAuth2AuthorizationRequestResolverTests {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(any())).willReturn(Mono.just(this.registration));
|
||||
ServerWebExchange exchange = MockServerWebExchange
|
||||
.from(MockServerHttpRequest.get("/oauth2/authorization/id").header("X-Forwarded-Host", "evil.com"));
|
||||
|
||||
OAuth2AuthorizationRequest request = this.resolver.resolve(exchange).block();
|
||||
|
||||
assertThat(request.getAuthorizationRequestUri())
|
||||
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
|
||||
+ "scope=read:user&state=.*?&" + "redirect_uri=/login/oauth2/code/registration-id");
|
||||
@@ -113,12 +107,9 @@ public class DefaultServerOAuth2AuthorizationRequestResolverTests {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(any()))
|
||||
.willReturn(Mono.just(TestClientRegistrations.clientRegistration()
|
||||
.clientAuthenticationMethod(ClientAuthenticationMethod.NONE).clientSecret(null).build()));
|
||||
|
||||
OAuth2AuthorizationRequest request = resolve("/oauth2/authorization/registration-id");
|
||||
|
||||
assertThat((String) request.getAttribute(PkceParameterNames.CODE_VERIFIER))
|
||||
.matches("^([a-zA-Z0-9\\-\\.\\_\\~]){128}$");
|
||||
|
||||
assertThat(request.getAuthorizationRequestUri())
|
||||
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
|
||||
+ "scope=read:user&state=.*?&" + "redirect_uri=/login/oauth2/code/registration-id&"
|
||||
@@ -129,11 +120,8 @@ public class DefaultServerOAuth2AuthorizationRequestResolverTests {
|
||||
public void resolveWhenAuthenticationRequestWithValidOidcClientThenResolves() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(any()))
|
||||
.willReturn(Mono.just(TestClientRegistrations.clientRegistration().scope(OidcScopes.OPENID).build()));
|
||||
|
||||
OAuth2AuthorizationRequest request = resolve("/oauth2/authorization/registration-id");
|
||||
|
||||
assertThat((String) request.getAttribute(OidcParameterNames.NONCE)).matches("^([a-zA-Z0-9\\-\\.\\_\\~]){128}$");
|
||||
|
||||
assertThat(request.getAuthorizationRequestUri()).matches("https://example.com/login/oauth/authorize\\?"
|
||||
+ "response_type=code&client_id=client-id&" + "scope=openid&state=.*?&"
|
||||
+ "redirect_uri=/login/oauth2/code/registration-id&" + "nonce=([a-zA-Z0-9\\-\\.\\_\\~]){43}");
|
||||
@@ -144,13 +132,10 @@ public class DefaultServerOAuth2AuthorizationRequestResolverTests {
|
||||
public void resolveWhenAuthorizationRequestCustomizerRemovesNonceThenQueryExcludesNonce() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(any()))
|
||||
.willReturn(Mono.just(TestClientRegistrations.clientRegistration().scope(OidcScopes.OPENID).build()));
|
||||
|
||||
this.resolver.setAuthorizationRequestCustomizer(
|
||||
(customizer) -> customizer.additionalParameters((params) -> params.remove(OidcParameterNames.NONCE))
|
||||
.attributes((attrs) -> attrs.remove(OidcParameterNames.NONCE)));
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = resolve("/oauth2/authorization/registration-id");
|
||||
|
||||
assertThat(authorizationRequest.getAdditionalParameters()).doesNotContainKey(OidcParameterNames.NONCE);
|
||||
assertThat(authorizationRequest.getAttributes()).doesNotContainKey(OidcParameterNames.NONCE);
|
||||
assertThat(authorizationRequest.getAttributes()).containsKey(OAuth2ParameterNames.REGISTRATION_ID);
|
||||
@@ -163,15 +148,12 @@ public class DefaultServerOAuth2AuthorizationRequestResolverTests {
|
||||
public void resolveWhenAuthorizationRequestCustomizerAddsParameterThenQueryIncludesParameter() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(any()))
|
||||
.willReturn(Mono.just(TestClientRegistrations.clientRegistration().scope(OidcScopes.OPENID).build()));
|
||||
|
||||
this.resolver
|
||||
.setAuthorizationRequestCustomizer((customizer) -> customizer.authorizationRequestUri((uriBuilder) -> {
|
||||
uriBuilder.queryParam("param1", "value1");
|
||||
return uriBuilder.build();
|
||||
}));
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = resolve("/oauth2/authorization/registration-id");
|
||||
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri())
|
||||
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&client_id=client-id&"
|
||||
+ "scope=openid&state=.{15,}&" + "redirect_uri=/login/oauth2/code/registration-id&"
|
||||
@@ -182,14 +164,11 @@ public class DefaultServerOAuth2AuthorizationRequestResolverTests {
|
||||
public void resolveWhenAuthorizationRequestCustomizerOverridesParameterThenQueryIncludesParameter() {
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(any()))
|
||||
.willReturn(Mono.just(TestClientRegistrations.clientRegistration().scope(OidcScopes.OPENID).build()));
|
||||
|
||||
this.resolver.setAuthorizationRequestCustomizer((customizer) -> customizer.parameters((params) -> {
|
||||
params.put("appid", params.get("client_id"));
|
||||
params.remove("client_id");
|
||||
}));
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = resolve("/oauth2/authorization/registration-id");
|
||||
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri())
|
||||
.matches("https://example.com/login/oauth/authorize\\?" + "response_type=code&"
|
||||
+ "scope=openid&state=.{15,}&" + "redirect_uri=/login/oauth2/code/registration-id&"
|
||||
|
||||
@@ -121,9 +121,7 @@ public class OAuth2AuthorizationCodeGrantWebFilterTests {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/"));
|
||||
DefaultWebFilterChain chain = new DefaultWebFilterChain((e) -> e.getResponse().setComplete(),
|
||||
Collections.emptyList());
|
||||
|
||||
this.filter.filter(exchange, chain).block();
|
||||
|
||||
verifyNoInteractions(this.authenticationManager);
|
||||
}
|
||||
|
||||
@@ -131,7 +129,6 @@ public class OAuth2AuthorizationCodeGrantWebFilterTests {
|
||||
public void filterWhenMatchThenAuthorizedClientSaved() {
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientRegistration().build();
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(any())).willReturn(Mono.just(clientRegistration));
|
||||
|
||||
MockServerHttpRequest authorizationRequest = createAuthorizationRequest("/authorization/callback");
|
||||
OAuth2AuthorizationRequest oauth2AuthorizationRequest = createOAuth2AuthorizationRequest(authorizationRequest,
|
||||
clientRegistration);
|
||||
@@ -139,18 +136,14 @@ public class OAuth2AuthorizationCodeGrantWebFilterTests {
|
||||
.willReturn(Mono.just(oauth2AuthorizationRequest));
|
||||
given(this.authorizationRequestRepository.removeAuthorizationRequest(any()))
|
||||
.willReturn(Mono.just(oauth2AuthorizationRequest));
|
||||
|
||||
given(this.authorizedClientRepository.saveAuthorizedClient(any(), any(), any())).willReturn(Mono.empty());
|
||||
given(this.authenticationManager.authenticate(any()))
|
||||
.willReturn(Mono.just(TestOAuth2AuthorizationCodeAuthenticationTokens.authenticated()));
|
||||
|
||||
MockServerHttpRequest authorizationResponse = createAuthorizationResponse(authorizationRequest);
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(authorizationResponse);
|
||||
DefaultWebFilterChain chain = new DefaultWebFilterChain((e) -> e.getResponse().setComplete(),
|
||||
Collections.emptyList());
|
||||
|
||||
this.filter.filter(exchange, chain).block();
|
||||
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(any(), any(AnonymousAuthenticationToken.class),
|
||||
any());
|
||||
}
|
||||
@@ -163,7 +156,6 @@ public class OAuth2AuthorizationCodeGrantWebFilterTests {
|
||||
given(this.authorizedClientRepository.saveAuthorizedClient(any(), any(), any())).willReturn(Mono.empty());
|
||||
given(this.authenticationManager.authenticate(any()))
|
||||
.willReturn(Mono.just(TestOAuth2AuthorizationCodeAuthenticationTokens.authenticated()));
|
||||
|
||||
// 1) redirect_uri with query parameters
|
||||
Map<String, String> parameters = new LinkedHashMap<>();
|
||||
parameters.put("param1", "value1");
|
||||
@@ -175,15 +167,12 @@ public class OAuth2AuthorizationCodeGrantWebFilterTests {
|
||||
.willReturn(Mono.just(oauth2AuthorizationRequest));
|
||||
given(this.authorizationRequestRepository.removeAuthorizationRequest(any()))
|
||||
.willReturn(Mono.just(oauth2AuthorizationRequest));
|
||||
|
||||
MockServerHttpRequest authorizationResponse = createAuthorizationResponse(authorizationRequest);
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(authorizationResponse);
|
||||
DefaultWebFilterChain chain = new DefaultWebFilterChain((e) -> e.getResponse().setComplete(),
|
||||
Collections.emptyList());
|
||||
|
||||
this.filter.filter(exchange, chain).block();
|
||||
verify(this.authenticationManager, times(1)).authenticate(any());
|
||||
|
||||
// 2) redirect_uri with query parameters AND authorization response additional
|
||||
// parameters
|
||||
Map<String, String> additionalParameters = new LinkedHashMap<>();
|
||||
@@ -191,7 +180,6 @@ public class OAuth2AuthorizationCodeGrantWebFilterTests {
|
||||
additionalParameters.put("auth-param2", "value2");
|
||||
authorizationResponse = createAuthorizationResponse(authorizationRequest, additionalParameters);
|
||||
exchange = MockServerWebExchange.from(authorizationResponse);
|
||||
|
||||
this.filter.filter(exchange, chain).block();
|
||||
verify(this.authenticationManager, times(2)).authenticate(any());
|
||||
}
|
||||
@@ -209,7 +197,6 @@ public class OAuth2AuthorizationCodeGrantWebFilterTests {
|
||||
clientRegistration);
|
||||
given(this.authorizationRequestRepository.loadAuthorizationRequest(any()))
|
||||
.willReturn(Mono.just(oauth2AuthorizationRequest));
|
||||
|
||||
// 1) Parameter value
|
||||
Map<String, String> parametersNotMatch = new LinkedHashMap<>(parameters);
|
||||
parametersNotMatch.put("param2", "value8");
|
||||
@@ -218,26 +205,21 @@ public class OAuth2AuthorizationCodeGrantWebFilterTests {
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(authorizationResponse);
|
||||
DefaultWebFilterChain chain = new DefaultWebFilterChain((e) -> e.getResponse().setComplete(),
|
||||
Collections.emptyList());
|
||||
|
||||
this.filter.filter(exchange, chain).block();
|
||||
verifyNoInteractions(this.authenticationManager);
|
||||
|
||||
// 2) Parameter order
|
||||
parametersNotMatch = new LinkedHashMap<>();
|
||||
parametersNotMatch.put("param2", "value2");
|
||||
parametersNotMatch.put("param1", "value1");
|
||||
authorizationResponse = createAuthorizationResponse(createAuthorizationRequest(requestUri, parametersNotMatch));
|
||||
exchange = MockServerWebExchange.from(authorizationResponse);
|
||||
|
||||
this.filter.filter(exchange, chain).block();
|
||||
verifyNoInteractions(this.authenticationManager);
|
||||
|
||||
// 3) Parameter missing
|
||||
parametersNotMatch = new LinkedHashMap<>(parameters);
|
||||
parametersNotMatch.remove("param2");
|
||||
authorizationResponse = createAuthorizationResponse(createAuthorizationRequest(requestUri, parametersNotMatch));
|
||||
exchange = MockServerWebExchange.from(authorizationResponse);
|
||||
|
||||
this.filter.filter(exchange, chain).block();
|
||||
verifyNoInteractions(this.authenticationManager);
|
||||
}
|
||||
@@ -249,7 +231,6 @@ public class OAuth2AuthorizationCodeGrantWebFilterTests {
|
||||
given(this.authorizedClientRepository.saveAuthorizedClient(any(), any(), any())).willReturn(Mono.empty());
|
||||
given(this.authenticationManager.authenticate(any()))
|
||||
.willReturn(Mono.just(TestOAuth2AuthorizationCodeAuthenticationTokens.authenticated()));
|
||||
|
||||
MockServerHttpRequest authorizationRequest = createAuthorizationRequest("/authorization/callback");
|
||||
OAuth2AuthorizationRequest oauth2AuthorizationRequest = createOAuth2AuthorizationRequest(authorizationRequest,
|
||||
clientRegistration);
|
||||
@@ -257,20 +238,15 @@ public class OAuth2AuthorizationCodeGrantWebFilterTests {
|
||||
.willReturn(Mono.just(oauth2AuthorizationRequest));
|
||||
given(this.authorizationRequestRepository.removeAuthorizationRequest(any()))
|
||||
.willReturn(Mono.just(oauth2AuthorizationRequest));
|
||||
|
||||
MockServerHttpRequest authorizationResponse = createAuthorizationResponse(authorizationRequest);
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(authorizationResponse);
|
||||
DefaultWebFilterChain chain = new DefaultWebFilterChain((e) -> e.getResponse().setComplete(),
|
||||
Collections.emptyList());
|
||||
|
||||
ServerRequestCache requestCache = mock(ServerRequestCache.class);
|
||||
given(requestCache.getRedirectUri(any(ServerWebExchange.class)))
|
||||
.willReturn(Mono.just(URI.create("/saved-request")));
|
||||
|
||||
this.filter.setRequestCache(requestCache);
|
||||
|
||||
this.filter.filter(exchange, chain).block();
|
||||
|
||||
verify(requestCache).getRedirectUri(exchange);
|
||||
assertThat(exchange.getResponse().getHeaders().getLocation().toString()).isEqualTo("/saved-request");
|
||||
}
|
||||
@@ -280,7 +256,6 @@ public class OAuth2AuthorizationCodeGrantWebFilterTests {
|
||||
public void filterWhenAuthenticationConverterThrowsOAuth2AuthorizationExceptionThenMappedToOAuth2AuthenticationException() {
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientRegistration().build();
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(any())).willReturn(Mono.empty());
|
||||
|
||||
MockServerHttpRequest authorizationRequest = createAuthorizationRequest("/authorization/callback");
|
||||
OAuth2AuthorizationRequest oauth2AuthorizationRequest = createOAuth2AuthorizationRequest(authorizationRequest,
|
||||
clientRegistration);
|
||||
@@ -288,12 +263,10 @@ public class OAuth2AuthorizationCodeGrantWebFilterTests {
|
||||
.willReturn(Mono.just(oauth2AuthorizationRequest));
|
||||
given(this.authorizationRequestRepository.removeAuthorizationRequest(any()))
|
||||
.willReturn(Mono.just(oauth2AuthorizationRequest));
|
||||
|
||||
MockServerHttpRequest authorizationResponse = createAuthorizationResponse(authorizationRequest);
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(authorizationResponse);
|
||||
DefaultWebFilterChain chain = new DefaultWebFilterChain((e) -> e.getResponse().setComplete(),
|
||||
Collections.emptyList());
|
||||
|
||||
assertThatThrownBy(() -> this.filter.filter(exchange, chain).block())
|
||||
.isInstanceOf(OAuth2AuthenticationException.class)
|
||||
.extracting((ex) -> ((OAuth2AuthenticationException) ex).getError()).extracting("errorCode")
|
||||
@@ -306,7 +279,6 @@ public class OAuth2AuthorizationCodeGrantWebFilterTests {
|
||||
public void filterWhenAuthenticationManagerThrowsOAuth2AuthorizationExceptionThenMappedToOAuth2AuthenticationException() {
|
||||
ClientRegistration clientRegistration = TestClientRegistrations.clientRegistration().build();
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(any())).willReturn(Mono.just(clientRegistration));
|
||||
|
||||
MockServerHttpRequest authorizationRequest = createAuthorizationRequest("/authorization/callback");
|
||||
OAuth2AuthorizationRequest oauth2AuthorizationRequest = createOAuth2AuthorizationRequest(authorizationRequest,
|
||||
clientRegistration);
|
||||
@@ -314,15 +286,12 @@ public class OAuth2AuthorizationCodeGrantWebFilterTests {
|
||||
.willReturn(Mono.just(oauth2AuthorizationRequest));
|
||||
given(this.authorizationRequestRepository.removeAuthorizationRequest(any()))
|
||||
.willReturn(Mono.just(oauth2AuthorizationRequest));
|
||||
|
||||
given(this.authenticationManager.authenticate(any()))
|
||||
.willReturn(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());
|
||||
|
||||
assertThatThrownBy(() -> this.filter.filter(exchange, chain).block())
|
||||
.isInstanceOf(OAuth2AuthenticationException.class)
|
||||
.extracting((ex) -> ((OAuth2AuthenticationException) ex).getError()).extracting("errorCode")
|
||||
|
||||
@@ -71,7 +71,6 @@ public class OAuth2AuthorizationRequestRedirectWebFilterTests {
|
||||
this.filter.setAuthorizationRequestRepository(this.authzRequestRepository);
|
||||
FilteringWebHandler webHandler = new FilteringWebHandler((e) -> e.getResponse().setComplete(),
|
||||
Arrays.asList(this.filter));
|
||||
|
||||
this.client = WebTestClient.bindToWebHandler(webHandler).build();
|
||||
given(this.clientRepository.findByRegistrationId(this.registration.getRegistrationId()))
|
||||
.willReturn(Mono.just(this.registration));
|
||||
@@ -88,7 +87,6 @@ public class OAuth2AuthorizationRequestRedirectWebFilterTests {
|
||||
@Test
|
||||
public void filterWhenDoesNotMatchThenClientRegistrationRepositoryNotSubscribed() {
|
||||
this.client.get().exchange().expectStatus().isOk();
|
||||
|
||||
verifyZeroInteractions(this.clientRepository, this.authzRequestRepository);
|
||||
}
|
||||
|
||||
|
||||
@@ -85,7 +85,6 @@ public class ServerOAuth2AuthorizationCodeAuthenticationTokenConverterTests {
|
||||
@Test
|
||||
public void applyWhenAuthorizationRequestEmptyThenOAuth2AuthorizationException() {
|
||||
given(this.authorizationRequestRepository.removeAuthorizationRequest(any())).willReturn(Mono.empty());
|
||||
|
||||
assertThatThrownBy(() -> applyConverter()).isInstanceOf(OAuth2AuthorizationException.class);
|
||||
}
|
||||
|
||||
@@ -94,7 +93,6 @@ public class ServerOAuth2AuthorizationCodeAuthenticationTokenConverterTests {
|
||||
this.authorizationRequest.attributes(Map::clear);
|
||||
given(this.authorizationRequestRepository.removeAuthorizationRequest(any()))
|
||||
.willReturn(Mono.just(this.authorizationRequest.build()));
|
||||
|
||||
assertThatThrownBy(() -> applyConverter()).isInstanceOf(OAuth2AuthorizationException.class)
|
||||
.hasMessageContaining(
|
||||
ServerOAuth2AuthorizationCodeAuthenticationTokenConverter.CLIENT_REGISTRATION_NOT_FOUND_ERROR_CODE);
|
||||
@@ -105,7 +103,6 @@ public class ServerOAuth2AuthorizationCodeAuthenticationTokenConverterTests {
|
||||
given(this.authorizationRequestRepository.removeAuthorizationRequest(any()))
|
||||
.willReturn(Mono.just(this.authorizationRequest.build()));
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(any())).willReturn(Mono.empty());
|
||||
|
||||
assertThatThrownBy(() -> applyConverter()).isInstanceOf(OAuth2AuthorizationException.class)
|
||||
.hasMessageContaining(
|
||||
ServerOAuth2AuthorizationCodeAuthenticationTokenConverter.CLIENT_REGISTRATION_NOT_FOUND_ERROR_CODE);
|
||||
@@ -118,7 +115,6 @@ public class ServerOAuth2AuthorizationCodeAuthenticationTokenConverterTests {
|
||||
.willReturn(Mono.just(this.authorizationRequest.build()));
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(any()))
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
|
||||
assertThat(applyConverter().getAuthorizationExchange().getAuthorizationResponse().getError().getErrorCode())
|
||||
.isEqualTo("error");
|
||||
}
|
||||
@@ -130,9 +126,7 @@ public class ServerOAuth2AuthorizationCodeAuthenticationTokenConverterTests {
|
||||
.willReturn(Mono.just(this.authorizationRequest.build()));
|
||||
given(this.clientRegistrationRepository.findByRegistrationId(any()))
|
||||
.willReturn(Mono.just(this.clientRegistration));
|
||||
|
||||
OAuth2AuthorizationCodeAuthenticationToken result = applyConverter();
|
||||
|
||||
OAuth2AuthorizationResponse exchange = result.getAuthorizationExchange().getAuthorizationResponse();
|
||||
assertThat(exchange.getError()).isNull();
|
||||
assertThat(exchange.getCode()).isEqualTo("code");
|
||||
|
||||
@@ -62,7 +62,6 @@ public class UnAuthenticatedServerOAuth2AuthorizedClientRepositoryTests {
|
||||
}
|
||||
|
||||
// loadAuthorizedClient
|
||||
|
||||
@Test
|
||||
public void loadAuthorizedClientWhenClientRegistrationIdNullThenIllegalArgumentException() {
|
||||
this.clientRegistrationId = null;
|
||||
@@ -96,7 +95,6 @@ public class UnAuthenticatedServerOAuth2AuthorizedClientRepositoryTests {
|
||||
@Test
|
||||
public void loadAuthorizedClientWhenFoundThenFound() {
|
||||
this.repository.saveAuthorizedClient(this.authorizedClient, this.authentication, this.exchange).block();
|
||||
|
||||
assertThat(this.repository.loadAuthorizedClient(this.clientRegistrationId, this.authentication, this.exchange)
|
||||
.block()).isEqualTo(this.authorizedClient);
|
||||
}
|
||||
@@ -107,10 +105,8 @@ public class UnAuthenticatedServerOAuth2AuthorizedClientRepositoryTests {
|
||||
.registrationId("other-client-registration").build();
|
||||
OAuth2AuthorizedClient otherAuthorizedClient = new OAuth2AuthorizedClient(otherClientRegistration,
|
||||
"anonymousUser", this.authorizedClient.getAccessToken());
|
||||
|
||||
this.repository.saveAuthorizedClient(this.authorizedClient, this.authentication, this.exchange).block();
|
||||
this.repository.saveAuthorizedClient(otherAuthorizedClient, this.authentication, this.exchange).block();
|
||||
|
||||
assertThat(this.repository.loadAuthorizedClient(this.clientRegistrationId, this.authentication, this.exchange)
|
||||
.block()).isEqualTo(this.authorizedClient);
|
||||
}
|
||||
@@ -119,13 +115,11 @@ public class UnAuthenticatedServerOAuth2AuthorizedClientRepositoryTests {
|
||||
public void loadAuthorizedClientWhenAnonymousThenFound() {
|
||||
this.authentication = this.anonymous;
|
||||
this.repository.saveAuthorizedClient(this.authorizedClient, this.authentication, this.exchange).block();
|
||||
|
||||
assertThat(this.repository.loadAuthorizedClient(this.clientRegistrationId, this.authentication, this.exchange)
|
||||
.block()).isEqualTo(this.authorizedClient);
|
||||
}
|
||||
|
||||
// saveAuthorizedClient
|
||||
|
||||
@Test
|
||||
public void saveAuthorizedClientWhenAuthorizedClientNullThenIllegalArgumentException() {
|
||||
this.authorizedClient = null;
|
||||
@@ -151,7 +145,6 @@ public class UnAuthenticatedServerOAuth2AuthorizedClientRepositoryTests {
|
||||
}
|
||||
|
||||
// removeAuthorizedClient
|
||||
|
||||
@Test
|
||||
public void removeAuthorizedClientWhenClientRegistrationIdNullThenIllegalArgumentException() {
|
||||
this.clientRegistrationId = null;
|
||||
@@ -180,7 +173,6 @@ public class UnAuthenticatedServerOAuth2AuthorizedClientRepositoryTests {
|
||||
public void removeAuthorizedClientWhenFoundThenFound() {
|
||||
this.repository.saveAuthorizedClient(this.authorizedClient, this.authentication, this.exchange).block();
|
||||
this.repository.removeAuthorizedClient(this.clientRegistrationId, this.authentication, this.exchange).block();
|
||||
|
||||
assertThat(this.repository.loadAuthorizedClient(this.clientRegistrationId, this.authentication, this.exchange)
|
||||
.block()).isNull();
|
||||
}
|
||||
|
||||
@@ -68,7 +68,6 @@ public class WebSessionOAuth2ServerAuthorizationRequestRepositoryTests {
|
||||
@Test
|
||||
public void loadAuthorizationRequestWhenNoSessionThenEmpty() {
|
||||
StepVerifier.create(this.repository.loadAuthorizationRequest(this.exchange)).verifyComplete();
|
||||
|
||||
assertSessionStartedIs(false);
|
||||
}
|
||||
|
||||
@@ -77,7 +76,6 @@ public class WebSessionOAuth2ServerAuthorizationRequestRepositoryTests {
|
||||
Mono<OAuth2AuthorizationRequest> setAttrThenLoad = this.exchange.getSession().map(WebSession::getAttributes)
|
||||
.doOnNext((attrs) -> attrs.put("foo", "bar"))
|
||||
.then(this.repository.loadAuthorizationRequest(this.exchange));
|
||||
|
||||
StepVerifier.create(setAttrThenLoad).verifyComplete();
|
||||
}
|
||||
|
||||
@@ -87,7 +85,6 @@ public class WebSessionOAuth2ServerAuthorizationRequestRepositoryTests {
|
||||
Mono<OAuth2AuthorizationRequest> saveAndLoad = this.repository
|
||||
.saveAuthorizationRequest(this.authorizationRequest, this.exchange)
|
||||
.then(this.repository.loadAuthorizationRequest(this.exchange));
|
||||
|
||||
StepVerifier.create(saveAndLoad).verifyComplete();
|
||||
}
|
||||
|
||||
@@ -104,25 +101,19 @@ public class WebSessionOAuth2ServerAuthorizationRequestRepositoryTests {
|
||||
String oldState = "state0";
|
||||
MockServerHttpRequest oldRequest = MockServerHttpRequest.get("/")
|
||||
.queryParam(OAuth2ParameterNames.STATE, oldState).build();
|
||||
|
||||
OAuth2AuthorizationRequest oldAuthorizationRequest = OAuth2AuthorizationRequest.authorizationCode()
|
||||
.authorizationUri("https://example.com/oauth2/authorize").clientId("client-id")
|
||||
.redirectUri("http://localhost/client-1").state(oldState).build();
|
||||
|
||||
WebSessionManager sessionManager = (e) -> this.exchange.getSession();
|
||||
|
||||
this.exchange = new DefaultServerWebExchange(this.exchange.getRequest(), new MockServerHttpResponse(),
|
||||
sessionManager, ServerCodecConfigurer.create(), new AcceptHeaderLocaleContextResolver());
|
||||
ServerWebExchange oldExchange = new DefaultServerWebExchange(oldRequest, new MockServerHttpResponse(),
|
||||
sessionManager, ServerCodecConfigurer.create(), new AcceptHeaderLocaleContextResolver());
|
||||
|
||||
Mono<OAuth2AuthorizationRequest> saveAndSaveAndLoad = this.repository
|
||||
.saveAuthorizationRequest(oldAuthorizationRequest, oldExchange)
|
||||
.then(this.repository.saveAuthorizationRequest(this.authorizationRequest, this.exchange))
|
||||
.then(this.repository.loadAuthorizationRequest(oldExchange));
|
||||
|
||||
StepVerifier.create(saveAndSaveAndLoad).expectNext(oldAuthorizationRequest).verifyComplete();
|
||||
|
||||
StepVerifier.create(this.repository.loadAuthorizationRequest(this.exchange))
|
||||
.expectNext(this.authorizationRequest).verifyComplete();
|
||||
}
|
||||
@@ -133,7 +124,6 @@ public class WebSessionOAuth2ServerAuthorizationRequestRepositoryTests {
|
||||
assertThatThrownBy(() -> this.repository.saveAuthorizationRequest(this.authorizationRequest, this.exchange))
|
||||
.isInstanceOf(IllegalArgumentException.class);
|
||||
assertSessionStartedIs(false);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -141,7 +131,6 @@ public class WebSessionOAuth2ServerAuthorizationRequestRepositoryTests {
|
||||
this.exchange = null;
|
||||
assertThatThrownBy(() -> this.repository.saveAuthorizationRequest(this.authorizationRequest, this.exchange))
|
||||
.isInstanceOf(IllegalArgumentException.class);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -162,9 +151,7 @@ public class WebSessionOAuth2ServerAuthorizationRequestRepositoryTests {
|
||||
Mono<OAuth2AuthorizationRequest> saveAndRemove = this.repository
|
||||
.saveAuthorizationRequest(this.authorizationRequest, this.exchange)
|
||||
.then(this.repository.removeAuthorizationRequest(this.exchange));
|
||||
|
||||
StepVerifier.create(saveAndRemove).expectNext(this.authorizationRequest).verifyComplete();
|
||||
|
||||
StepVerifier.create(this.exchange.getSession().map(WebSession::getAttributes).map(Map::isEmpty))
|
||||
.expectNext(true).verifyComplete();
|
||||
}
|
||||
@@ -178,7 +165,6 @@ public class WebSessionOAuth2ServerAuthorizationRequestRepositoryTests {
|
||||
Mono<OAuth2AuthorizationRequest> saveAndRemove = this.repository
|
||||
.saveAuthorizationRequest(this.authorizationRequest, this.exchange)
|
||||
.then(this.repository.removeAuthorizationRequest(otherStateExchange));
|
||||
|
||||
StepVerifier.create(saveAndRemove).verifyComplete();
|
||||
}
|
||||
|
||||
@@ -187,27 +173,20 @@ public class WebSessionOAuth2ServerAuthorizationRequestRepositoryTests {
|
||||
String oldState = "state0";
|
||||
MockServerHttpRequest oldRequest = MockServerHttpRequest.get("/")
|
||||
.queryParam(OAuth2ParameterNames.STATE, oldState).build();
|
||||
|
||||
OAuth2AuthorizationRequest oldAuthorizationRequest = OAuth2AuthorizationRequest.authorizationCode()
|
||||
.authorizationUri("https://example.com/oauth2/authorize").clientId("client-id")
|
||||
.redirectUri("http://localhost/client-1").state(oldState).build();
|
||||
|
||||
WebSessionManager sessionManager = (e) -> this.exchange.getSession();
|
||||
|
||||
this.exchange = new DefaultServerWebExchange(this.exchange.getRequest(), new MockServerHttpResponse(),
|
||||
sessionManager, ServerCodecConfigurer.create(), new AcceptHeaderLocaleContextResolver());
|
||||
ServerWebExchange oldExchange = new DefaultServerWebExchange(oldRequest, new MockServerHttpResponse(),
|
||||
sessionManager, ServerCodecConfigurer.create(), new AcceptHeaderLocaleContextResolver());
|
||||
|
||||
Mono<OAuth2AuthorizationRequest> saveAndSaveAndRemove = this.repository
|
||||
.saveAuthorizationRequest(oldAuthorizationRequest, oldExchange)
|
||||
.then(this.repository.saveAuthorizationRequest(this.authorizationRequest, this.exchange))
|
||||
.then(this.repository.removeAuthorizationRequest(this.exchange));
|
||||
|
||||
StepVerifier.create(saveAndSaveAndRemove).expectNext(this.authorizationRequest).verifyComplete();
|
||||
|
||||
StepVerifier.create(this.repository.loadAuthorizationRequest(this.exchange)).verifyComplete();
|
||||
|
||||
StepVerifier.create(this.repository.loadAuthorizationRequest(oldExchange)).expectNext(oldAuthorizationRequest)
|
||||
.verifyComplete();
|
||||
}
|
||||
@@ -218,30 +197,23 @@ public class WebSessionOAuth2ServerAuthorizationRequestRepositoryTests {
|
||||
String oldState = "state0";
|
||||
MockServerHttpRequest oldRequest = MockServerHttpRequest.get("/")
|
||||
.queryParam(OAuth2ParameterNames.STATE, oldState).build();
|
||||
|
||||
OAuth2AuthorizationRequest oldAuthorizationRequest = OAuth2AuthorizationRequest.authorizationCode()
|
||||
.authorizationUri("https://example.com/oauth2/authorize").clientId("client-id")
|
||||
.redirectUri("http://localhost/client-1").state(oldState).build();
|
||||
|
||||
Map<String, Object> sessionAttrs = spy(new HashMap<>());
|
||||
WebSession session = mock(WebSession.class);
|
||||
given(session.getAttributes()).willReturn(sessionAttrs);
|
||||
WebSessionManager sessionManager = (e) -> Mono.just(session);
|
||||
|
||||
this.exchange = new DefaultServerWebExchange(this.exchange.getRequest(), new MockServerHttpResponse(),
|
||||
sessionManager, ServerCodecConfigurer.create(), new AcceptHeaderLocaleContextResolver());
|
||||
ServerWebExchange oldExchange = new DefaultServerWebExchange(oldRequest, new MockServerHttpResponse(),
|
||||
sessionManager, ServerCodecConfigurer.create(), new AcceptHeaderLocaleContextResolver());
|
||||
|
||||
Mono<OAuth2AuthorizationRequest> saveAndSaveAndRemove = this.repository
|
||||
.saveAuthorizationRequest(oldAuthorizationRequest, oldExchange)
|
||||
.then(this.repository.saveAuthorizationRequest(this.authorizationRequest, this.exchange))
|
||||
.then(this.repository.removeAuthorizationRequest(this.exchange));
|
||||
|
||||
StepVerifier.create(saveAndSaveAndRemove).expectNext(this.authorizationRequest).verifyComplete();
|
||||
|
||||
StepVerifier.create(this.repository.loadAuthorizationRequest(this.exchange)).verifyComplete();
|
||||
|
||||
verify(sessionAttrs, times(3)).put(any(), any());
|
||||
}
|
||||
|
||||
|
||||
@@ -81,7 +81,6 @@ public class WebSessionServerOAuth2AuthorizedClientRepositoryTests {
|
||||
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(this.registration1, this.principalName1,
|
||||
mock(OAuth2AccessToken.class));
|
||||
this.authorizedClientRepository.saveAuthorizedClient(authorizedClient, null, this.exchange).block();
|
||||
|
||||
OAuth2AuthorizedClient loadedAuthorizedClient = this.authorizedClientRepository
|
||||
.loadAuthorizedClient(this.registrationId1, null, this.exchange).block();
|
||||
assertThat(loadedAuthorizedClient).isEqualTo(authorizedClient);
|
||||
@@ -115,10 +114,8 @@ public class WebSessionServerOAuth2AuthorizedClientRepositoryTests {
|
||||
OAuth2AuthorizedClient expected = new OAuth2AuthorizedClient(this.registration2, this.principalName1,
|
||||
mock(OAuth2AccessToken.class));
|
||||
this.authorizedClientRepository.saveAuthorizedClient(expected, null, this.exchange).block();
|
||||
|
||||
OAuth2AuthorizedClient result = this.authorizedClientRepository
|
||||
.loadAuthorizedClient(this.registrationId2, null, this.exchange).block();
|
||||
|
||||
assertThat(result).isEqualTo(expected);
|
||||
}
|
||||
|
||||
@@ -151,10 +148,8 @@ public class WebSessionServerOAuth2AuthorizedClientRepositoryTests {
|
||||
OAuth2AuthorizedClient authorizedClient1 = new OAuth2AuthorizedClient(this.registration1, this.principalName1,
|
||||
mock(OAuth2AccessToken.class));
|
||||
this.authorizedClientRepository.saveAuthorizedClient(authorizedClient1, null, this.exchange).block();
|
||||
|
||||
// Remove registrationId2 (never added so is not removed either)
|
||||
this.authorizedClientRepository.removeAuthorizedClient(this.registrationId2, null, this.exchange);
|
||||
|
||||
OAuth2AuthorizedClient loadedAuthorizedClient1 = this.authorizedClientRepository
|
||||
.loadAuthorizedClient(this.registrationId1, null, this.exchange).block();
|
||||
assertThat(loadedAuthorizedClient1).isNotNull();
|
||||
@@ -184,7 +179,6 @@ public class WebSessionServerOAuth2AuthorizedClientRepositoryTests {
|
||||
.loadAuthorizedClient(this.registrationId1, null, this.exchange).block();
|
||||
assertThat(loadedAuthorizedClient).isSameAs(authorizedClient);
|
||||
this.authorizedClientRepository.removeAuthorizedClient(this.registrationId1, null, this.exchange).block();
|
||||
|
||||
WebSession session = this.exchange.getSession().block();
|
||||
assertThat(session).isNotNull();
|
||||
assertThat(session.getAttributes()).isEmpty();
|
||||
@@ -195,13 +189,10 @@ public class WebSessionServerOAuth2AuthorizedClientRepositoryTests {
|
||||
OAuth2AuthorizedClient authorizedClient1 = new OAuth2AuthorizedClient(this.registration1, this.principalName1,
|
||||
mock(OAuth2AccessToken.class));
|
||||
this.authorizedClientRepository.saveAuthorizedClient(authorizedClient1, null, this.exchange).block();
|
||||
|
||||
OAuth2AuthorizedClient authorizedClient2 = new OAuth2AuthorizedClient(this.registration2, this.principalName1,
|
||||
mock(OAuth2AccessToken.class));
|
||||
this.authorizedClientRepository.saveAuthorizedClient(authorizedClient2, null, this.exchange).block();
|
||||
|
||||
this.authorizedClientRepository.removeAuthorizedClient(this.registrationId1, null, this.exchange).block();
|
||||
|
||||
OAuth2AuthorizedClient loadedAuthorizedClient2 = this.authorizedClientRepository
|
||||
.loadAuthorizedClient(this.registrationId2, null, this.exchange).block();
|
||||
assertThat(loadedAuthorizedClient2).isNotNull();
|
||||
|
||||
@@ -81,7 +81,6 @@ public class OAuth2LoginAuthenticationWebFilterTests {
|
||||
@Test
|
||||
public void onAuthenticationSuccessWhenOAuth2LoginAuthenticationTokenThenSavesAuthorizedClient() {
|
||||
this.filter.onAuthenticationSuccess(loginToken(), this.webFilterExchange).block();
|
||||
|
||||
verify(this.authorizedClientRepository).saveAuthorizedClient(any(), any(), any());
|
||||
}
|
||||
|
||||
|
||||
@@ -51,7 +51,6 @@ public class ClaimAccessorTests {
|
||||
Instant expectedClaimValue = Instant.now();
|
||||
String claimName = "date";
|
||||
this.claims.put(claimName, Date.from(expectedClaimValue));
|
||||
|
||||
assertThat(this.claimAccessor.getClaimAsInstant(claimName)).isBetween(expectedClaimValue.minusSeconds(1),
|
||||
expectedClaimValue.plusSeconds(1));
|
||||
}
|
||||
@@ -62,7 +61,6 @@ public class ClaimAccessorTests {
|
||||
Instant expectedClaimValue = Instant.now();
|
||||
String claimName = "longSeconds";
|
||||
this.claims.put(claimName, expectedClaimValue.getEpochSecond());
|
||||
|
||||
assertThat(this.claimAccessor.getClaimAsInstant(claimName)).isBetween(expectedClaimValue.minusSeconds(1),
|
||||
expectedClaimValue.plusSeconds(1));
|
||||
}
|
||||
@@ -72,7 +70,6 @@ public class ClaimAccessorTests {
|
||||
Instant expectedClaimValue = Instant.now();
|
||||
String claimName = "instant";
|
||||
this.claims.put(claimName, expectedClaimValue);
|
||||
|
||||
assertThat(this.claimAccessor.getClaimAsInstant(claimName)).isBetween(expectedClaimValue.minusSeconds(1),
|
||||
expectedClaimValue.plusSeconds(1));
|
||||
}
|
||||
@@ -83,7 +80,6 @@ public class ClaimAccessorTests {
|
||||
Instant expectedClaimValue = Instant.now();
|
||||
String claimName = "integerSeconds";
|
||||
this.claims.put(claimName, Long.valueOf(expectedClaimValue.getEpochSecond()).intValue());
|
||||
|
||||
assertThat(this.claimAccessor.getClaimAsInstant(claimName)).isBetween(expectedClaimValue.minusSeconds(1),
|
||||
expectedClaimValue.plusSeconds(1));
|
||||
}
|
||||
@@ -94,7 +90,6 @@ public class ClaimAccessorTests {
|
||||
Instant expectedClaimValue = Instant.now();
|
||||
String claimName = "doubleSeconds";
|
||||
this.claims.put(claimName, Long.valueOf(expectedClaimValue.getEpochSecond()).doubleValue());
|
||||
|
||||
assertThat(this.claimAccessor.getClaimAsInstant(claimName)).isBetween(expectedClaimValue.minusSeconds(1),
|
||||
expectedClaimValue.plusSeconds(1));
|
||||
}
|
||||
@@ -104,7 +99,6 @@ public class ClaimAccessorTests {
|
||||
public void getClaimAsStringWhenValueIsNullThenReturnNull() {
|
||||
String claimName = "claim-with-null-value";
|
||||
this.claims.put(claimName, null);
|
||||
|
||||
assertThat(this.claimAccessor.getClaimAsString(claimName)).isNull();
|
||||
}
|
||||
|
||||
@@ -120,9 +114,7 @@ public class ClaimAccessorTests {
|
||||
List<String> expectedClaimValue = Arrays.asList("item1", "item2");
|
||||
String claimName = "list";
|
||||
this.claims.put(claimName, expectedClaimValue);
|
||||
|
||||
List<String> actualClaimValue = this.claimAccessor.getClaim(claimName);
|
||||
|
||||
assertThat(actualClaimValue).containsOnlyElementsOf(expectedClaimValue);
|
||||
}
|
||||
|
||||
@@ -131,9 +123,7 @@ public class ClaimAccessorTests {
|
||||
boolean expectedClaimValue = true;
|
||||
String claimName = "boolean";
|
||||
this.claims.put(claimName, expectedClaimValue);
|
||||
|
||||
boolean actualClaimValue = this.claimAccessor.getClaim(claimName);
|
||||
|
||||
assertThat(actualClaimValue).isEqualTo(expectedClaimValue);
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,6 @@ public class DefaultOAuth2AuthenticatedPrincipalTests {
|
||||
public void constructorWhenAttributesIsNullOrEmptyThenIllegalArgumentException() {
|
||||
assertThatCode(() -> new DefaultOAuth2AuthenticatedPrincipal(null, this.authorities))
|
||||
.isInstanceOf(IllegalArgumentException.class);
|
||||
|
||||
assertThatCode(() -> new DefaultOAuth2AuthenticatedPrincipal(Collections.emptyMap(), this.authorities))
|
||||
.isInstanceOf(IllegalArgumentException.class);
|
||||
}
|
||||
@@ -55,7 +54,6 @@ public class DefaultOAuth2AuthenticatedPrincipalTests {
|
||||
Collection<? extends GrantedAuthority> authorities = new DefaultOAuth2AuthenticatedPrincipal(this.attributes,
|
||||
null).getAuthorities();
|
||||
assertThat(authorities).isEmpty();
|
||||
|
||||
authorities = new DefaultOAuth2AuthenticatedPrincipal(this.attributes, Collections.emptyList())
|
||||
.getAuthorities();
|
||||
assertThat(authorities).isEmpty();
|
||||
|
||||
@@ -42,7 +42,6 @@ public class DelegatingOAuth2TokenValidatorTests {
|
||||
public void validateWhenNoValidatorsConfiguredThenReturnsSuccessfulResult() {
|
||||
DelegatingOAuth2TokenValidator<AbstractOAuth2Token> tokenValidator = new DelegatingOAuth2TokenValidator<>();
|
||||
AbstractOAuth2Token token = mock(AbstractOAuth2Token.class);
|
||||
|
||||
assertThat(tokenValidator.validate(token).hasErrors()).isFalse();
|
||||
}
|
||||
|
||||
@@ -50,16 +49,12 @@ public class DelegatingOAuth2TokenValidatorTests {
|
||||
public void validateWhenAnyValidatorFailsThenReturnsFailureResultContainingDetailFromFailingValidator() {
|
||||
OAuth2TokenValidator<AbstractOAuth2Token> success = mock(OAuth2TokenValidator.class);
|
||||
OAuth2TokenValidator<AbstractOAuth2Token> failure = mock(OAuth2TokenValidator.class);
|
||||
|
||||
given(success.validate(any(AbstractOAuth2Token.class))).willReturn(OAuth2TokenValidatorResult.success());
|
||||
given(failure.validate(any(AbstractOAuth2Token.class))).willReturn(OAuth2TokenValidatorResult.failure(DETAIL));
|
||||
|
||||
DelegatingOAuth2TokenValidator<AbstractOAuth2Token> tokenValidator = new DelegatingOAuth2TokenValidator<>(
|
||||
Arrays.asList(success, failure));
|
||||
AbstractOAuth2Token token = mock(AbstractOAuth2Token.class);
|
||||
|
||||
OAuth2TokenValidatorResult result = tokenValidator.validate(token);
|
||||
|
||||
assertThat(result.hasErrors()).isTrue();
|
||||
assertThat(result.getErrors()).containsExactly(DETAIL);
|
||||
}
|
||||
@@ -68,20 +63,15 @@ public class DelegatingOAuth2TokenValidatorTests {
|
||||
public void validateWhenMultipleValidatorsFailThenReturnsFailureResultContainingAllDetails() {
|
||||
OAuth2TokenValidator<AbstractOAuth2Token> firstFailure = mock(OAuth2TokenValidator.class);
|
||||
OAuth2TokenValidator<AbstractOAuth2Token> secondFailure = mock(OAuth2TokenValidator.class);
|
||||
|
||||
OAuth2Error otherDetail = new OAuth2Error("another-error");
|
||||
|
||||
given(firstFailure.validate(any(AbstractOAuth2Token.class)))
|
||||
.willReturn(OAuth2TokenValidatorResult.failure(DETAIL));
|
||||
given(secondFailure.validate(any(AbstractOAuth2Token.class)))
|
||||
.willReturn(OAuth2TokenValidatorResult.failure(otherDetail));
|
||||
|
||||
DelegatingOAuth2TokenValidator<AbstractOAuth2Token> tokenValidator = new DelegatingOAuth2TokenValidator<>(
|
||||
firstFailure, secondFailure);
|
||||
AbstractOAuth2Token token = mock(AbstractOAuth2Token.class);
|
||||
|
||||
OAuth2TokenValidatorResult result = tokenValidator.validate(token);
|
||||
|
||||
assertThat(result.hasErrors()).isTrue();
|
||||
assertThat(result.getErrors()).containsExactly(DETAIL, otherDetail);
|
||||
}
|
||||
@@ -90,16 +80,12 @@ public class DelegatingOAuth2TokenValidatorTests {
|
||||
public void validateWhenAllValidatorsSucceedThenReturnsSuccessfulResult() {
|
||||
OAuth2TokenValidator<AbstractOAuth2Token> firstSuccess = mock(OAuth2TokenValidator.class);
|
||||
OAuth2TokenValidator<AbstractOAuth2Token> secondSuccess = mock(OAuth2TokenValidator.class);
|
||||
|
||||
given(firstSuccess.validate(any(AbstractOAuth2Token.class))).willReturn(OAuth2TokenValidatorResult.success());
|
||||
given(secondSuccess.validate(any(AbstractOAuth2Token.class))).willReturn(OAuth2TokenValidatorResult.success());
|
||||
|
||||
DelegatingOAuth2TokenValidator<AbstractOAuth2Token> tokenValidator = new DelegatingOAuth2TokenValidator<>(
|
||||
Arrays.asList(firstSuccess, secondSuccess));
|
||||
AbstractOAuth2Token token = mock(AbstractOAuth2Token.class);
|
||||
|
||||
OAuth2TokenValidatorResult result = tokenValidator.validate(token);
|
||||
|
||||
assertThat(result.hasErrors()).isFalse();
|
||||
assertThat(result.getErrors()).isEmpty();
|
||||
}
|
||||
@@ -115,20 +101,15 @@ public class DelegatingOAuth2TokenValidatorTests {
|
||||
public void constructorsWhenInvokedWithSameInputsThenResultInSameOutputs() {
|
||||
OAuth2TokenValidator<AbstractOAuth2Token> firstSuccess = mock(OAuth2TokenValidator.class);
|
||||
OAuth2TokenValidator<AbstractOAuth2Token> secondSuccess = mock(OAuth2TokenValidator.class);
|
||||
|
||||
given(firstSuccess.validate(any(AbstractOAuth2Token.class))).willReturn(OAuth2TokenValidatorResult.success());
|
||||
given(secondSuccess.validate(any(AbstractOAuth2Token.class))).willReturn(OAuth2TokenValidatorResult.success());
|
||||
|
||||
DelegatingOAuth2TokenValidator<AbstractOAuth2Token> firstValidator = new DelegatingOAuth2TokenValidator<>(
|
||||
Arrays.asList(firstSuccess, secondSuccess));
|
||||
DelegatingOAuth2TokenValidator<AbstractOAuth2Token> secondValidator = new DelegatingOAuth2TokenValidator<>(
|
||||
firstSuccess, secondSuccess);
|
||||
|
||||
AbstractOAuth2Token token = mock(AbstractOAuth2Token.class);
|
||||
|
||||
firstValidator.validate(token);
|
||||
secondValidator.validate(token);
|
||||
|
||||
verify(firstSuccess, times(2)).validate(token);
|
||||
verify(secondSuccess, times(2)).validate(token);
|
||||
}
|
||||
|
||||
@@ -72,7 +72,6 @@ public class OAuth2AccessTokenTests {
|
||||
@Test
|
||||
public void constructorWhenAllParametersProvidedAndValidThenCreated() {
|
||||
OAuth2AccessToken accessToken = new OAuth2AccessToken(TOKEN_TYPE, TOKEN_VALUE, ISSUED_AT, EXPIRES_AT, SCOPES);
|
||||
|
||||
assertThat(accessToken.getTokenType()).isEqualTo(TOKEN_TYPE);
|
||||
assertThat(accessToken.getTokenValue()).isEqualTo(TOKEN_VALUE);
|
||||
assertThat(accessToken.getIssuedAt()).isEqualTo(ISSUED_AT);
|
||||
@@ -86,7 +85,6 @@ public class OAuth2AccessTokenTests {
|
||||
OAuth2AccessToken accessToken = new OAuth2AccessToken(TOKEN_TYPE, TOKEN_VALUE, ISSUED_AT, EXPIRES_AT, SCOPES);
|
||||
byte[] serialized = SerializationUtils.serialize(accessToken);
|
||||
accessToken = (OAuth2AccessToken) SerializationUtils.deserialize(serialized);
|
||||
|
||||
assertThat(serialized).isNotNull();
|
||||
assertThat(accessToken.getTokenType()).isEqualTo(TOKEN_TYPE);
|
||||
assertThat(accessToken.getTokenValue()).isEqualTo(TOKEN_VALUE);
|
||||
|
||||
@@ -41,7 +41,6 @@ public class OAuth2ErrorTests {
|
||||
@Test
|
||||
public void constructorWhenAllParametersProvidedAndValidThenCreated() {
|
||||
OAuth2Error error = new OAuth2Error(ERROR_CODE, ERROR_DESCRIPTION, ERROR_URI);
|
||||
|
||||
assertThat(error.getErrorCode()).isEqualTo(ERROR_CODE);
|
||||
assertThat(error.getDescription()).isEqualTo(ERROR_DESCRIPTION);
|
||||
assertThat(error.getUri()).isEqualTo(ERROR_URI);
|
||||
|
||||
@@ -38,7 +38,6 @@ public class OAuth2TokenValidatorResultTests {
|
||||
@Test
|
||||
public void failureWhenInvokedWithDetailReturnsFailureResultIncludingDetail() {
|
||||
OAuth2TokenValidatorResult failure = OAuth2TokenValidatorResult.failure(DETAIL);
|
||||
|
||||
assertThat(failure.hasErrors()).isTrue();
|
||||
assertThat(failure.getErrors()).containsExactly(DETAIL);
|
||||
}
|
||||
@@ -46,7 +45,6 @@ public class OAuth2TokenValidatorResultTests {
|
||||
@Test
|
||||
public void failureWhenInvokedWithMultipleDetailsReturnsFailureResultIncludingAll() {
|
||||
OAuth2TokenValidatorResult failure = OAuth2TokenValidatorResult.failure(DETAIL, DETAIL);
|
||||
|
||||
assertThat(failure.hasErrors()).isTrue();
|
||||
assertThat(failure.getErrors()).containsExactly(DETAIL, DETAIL);
|
||||
}
|
||||
|
||||
@@ -70,7 +70,6 @@ public class ClaimTypeConverterTests {
|
||||
TypeDescriptor.collection(List.class, TypeDescriptor.valueOf(String.class)));
|
||||
Converter<Object, ?> mapStringObjectConverter = getConverter(TypeDescriptor.map(Map.class,
|
||||
TypeDescriptor.valueOf(String.class), TypeDescriptor.valueOf(Object.class)));
|
||||
|
||||
Map<String, Converter<Object, ?>> claimTypeConverters = new HashMap<>();
|
||||
claimTypeConverters.put(STRING_CLAIM, stringConverter);
|
||||
claimTypeConverters.put(BOOLEAN_CLAIM, booleanConverter);
|
||||
@@ -117,7 +116,6 @@ public class ClaimTypeConverterTests {
|
||||
mapIntegerObject.put(1, "value1");
|
||||
Map<String, Object> mapStringObject = new HashMap<>();
|
||||
mapStringObject.put("1", "value1");
|
||||
|
||||
Map<String, Object> claims = new HashMap<>();
|
||||
claims.put(STRING_CLAIM, Boolean.TRUE);
|
||||
claims.put(BOOLEAN_CLAIM, "true");
|
||||
@@ -126,9 +124,7 @@ public class ClaimTypeConverterTests {
|
||||
claims.put(COLLECTION_STRING_CLAIM, listNumber);
|
||||
claims.put(LIST_STRING_CLAIM, listNumber);
|
||||
claims.put(MAP_STRING_OBJECT_CLAIM, mapIntegerObject);
|
||||
|
||||
claims = this.claimTypeConverter.convert(claims);
|
||||
|
||||
assertThat(claims.get(STRING_CLAIM)).isEqualTo("true");
|
||||
assertThat(claims.get(BOOLEAN_CLAIM)).isEqualTo(Boolean.TRUE);
|
||||
assertThat(claims.get(INSTANT_CLAIM)).isEqualTo(instant);
|
||||
@@ -147,7 +143,6 @@ public class ClaimTypeConverterTests {
|
||||
List<String> listString = Lists.list("1", "2", "3", "4");
|
||||
Map<String, Object> mapStringObject = new HashMap<>();
|
||||
mapStringObject.put("1", "value1");
|
||||
|
||||
Map<String, Object> claims = new HashMap<>();
|
||||
claims.put(STRING_CLAIM, string);
|
||||
claims.put(BOOLEAN_CLAIM, bool);
|
||||
@@ -156,9 +151,7 @@ public class ClaimTypeConverterTests {
|
||||
claims.put(COLLECTION_STRING_CLAIM, listString);
|
||||
claims.put(LIST_STRING_CLAIM, listString);
|
||||
claims.put(MAP_STRING_OBJECT_CLAIM, mapStringObject);
|
||||
|
||||
claims = this.claimTypeConverter.convert(claims);
|
||||
|
||||
assertThat(claims.get(STRING_CLAIM)).isSameAs(string);
|
||||
assertThat(claims.get(BOOLEAN_CLAIM)).isSameAs(bool);
|
||||
assertThat(claims.get(INSTANT_CLAIM)).isSameAs(instant);
|
||||
@@ -172,9 +165,7 @@ public class ClaimTypeConverterTests {
|
||||
public void convertWhenConverterNotAvailableThenDoesNotConvert() {
|
||||
Map<String, Object> claims = new HashMap<>();
|
||||
claims.put("claim1", "value1");
|
||||
|
||||
claims = this.claimTypeConverter.convert(claims);
|
||||
|
||||
assertThat(claims.get("claim1")).isSameAs("value1");
|
||||
}
|
||||
|
||||
|
||||
@@ -63,11 +63,9 @@ public class MapOAuth2AccessTokenResponseConverterTests {
|
||||
Assert.assertTrue(scopes.contains("read"));
|
||||
Assert.assertTrue(scopes.contains("write"));
|
||||
Assert.assertEquals(3600, Duration.between(accessToken.getIssuedAt(), accessToken.getExpiresAt()).getSeconds());
|
||||
|
||||
OAuth2RefreshToken refreshToken = converted.getRefreshToken();
|
||||
Assert.assertNotNull(refreshToken);
|
||||
Assert.assertEquals("refresh-token-1234", refreshToken.getTokenValue());
|
||||
|
||||
Map<String, Object> additionalParameters = converted.getAdditionalParameters();
|
||||
Assert.assertNotNull(additionalParameters);
|
||||
Assert.assertEquals(2, additionalParameters.size());
|
||||
@@ -88,12 +86,9 @@ public class MapOAuth2AccessTokenResponseConverterTests {
|
||||
Set<String> scopes = accessToken.getScopes();
|
||||
Assert.assertNotNull(scopes);
|
||||
Assert.assertEquals(0, scopes.size());
|
||||
|
||||
Assert.assertEquals(1, Duration.between(accessToken.getIssuedAt(), accessToken.getExpiresAt()).getSeconds());
|
||||
|
||||
OAuth2RefreshToken refreshToken = converted.getRefreshToken();
|
||||
Assert.assertNull(refreshToken);
|
||||
|
||||
Map<String, Object> additionalParameters = converted.getAdditionalParameters();
|
||||
Assert.assertNotNull(additionalParameters);
|
||||
Assert.assertEquals(0, additionalParameters.size());
|
||||
@@ -113,12 +108,9 @@ public class MapOAuth2AccessTokenResponseConverterTests {
|
||||
Set<String> scopes = accessToken.getScopes();
|
||||
Assert.assertNotNull(scopes);
|
||||
Assert.assertEquals(0, scopes.size());
|
||||
|
||||
Assert.assertEquals(1, Duration.between(accessToken.getIssuedAt(), accessToken.getExpiresAt()).getSeconds());
|
||||
|
||||
OAuth2RefreshToken refreshToken = converted.getRefreshToken();
|
||||
Assert.assertNull(refreshToken);
|
||||
|
||||
Map<String, Object> additionalParameters = converted.getAdditionalParameters();
|
||||
Assert.assertNotNull(additionalParameters);
|
||||
Assert.assertEquals(0, additionalParameters.size());
|
||||
|
||||
@@ -46,17 +46,14 @@ public class OAuth2AccessTokenResponseMapConverterTests {
|
||||
Map<String, Object> additionalParameters = new HashMap<>();
|
||||
additionalParameters.put("custom_parameter_1", "custom-value-1");
|
||||
additionalParameters.put("custom_parameter_2", "custom-value-2");
|
||||
|
||||
Set<String> scopes = new HashSet<>();
|
||||
scopes.add("read");
|
||||
scopes.add("write");
|
||||
|
||||
OAuth2AccessTokenResponse build = OAuth2AccessTokenResponse.withToken("access-token-value-1234").expiresIn(3699)
|
||||
.additionalParameters(additionalParameters).refreshToken("refresh-token-value-1234").scopes(scopes)
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).build();
|
||||
Map<String, String> result = this.messageConverter.convert(build);
|
||||
Assert.assertEquals(7, result.size());
|
||||
|
||||
Assert.assertEquals("access-token-value-1234", result.get("access_token"));
|
||||
Assert.assertEquals("refresh-token-value-1234", result.get("refresh_token"));
|
||||
Assert.assertEquals("read write", result.get("scope"));
|
||||
@@ -72,7 +69,6 @@ public class OAuth2AccessTokenResponseMapConverterTests {
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).build();
|
||||
Map<String, String> result = this.messageConverter.convert(build);
|
||||
Assert.assertEquals(3, result.size());
|
||||
|
||||
Assert.assertEquals("access-token-value-1234", result.get("access_token"));
|
||||
Assert.assertEquals("Bearer", result.get("token_type"));
|
||||
Assert.assertNotNull(result.get("expires_in"));
|
||||
|
||||
@@ -77,11 +77,9 @@ public class OAuth2AccessTokenResponseTests {
|
||||
Map<String, Object> additionalParameters = new HashMap<>();
|
||||
additionalParameters.put("param1", "value1");
|
||||
additionalParameters.put("param2", "value2");
|
||||
|
||||
OAuth2AccessTokenResponse tokenResponse = OAuth2AccessTokenResponse.withToken(TOKEN_VALUE)
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).expiresIn(expiresAt.toEpochMilli()).scopes(scopes)
|
||||
.refreshToken(REFRESH_TOKEN_VALUE).additionalParameters(additionalParameters).build();
|
||||
|
||||
assertThat(tokenResponse.getAccessToken()).isNotNull();
|
||||
assertThat(tokenResponse.getAccessToken().getTokenValue()).isEqualTo(TOKEN_VALUE);
|
||||
assertThat(tokenResponse.getAccessToken().getTokenType()).isEqualTo(OAuth2AccessToken.TokenType.BEARER);
|
||||
@@ -99,13 +97,10 @@ public class OAuth2AccessTokenResponseTests {
|
||||
Map<String, Object> additionalParameters = new HashMap<>();
|
||||
additionalParameters.put("param1", "value1");
|
||||
additionalParameters.put("param2", "value2");
|
||||
|
||||
OAuth2AccessTokenResponse tokenResponse = OAuth2AccessTokenResponse.withToken(TOKEN_VALUE)
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).expiresIn(expiresAt.toEpochMilli()).scopes(scopes)
|
||||
.refreshToken(REFRESH_TOKEN_VALUE).additionalParameters(additionalParameters).build();
|
||||
|
||||
OAuth2AccessTokenResponse withResponse = OAuth2AccessTokenResponse.withResponse(tokenResponse).build();
|
||||
|
||||
assertThat(withResponse.getAccessToken().getTokenValue())
|
||||
.isEqualTo(tokenResponse.getAccessToken().getTokenValue());
|
||||
assertThat(withResponse.getAccessToken().getTokenType()).isEqualTo(OAuth2AccessToken.TokenType.BEARER);
|
||||
@@ -125,13 +120,10 @@ public class OAuth2AccessTokenResponseTests {
|
||||
Map<String, Object> additionalParameters = new HashMap<>();
|
||||
additionalParameters.put("param1", "value1");
|
||||
additionalParameters.put("param2", "value2");
|
||||
|
||||
OAuth2AccessTokenResponse tokenResponse = OAuth2AccessTokenResponse.withToken(TOKEN_VALUE)
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).expiresIn(expiresAt.toEpochMilli()).scopes(scopes)
|
||||
.additionalParameters(additionalParameters).build();
|
||||
|
||||
OAuth2AccessTokenResponse withResponse = OAuth2AccessTokenResponse.withResponse(tokenResponse).build();
|
||||
|
||||
assertThat(withResponse.getRefreshToken()).isNull();
|
||||
}
|
||||
|
||||
@@ -139,11 +131,9 @@ public class OAuth2AccessTokenResponseTests {
|
||||
public void buildWhenResponseAndExpiresInThenExpiresAtEqualToIssuedAtPlusExpiresIn() {
|
||||
OAuth2AccessTokenResponse tokenResponse = OAuth2AccessTokenResponse.withToken(TOKEN_VALUE)
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).build();
|
||||
|
||||
long expiresIn = 30;
|
||||
OAuth2AccessTokenResponse withResponse = OAuth2AccessTokenResponse.withResponse(tokenResponse)
|
||||
.expiresIn(expiresIn).build();
|
||||
|
||||
assertThat(withResponse.getAccessToken().getExpiresAt())
|
||||
.isEqualTo(withResponse.getAccessToken().getIssuedAt().plusSeconds(expiresIn));
|
||||
}
|
||||
|
||||
@@ -120,16 +120,13 @@ public class OAuth2AuthorizationRequestTests {
|
||||
Map<String, Object> additionalParameters = new HashMap<>();
|
||||
additionalParameters.put("param1", "value1");
|
||||
additionalParameters.put("param2", "value2");
|
||||
|
||||
Map<String, Object> attributes = new HashMap<>();
|
||||
attributes.put("attribute1", "value1");
|
||||
attributes.put("attribute2", "value2");
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = OAuth2AuthorizationRequest.authorizationCode()
|
||||
.authorizationUri(AUTHORIZATION_URI).clientId(CLIENT_ID).redirectUri(REDIRECT_URI).scopes(SCOPES)
|
||||
.state(STATE).additionalParameters(additionalParameters).attributes(attributes)
|
||||
.authorizationRequestUri(AUTHORIZATION_URI).build();
|
||||
|
||||
assertThat(authorizationRequest.getAuthorizationUri()).isEqualTo(AUTHORIZATION_URI);
|
||||
assertThat(authorizationRequest.getGrantType()).isEqualTo(AuthorizationGrantType.AUTHORIZATION_CODE);
|
||||
assertThat(authorizationRequest.getResponseType()).isEqualTo(OAuth2AuthorizationResponseType.CODE);
|
||||
@@ -147,7 +144,6 @@ public class OAuth2AuthorizationRequestTests {
|
||||
OAuth2AuthorizationRequest authorizationRequest = OAuth2AuthorizationRequest.implicit()
|
||||
.authorizationUri(AUTHORIZATION_URI).clientId(CLIENT_ID).redirectUri(REDIRECT_URI).scopes(SCOPES)
|
||||
.state(STATE).build();
|
||||
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri())
|
||||
.isEqualTo("https://provider.com/oauth2/authorize?" + "response_type=token&client_id=client-id&"
|
||||
+ "scope=scope1%20scope2&state=state&" + "redirect_uri=https://example.com");
|
||||
@@ -174,11 +170,9 @@ public class OAuth2AuthorizationRequestTests {
|
||||
Map<String, Object> additionalParameters = new HashMap<>();
|
||||
additionalParameters.put("param1", "value1");
|
||||
additionalParameters.put("param2", "value2");
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = OAuth2AuthorizationRequest.authorizationCode()
|
||||
.authorizationUri(AUTHORIZATION_URI).clientId(CLIENT_ID).redirectUri(REDIRECT_URI).scopes(SCOPES)
|
||||
.state(STATE).additionalParameters(additionalParameters).build();
|
||||
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri()).isNotNull();
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri()).isEqualTo("https://provider.com/oauth2/authorize?"
|
||||
+ "response_type=code&client_id=client-id&" + "scope=scope1%20scope2&state=state&"
|
||||
@@ -189,7 +183,6 @@ public class OAuth2AuthorizationRequestTests {
|
||||
public void buildWhenRequiredParametersSetThenAuthorizationRequestUriIncludesRequiredParametersOnly() {
|
||||
OAuth2AuthorizationRequest authorizationRequest = OAuth2AuthorizationRequest.authorizationCode()
|
||||
.authorizationUri(AUTHORIZATION_URI).clientId(CLIENT_ID).build();
|
||||
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri())
|
||||
.isEqualTo("https://provider.com/oauth2/authorize?response_type=code&client_id=client-id");
|
||||
}
|
||||
@@ -204,18 +197,14 @@ public class OAuth2AuthorizationRequestTests {
|
||||
Map<String, Object> additionalParameters = new HashMap<>();
|
||||
additionalParameters.put("param1", "value1");
|
||||
additionalParameters.put("param2", "value2");
|
||||
|
||||
Map<String, Object> attributes = new HashMap<>();
|
||||
attributes.put("attribute1", "value1");
|
||||
attributes.put("attribute2", "value2");
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequest = OAuth2AuthorizationRequest.authorizationCode()
|
||||
.authorizationUri(AUTHORIZATION_URI).clientId(CLIENT_ID).redirectUri(REDIRECT_URI).scopes(SCOPES)
|
||||
.state(STATE).additionalParameters(additionalParameters).attributes(attributes).build();
|
||||
|
||||
OAuth2AuthorizationRequest authorizationRequestCopy = OAuth2AuthorizationRequest.from(authorizationRequest)
|
||||
.build();
|
||||
|
||||
assertThat(authorizationRequestCopy.getAuthorizationUri())
|
||||
.isEqualTo(authorizationRequest.getAuthorizationUri());
|
||||
assertThat(authorizationRequestCopy.getGrantType()).isEqualTo(authorizationRequest.getGrantType());
|
||||
@@ -235,7 +224,6 @@ public class OAuth2AuthorizationRequestTests {
|
||||
public void buildWhenAuthorizationUriIncludesQueryParameterThenAuthorizationRequestUrlIncludesIt() {
|
||||
OAuth2AuthorizationRequest authorizationRequest = TestOAuth2AuthorizationRequests.request()
|
||||
.authorizationUri(AUTHORIZATION_URI + "?param1=value1¶m2=value2").build();
|
||||
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri()).isNotNull();
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri()).isEqualTo("https://provider.com/oauth2/authorize?"
|
||||
+ "param1=value1¶m2=value2&" + "response_type=code&client_id=client-id&state=state&"
|
||||
@@ -248,7 +236,6 @@ public class OAuth2AuthorizationRequestTests {
|
||||
.authorizationUri(AUTHORIZATION_URI
|
||||
+ "?claims=%7B%22userinfo%22%3A%7B%22email_verified%22%3A%7B%22essential%22%3Atrue%7D%7D%7D")
|
||||
.build();
|
||||
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri()).isNotNull();
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri()).isEqualTo("https://provider.com/oauth2/authorize?"
|
||||
+ "claims=%7B%22userinfo%22%3A%7B%22email_verified%22%3A%7B%22essential%22%3Atrue%7D%7D%7D&"
|
||||
@@ -264,7 +251,6 @@ public class OAuth2AuthorizationRequestTests {
|
||||
additionalParameters.put('\u00e2' + "ge", "4" + '\u00bd');
|
||||
OAuth2AuthorizationRequest authorizationRequest = TestOAuth2AuthorizationRequests.request()
|
||||
.additionalParameters(additionalParameters).build();
|
||||
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri()).isNotNull();
|
||||
assertThat(authorizationRequest.getAuthorizationRequestUri()).isEqualTo(
|
||||
"https://example.com/login/oauth/authorize?" + "response_type=code&client_id=client-id&state=state&"
|
||||
|
||||
@@ -80,12 +80,9 @@ public class OAuth2AccessTokenResponseHttpMessageConverterTests {
|
||||
+ " \"scope\": \"read write\",\n" + " \"refresh_token\": \"refresh-token-1234\",\n"
|
||||
+ " \"custom_parameter_1\": \"custom-value-1\",\n" + " \"custom_parameter_2\": \"custom-value-2\"\n"
|
||||
+ "}\n";
|
||||
|
||||
MockClientHttpResponse response = new MockClientHttpResponse(tokenResponse.getBytes(), HttpStatus.OK);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.messageConverter
|
||||
.readInternal(OAuth2AccessTokenResponse.class, response);
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenValue()).isEqualTo("access-token-1234");
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenType()).isEqualTo(OAuth2AccessToken.TokenType.BEARER);
|
||||
assertThat(accessTokenResponse.getAccessToken().getExpiresAt())
|
||||
@@ -94,7 +91,6 @@ public class OAuth2AccessTokenResponseHttpMessageConverterTests {
|
||||
assertThat(accessTokenResponse.getRefreshToken().getTokenValue()).isEqualTo("refresh-token-1234");
|
||||
assertThat(accessTokenResponse.getAdditionalParameters()).containsExactly(
|
||||
entry("custom_parameter_1", "custom-value-1"), entry("custom_parameter_2", "custom-value-2"));
|
||||
|
||||
}
|
||||
|
||||
// gh-6463
|
||||
@@ -107,12 +103,9 @@ public class OAuth2AccessTokenResponseHttpMessageConverterTests {
|
||||
+ " \"custom_object_2\": [\"value1\", \"value2\"],\n"
|
||||
+ " \"custom_parameter_1\": \"custom-value-1\",\n" + " \"custom_parameter_2\": \"custom-value-2\"\n"
|
||||
+ "}\n";
|
||||
|
||||
MockClientHttpResponse response = new MockClientHttpResponse(tokenResponse.getBytes(), HttpStatus.OK);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.messageConverter
|
||||
.readInternal(OAuth2AccessTokenResponse.class, response);
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenValue()).isEqualTo("access-token-1234");
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenType()).isEqualTo(OAuth2AccessToken.TokenType.BEARER);
|
||||
assertThat(accessTokenResponse.getAccessToken().getExpiresAt())
|
||||
@@ -130,12 +123,9 @@ public class OAuth2AccessTokenResponseHttpMessageConverterTests {
|
||||
String tokenResponse = "{\n" + " \"access_token\": \"access-token-1234\",\n"
|
||||
+ " \"token_type\": \"bearer\",\n" + " \"expires_in\": 3600,\n" + " \"scope\": null,\n"
|
||||
+ " \"refresh_token\": \"refresh-token-1234\"\n" + "}\n";
|
||||
|
||||
MockClientHttpResponse response = new MockClientHttpResponse(tokenResponse.getBytes(), HttpStatus.OK);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = this.messageConverter
|
||||
.readInternal(OAuth2AccessTokenResponse.class, response);
|
||||
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenValue()).isEqualTo("access-token-1234");
|
||||
assertThat(accessTokenResponse.getAccessToken().getTokenType()).isEqualTo(OAuth2AccessToken.TokenType.BEARER);
|
||||
assertThat(accessTokenResponse.getAccessToken().getExpiresAt())
|
||||
@@ -149,11 +139,8 @@ public class OAuth2AccessTokenResponseHttpMessageConverterTests {
|
||||
Converter tokenResponseConverter = mock(Converter.class);
|
||||
given(tokenResponseConverter.convert(any())).willThrow(RuntimeException.class);
|
||||
this.messageConverter.setTokenResponseConverter(tokenResponseConverter);
|
||||
|
||||
String tokenResponse = "{}";
|
||||
|
||||
MockClientHttpResponse response = new MockClientHttpResponse(tokenResponse.getBytes(), HttpStatus.OK);
|
||||
|
||||
assertThatThrownBy(() -> this.messageConverter.readInternal(OAuth2AccessTokenResponse.class, response))
|
||||
.isInstanceOf(HttpMessageNotReadableException.class)
|
||||
.hasMessageContaining("An error occurred reading the OAuth 2.0 Access Token Response");
|
||||
@@ -166,15 +153,12 @@ public class OAuth2AccessTokenResponseHttpMessageConverterTests {
|
||||
Map<String, Object> additionalParameters = new HashMap<>();
|
||||
additionalParameters.put("custom_parameter_1", "custom-value-1");
|
||||
additionalParameters.put("custom_parameter_2", "custom-value-2");
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = OAuth2AccessTokenResponse.withToken("access-token-1234")
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).expiresIn(expiresAt.toEpochMilli()).scopes(scopes)
|
||||
.refreshToken("refresh-token-1234").additionalParameters(additionalParameters).build();
|
||||
|
||||
MockHttpOutputMessage outputMessage = new MockHttpOutputMessage();
|
||||
this.messageConverter.writeInternal(accessTokenResponse, outputMessage);
|
||||
String tokenResponse = outputMessage.getBodyAsString();
|
||||
|
||||
assertThat(tokenResponse).contains("\"access_token\":\"access-token-1234\"");
|
||||
assertThat(tokenResponse).contains("\"token_type\":\"Bearer\"");
|
||||
assertThat(tokenResponse).contains("\"expires_in\"");
|
||||
@@ -189,13 +173,10 @@ public class OAuth2AccessTokenResponseHttpMessageConverterTests {
|
||||
Converter tokenResponseParametersConverter = mock(Converter.class);
|
||||
given(tokenResponseParametersConverter.convert(any())).willThrow(RuntimeException.class);
|
||||
this.messageConverter.setTokenResponseParametersConverter(tokenResponseParametersConverter);
|
||||
|
||||
OAuth2AccessTokenResponse accessTokenResponse = OAuth2AccessTokenResponse.withToken("access-token-1234")
|
||||
.tokenType(OAuth2AccessToken.TokenType.BEARER).expiresIn(Instant.now().plusSeconds(3600).toEpochMilli())
|
||||
.build();
|
||||
|
||||
MockHttpOutputMessage outputMessage = new MockHttpOutputMessage();
|
||||
|
||||
assertThatThrownBy(() -> this.messageConverter.writeInternal(accessTokenResponse, outputMessage))
|
||||
.isInstanceOf(HttpMessageNotWritableException.class)
|
||||
.hasMessageContaining("An error occurred writing the OAuth 2.0 Access Token Response");
|
||||
|
||||
@@ -69,9 +69,7 @@ public class OAuth2ErrorHttpMessageConverterTests {
|
||||
String errorResponse = "{\n" + " \"error\": \"unauthorized_client\",\n"
|
||||
+ " \"error_description\": \"The client is not authorized\",\n"
|
||||
+ " \"error_uri\": \"https://tools.ietf.org/html/rfc6749#section-5.2\"\n" + "}\n";
|
||||
|
||||
MockClientHttpResponse response = new MockClientHttpResponse(errorResponse.getBytes(), HttpStatus.BAD_REQUEST);
|
||||
|
||||
OAuth2Error oauth2Error = this.messageConverter.readInternal(OAuth2Error.class, response);
|
||||
assertThat(oauth2Error.getErrorCode()).isEqualTo("unauthorized_client");
|
||||
assertThat(oauth2Error.getDescription()).isEqualTo("The client is not authorized");
|
||||
@@ -84,9 +82,7 @@ public class OAuth2ErrorHttpMessageConverterTests {
|
||||
String errorResponse = "{\n" + " \"error\": \"unauthorized_client\",\n"
|
||||
+ " \"error_description\": \"The client is not authorized\",\n" + " \"error_codes\": [65001],\n"
|
||||
+ " \"error_uri\": \"https://tools.ietf.org/html/rfc6749#section-5.2\"\n" + "}\n";
|
||||
|
||||
MockClientHttpResponse response = new MockClientHttpResponse(errorResponse.getBytes(), HttpStatus.BAD_REQUEST);
|
||||
|
||||
OAuth2Error oauth2Error = this.messageConverter.readInternal(OAuth2Error.class, response);
|
||||
assertThat(oauth2Error.getErrorCode()).isEqualTo("unauthorized_client");
|
||||
assertThat(oauth2Error.getDescription()).isEqualTo("The client is not authorized");
|
||||
@@ -98,11 +94,8 @@ public class OAuth2ErrorHttpMessageConverterTests {
|
||||
Converter errorConverter = mock(Converter.class);
|
||||
given(errorConverter.convert(any())).willThrow(RuntimeException.class);
|
||||
this.messageConverter.setErrorConverter(errorConverter);
|
||||
|
||||
String errorResponse = "{}";
|
||||
|
||||
MockClientHttpResponse response = new MockClientHttpResponse(errorResponse.getBytes(), HttpStatus.BAD_REQUEST);
|
||||
|
||||
assertThatThrownBy(() -> this.messageConverter.readInternal(OAuth2Error.class, response))
|
||||
.isInstanceOf(HttpMessageNotReadableException.class)
|
||||
.hasMessageContaining("An error occurred reading the OAuth 2.0 Error");
|
||||
@@ -112,11 +105,9 @@ public class OAuth2ErrorHttpMessageConverterTests {
|
||||
public void writeInternalWhenOAuth2ErrorThenWriteErrorResponse() throws Exception {
|
||||
OAuth2Error oauth2Error = new OAuth2Error("unauthorized_client", "The client is not authorized",
|
||||
"https://tools.ietf.org/html/rfc6749#section-5.2");
|
||||
|
||||
MockHttpOutputMessage outputMessage = new MockHttpOutputMessage();
|
||||
this.messageConverter.writeInternal(oauth2Error, outputMessage);
|
||||
String errorResponse = outputMessage.getBodyAsString();
|
||||
|
||||
assertThat(errorResponse).contains("\"error\":\"unauthorized_client\"");
|
||||
assertThat(errorResponse).contains("\"error_description\":\"The client is not authorized\"");
|
||||
assertThat(errorResponse).contains("\"error_uri\":\"https://tools.ietf.org/html/rfc6749#section-5.2\"");
|
||||
@@ -127,12 +118,9 @@ public class OAuth2ErrorHttpMessageConverterTests {
|
||||
Converter errorParametersConverter = mock(Converter.class);
|
||||
given(errorParametersConverter.convert(any())).willThrow(RuntimeException.class);
|
||||
this.messageConverter.setErrorParametersConverter(errorParametersConverter);
|
||||
|
||||
OAuth2Error oauth2Error = new OAuth2Error("unauthorized_client", "The client is not authorized",
|
||||
"https://tools.ietf.org/html/rfc6749#section-5.2");
|
||||
|
||||
MockHttpOutputMessage outputMessage = new MockHttpOutputMessage();
|
||||
|
||||
assertThatThrownBy(() -> this.messageConverter.writeInternal(oauth2Error, outputMessage))
|
||||
.isInstanceOf(HttpMessageNotWritableException.class)
|
||||
.hasMessageContaining("An error occurred writing the OAuth 2.0 Error");
|
||||
|
||||
@@ -48,7 +48,6 @@ public class DefaultAddressStandardClaimTests {
|
||||
AddressStandardClaim addressStandardClaim = new DefaultAddressStandardClaim.Builder().formatted(FORMATTED)
|
||||
.streetAddress(STREET_ADDRESS).locality(LOCALITY).region(REGION).postalCode(POSTAL_CODE)
|
||||
.country(COUNTRY).build();
|
||||
|
||||
assertThat(addressStandardClaim.getFormatted()).isEqualTo(FORMATTED);
|
||||
assertThat(addressStandardClaim.getStreetAddress()).isEqualTo(STREET_ADDRESS);
|
||||
assertThat(addressStandardClaim.getLocality()).isEqualTo(LOCALITY);
|
||||
@@ -66,9 +65,7 @@ public class DefaultAddressStandardClaimTests {
|
||||
addressFields.put(REGION_FIELD_NAME, REGION);
|
||||
addressFields.put(POSTAL_CODE_FIELD_NAME, POSTAL_CODE);
|
||||
addressFields.put(COUNTRY_FIELD_NAME, COUNTRY);
|
||||
|
||||
AddressStandardClaim addressStandardClaim = new DefaultAddressStandardClaim.Builder(addressFields).build();
|
||||
|
||||
assertThat(addressStandardClaim.getFormatted()).isEqualTo(FORMATTED);
|
||||
assertThat(addressStandardClaim.getStreetAddress()).isEqualTo(STREET_ADDRESS);
|
||||
assertThat(addressStandardClaim.getLocality()).isEqualTo(LOCALITY);
|
||||
|
||||
@@ -31,16 +31,12 @@ public class OidcIdTokenBuilderTests {
|
||||
@Test
|
||||
public void buildWhenCalledTwiceThenGeneratesTwoOidcIdTokens() {
|
||||
OidcIdToken.Builder idTokenBuilder = OidcIdToken.withTokenValue("token");
|
||||
|
||||
OidcIdToken first = idTokenBuilder.tokenValue("V1").claim("TEST_CLAIM_1", "C1").build();
|
||||
|
||||
OidcIdToken second = idTokenBuilder.tokenValue("V2").claim("TEST_CLAIM_1", "C2").claim("TEST_CLAIM_2", "C3")
|
||||
.build();
|
||||
|
||||
assertThat(first.getClaims()).hasSize(1);
|
||||
assertThat(first.getClaims().get("TEST_CLAIM_1")).isEqualTo("C1");
|
||||
assertThat(first.getTokenValue()).isEqualTo("V1");
|
||||
|
||||
assertThat(second.getClaims()).hasSize(2);
|
||||
assertThat(second.getClaims().get("TEST_CLAIM_1")).isEqualTo("C2");
|
||||
assertThat(second.getClaims().get("TEST_CLAIM_2")).isEqualTo("C3");
|
||||
@@ -50,15 +46,11 @@ public class OidcIdTokenBuilderTests {
|
||||
@Test
|
||||
public void expiresAtWhenUsingGenericOrNamedClaimMethodRequiresInstant() {
|
||||
OidcIdToken.Builder idTokenBuilder = OidcIdToken.withTokenValue("token");
|
||||
|
||||
Instant now = Instant.now();
|
||||
|
||||
OidcIdToken idToken = idTokenBuilder.expiresAt(now).build();
|
||||
assertThat(idToken.getExpiresAt()).isSameAs(now);
|
||||
|
||||
idToken = idTokenBuilder.expiresAt(now).build();
|
||||
assertThat(idToken.getExpiresAt()).isSameAs(now);
|
||||
|
||||
assertThatCode(() -> idTokenBuilder.claim(IdTokenClaimNames.EXP, "not an instant").build())
|
||||
.isInstanceOf(IllegalArgumentException.class);
|
||||
}
|
||||
@@ -66,15 +58,11 @@ public class OidcIdTokenBuilderTests {
|
||||
@Test
|
||||
public void issuedAtWhenUsingGenericOrNamedClaimMethodRequiresInstant() {
|
||||
OidcIdToken.Builder idTokenBuilder = OidcIdToken.withTokenValue("token");
|
||||
|
||||
Instant now = Instant.now();
|
||||
|
||||
OidcIdToken idToken = idTokenBuilder.issuedAt(now).build();
|
||||
assertThat(idToken.getIssuedAt()).isSameAs(now);
|
||||
|
||||
idToken = idTokenBuilder.issuedAt(now).build();
|
||||
assertThat(idToken.getIssuedAt()).isSameAs(now);
|
||||
|
||||
assertThatCode(() -> idTokenBuilder.claim(IdTokenClaimNames.IAT, "not an instant").build())
|
||||
.isInstanceOf(IllegalArgumentException.class);
|
||||
}
|
||||
@@ -82,13 +70,10 @@ public class OidcIdTokenBuilderTests {
|
||||
@Test
|
||||
public void subjectWhenUsingGenericOrNamedClaimMethodThenLastOneWins() {
|
||||
OidcIdToken.Builder idTokenBuilder = OidcIdToken.withTokenValue("token");
|
||||
|
||||
String generic = new String("sub");
|
||||
String named = new String("sub");
|
||||
|
||||
OidcIdToken idToken = idTokenBuilder.subject(named).claim(IdTokenClaimNames.SUB, generic).build();
|
||||
assertThat(idToken.getSubject()).isSameAs(generic);
|
||||
|
||||
idToken = idTokenBuilder.claim(IdTokenClaimNames.SUB, generic).subject(named).build();
|
||||
assertThat(idToken.getSubject()).isSameAs(named);
|
||||
}
|
||||
@@ -96,7 +81,6 @@ public class OidcIdTokenBuilderTests {
|
||||
@Test
|
||||
public void claimsWhenRemovingAClaimThenIsNotPresent() {
|
||||
OidcIdToken.Builder idTokenBuilder = OidcIdToken.withTokenValue("token").claim("needs", "a claim");
|
||||
|
||||
OidcIdToken idToken = idTokenBuilder.subject("sub").claims((claims) -> claims.remove(IdTokenClaimNames.SUB))
|
||||
.build();
|
||||
assertThat(idToken.getSubject()).isNull();
|
||||
@@ -105,11 +89,9 @@ public class OidcIdTokenBuilderTests {
|
||||
@Test
|
||||
public void claimsWhenAddingAClaimThenIsPresent() {
|
||||
OidcIdToken.Builder idTokenBuilder = OidcIdToken.withTokenValue("token");
|
||||
|
||||
String name = new String("name");
|
||||
String value = new String("value");
|
||||
OidcIdToken idToken = idTokenBuilder.claims((claims) -> claims.put(name, value)).build();
|
||||
|
||||
assertThat(idToken.getClaims()).hasSize(1);
|
||||
assertThat(idToken.getClaims().get(name)).isSameAs(value);
|
||||
}
|
||||
|
||||
@@ -85,7 +85,6 @@ public class OidcIdTokenTests {
|
||||
private static final Map<String, Object> CLAIMS;
|
||||
|
||||
private static final String ID_TOKEN_VALUE = "id-token-value";
|
||||
|
||||
static {
|
||||
CLAIMS = new HashMap<>();
|
||||
CLAIMS.put(ISS_CLAIM, ISS_VALUE);
|
||||
@@ -117,7 +116,6 @@ public class OidcIdTokenTests {
|
||||
public void constructorWhenParametersProvidedAndValidThenCreated() {
|
||||
OidcIdToken idToken = new OidcIdToken(ID_TOKEN_VALUE, Instant.ofEpochMilli(IAT_VALUE),
|
||||
Instant.ofEpochMilli(EXP_VALUE), CLAIMS);
|
||||
|
||||
assertThat(idToken.getClaims()).isEqualTo(CLAIMS);
|
||||
assertThat(idToken.getTokenValue()).isEqualTo(ID_TOKEN_VALUE);
|
||||
assertThat(idToken.getIssuer().toString()).isEqualTo(ISS_VALUE);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user