|
21 | 21 | import java.util.Map;
|
22 | 22 | import java.util.Set;
|
23 | 23 | import java.util.function.Consumer;
|
| 24 | +import java.util.function.Predicate; |
24 | 25 |
|
25 | 26 | import org.junit.jupiter.api.BeforeEach;
|
26 | 27 | import org.junit.jupiter.api.Test;
|
@@ -72,6 +73,7 @@ public class OAuth2AuthorizationCodeRequestAuthenticationProviderTests {
|
72 | 73 | private OAuth2AuthorizationConsentService authorizationConsentService;
|
73 | 74 | private OAuth2AuthorizationCodeRequestAuthenticationProvider authenticationProvider;
|
74 | 75 | private TestingAuthenticationToken principal;
|
| 76 | + private Predicate<OAuth2AuthorizationCodeRequestAuthenticationContext> requiresAuthorizationConsent; |
75 | 77 |
|
76 | 78 | @BeforeEach
|
77 | 79 | public void setUp() {
|
@@ -129,6 +131,13 @@ public void setAuthenticationValidatorWhenNullThenThrowIllegalArgumentException(
|
129 | 131 | .hasMessage("authenticationValidator cannot be null");
|
130 | 132 | }
|
131 | 133 |
|
| 134 | + @Test |
| 135 | + public void setRequiresAuthorizationConsentWhenNullThenThrowIllegalArgumentException() { |
| 136 | + assertThatThrownBy(() -> this.authenticationProvider.setRequiresAuthorizationConsent(null)) |
| 137 | + .isInstanceOf(IllegalArgumentException.class) |
| 138 | + .hasMessage("requiresAuthorizationConsent cannot be null"); |
| 139 | + } |
| 140 | + |
132 | 141 | @Test
|
133 | 142 | public void authenticateWhenInvalidClientIdThenThrowOAuth2AuthorizationCodeRequestAuthenticationException() {
|
134 | 143 | RegisteredClient registeredClient = TestRegisteredClients.registeredClient().build();
|
@@ -443,6 +452,82 @@ public void authenticateWhenRequireAuthorizationConsentThenReturnAuthorizationCo
|
443 | 452 | assertThat(authenticationResult.isAuthenticated()).isTrue();
|
444 | 453 | }
|
445 | 454 |
|
| 455 | + @Test |
| 456 | + public void authenticateWhenRequireAuthorizationConsentAndRequiresAuthorizationConsentPredicateTrueThenReturnAuthorizationConsent() { |
| 457 | + this.authenticationProvider.setRequiresAuthorizationConsent((authenticationContext) -> true); |
| 458 | + |
| 459 | + RegisteredClient registeredClient = TestRegisteredClients.registeredClient() |
| 460 | + .clientSettings(ClientSettings.builder().requireAuthorizationConsent(true).build()) |
| 461 | + .build(); |
| 462 | + when(this.registeredClientRepository.findByClientId(eq(registeredClient.getClientId()))) |
| 463 | + .thenReturn(registeredClient); |
| 464 | + |
| 465 | + String redirectUri = registeredClient.getRedirectUris().toArray(new String[0])[0]; |
| 466 | + OAuth2AuthorizationCodeRequestAuthenticationToken authentication = |
| 467 | + new OAuth2AuthorizationCodeRequestAuthenticationToken( |
| 468 | + AUTHORIZATION_URI, registeredClient.getClientId(), principal, |
| 469 | + redirectUri, STATE, registeredClient.getScopes(), null); |
| 470 | + |
| 471 | + OAuth2AuthorizationConsentAuthenticationToken authenticationResult = |
| 472 | + (OAuth2AuthorizationConsentAuthenticationToken) this.authenticationProvider.authenticate(authentication); |
| 473 | + |
| 474 | + ArgumentCaptor<OAuth2Authorization> authorizationCaptor = ArgumentCaptor.forClass(OAuth2Authorization.class); |
| 475 | + verify(this.authorizationService).save(authorizationCaptor.capture()); |
| 476 | + OAuth2Authorization authorization = authorizationCaptor.getValue(); |
| 477 | + |
| 478 | + OAuth2AuthorizationRequest authorizationRequest = authorization.getAttribute(OAuth2AuthorizationRequest.class.getName()); |
| 479 | + assertThat(authorizationRequest.getGrantType()).isEqualTo(AuthorizationGrantType.AUTHORIZATION_CODE); |
| 480 | + assertThat(authorizationRequest.getResponseType()).isEqualTo(OAuth2AuthorizationResponseType.CODE); |
| 481 | + assertThat(authorizationRequest.getAuthorizationUri()).isEqualTo(authentication.getAuthorizationUri()); |
| 482 | + assertThat(authorizationRequest.getClientId()).isEqualTo(registeredClient.getClientId()); |
| 483 | + assertThat(authorizationRequest.getRedirectUri()).isEqualTo(authentication.getRedirectUri()); |
| 484 | + assertThat(authorizationRequest.getScopes()).isEqualTo(authentication.getScopes()); |
| 485 | + assertThat(authorizationRequest.getState()).isEqualTo(authentication.getState()); |
| 486 | + assertThat(authorizationRequest.getAdditionalParameters()).isEqualTo(authentication.getAdditionalParameters()); |
| 487 | + |
| 488 | + assertThat(authorization.getRegisteredClientId()).isEqualTo(registeredClient.getId()); |
| 489 | + assertThat(authorization.getPrincipalName()).isEqualTo(this.principal.getName()); |
| 490 | + assertThat(authorization.getAuthorizationGrantType()).isEqualTo(AuthorizationGrantType.AUTHORIZATION_CODE); |
| 491 | + assertThat(authorization.<Authentication>getAttribute(Principal.class.getName())).isEqualTo(this.principal); |
| 492 | + String state = authorization.getAttribute(OAuth2ParameterNames.STATE); |
| 493 | + assertThat(state).isNotNull(); |
| 494 | + assertThat(state).isNotEqualTo(authentication.getState()); |
| 495 | + |
| 496 | + assertThat(authenticationResult.getClientId()).isEqualTo(registeredClient.getClientId()); |
| 497 | + assertThat(authenticationResult.getPrincipal()).isEqualTo(this.principal); |
| 498 | + assertThat(authenticationResult.getAuthorizationUri()).isEqualTo(authorizationRequest.getAuthorizationUri()); |
| 499 | + assertThat(authenticationResult.getScopes()).isEmpty(); |
| 500 | + assertThat(authenticationResult.getState()).isEqualTo(state); |
| 501 | + assertThat(authenticationResult.isAuthenticated()).isTrue(); |
| 502 | + } |
| 503 | + |
| 504 | + @Test |
| 505 | + public void authenticateWhenRequireAuthorizationConsentAndRequiresAuthorizationConsentPredicateFalseThenAuthorizationConsentNotRequired() { |
| 506 | + this.authenticationProvider.setRequiresAuthorizationConsent((authenticationContext) -> false); |
| 507 | + |
| 508 | + RegisteredClient registeredClient = TestRegisteredClients.registeredClient() |
| 509 | + .clientSettings(ClientSettings.builder().requireAuthorizationConsent(true).build()) |
| 510 | + .scopes(scopes -> { |
| 511 | + scopes.clear(); |
| 512 | + scopes.add(OidcScopes.OPENID); |
| 513 | + scopes.add(OidcScopes.EMAIL); |
| 514 | + }) |
| 515 | + .build(); |
| 516 | + when(this.registeredClientRepository.findByClientId(eq(registeredClient.getClientId()))) |
| 517 | + .thenReturn(registeredClient); |
| 518 | + |
| 519 | + String redirectUri = registeredClient.getRedirectUris().toArray(new String[0])[1]; |
| 520 | + OAuth2AuthorizationCodeRequestAuthenticationToken authentication = |
| 521 | + new OAuth2AuthorizationCodeRequestAuthenticationToken( |
| 522 | + AUTHORIZATION_URI, registeredClient.getClientId(), principal, |
| 523 | + redirectUri, STATE, registeredClient.getScopes(), null); |
| 524 | + |
| 525 | + OAuth2AuthorizationCodeRequestAuthenticationToken authenticationResult = |
| 526 | + (OAuth2AuthorizationCodeRequestAuthenticationToken) this.authenticationProvider.authenticate(authentication); |
| 527 | + |
| 528 | + assertAuthorizationCodeRequestWithAuthorizationCodeResult(registeredClient, authentication, authenticationResult); |
| 529 | + } |
| 530 | + |
446 | 531 | @Test
|
447 | 532 | public void authenticateWhenRequireAuthorizationConsentAndOnlyOpenidScopeRequestedThenAuthorizationConsentNotRequired() {
|
448 | 533 | RegisteredClient registeredClient = TestRegisteredClients.registeredClient()
|
|
0 commit comments