| 
					
				 | 
			
			
				@@ -1,5 +1,5 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Copyright 2002-2021 the original author or authors. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Copyright 2002-2022 the original author or authors. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * Licensed under the Apache License, Version 2.0 (the "License"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * you may not use this file except in compliance with the License. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -18,6 +18,7 @@ package org.springframework.security.oauth2.client; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.time.Duration; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.time.Instant; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.function.Function; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.junit.jupiter.api.BeforeEach; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.junit.jupiter.api.Test; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -42,6 +43,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import static org.mockito.ArgumentMatchers.any; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import static org.mockito.BDDMockito.given; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import static org.mockito.Mockito.mock; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import static org.mockito.Mockito.verify; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * Tests for {@link JwtBearerOAuth2AuthorizedClientProvider}. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -87,6 +89,13 @@ public class JwtBearerOAuth2AuthorizedClientProviderTests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				.withMessage("accessTokenResponseClient cannot be null"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Test 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public void setJwtAssertionResolverWhenNullThenThrowIllegalArgumentException() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		assertThatIllegalArgumentException() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.isThrownBy(() -> this.authorizedClientProvider.setJwtAssertionResolver(null)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.withMessage("jwtAssertionResolver cannot be null"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	@Test 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	public void setClockSkewWhenNullThenThrowIllegalArgumentException() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// @formatter:off 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -198,7 +207,7 @@ public class JwtBearerOAuth2AuthorizedClientProviderTests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	@Test 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	public void authorizeWhenJwtBearerAndNotAuthorizedAndPrincipalNotJwtThenUnableToAuthorize() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public void authorizeWhenJwtBearerAndNotAuthorizedAndJwtDoesNotResolveThenUnableToAuthorize() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// @formatter:off 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				.withClientRegistration(this.clientRegistration) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -209,7 +218,7 @@ public class JwtBearerOAuth2AuthorizedClientProviderTests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	@Test 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	public void authorizeWhenJwtBearerAndNotAuthorizedAndPrincipalJwtThenAuthorize() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public void authorizeWhenJwtBearerAndNotAuthorizedAndJwtResolvesThenAuthorize() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse().build(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// @formatter:off 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -224,4 +233,25 @@ public class JwtBearerOAuth2AuthorizedClientProviderTests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		assertThat(authorizedClient.getAccessToken()).isEqualTo(accessTokenResponse.getAccessToken()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Test 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public void authorizeWhenCustomJwtAssertionResolverSetThenUsed() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Function<OAuth2AuthorizationContext, Jwt> jwtAssertionResolver = mock(Function.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		given(jwtAssertionResolver.apply(any())).willReturn(this.jwtAssertion); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		this.authorizedClientProvider.setJwtAssertionResolver(jwtAssertionResolver); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse().build(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		given(this.accessTokenResponseClient.getTokenResponse(any())).willReturn(accessTokenResponse); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// @formatter:off 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		TestingAuthenticationToken principal = new TestingAuthenticationToken("user", "password"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.withClientRegistration(this.clientRegistration) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.principal(principal) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.build(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// @formatter:on 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		OAuth2AuthorizedClient authorizedClient = this.authorizedClientProvider.authorize(authorizationContext); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		verify(jwtAssertionResolver).apply(any()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		assertThat(authorizedClient.getClientRegistration()).isSameAs(this.clientRegistration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		assertThat(authorizedClient.getPrincipalName()).isEqualTo(principal.getName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		assertThat(authorizedClient.getAccessToken()).isEqualTo(accessTokenResponse.getAccessToken()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |