|  | @@ -30,6 +30,8 @@ import org.mockito.ArgumentCaptor;
 | 
	
		
			
				|  |  |  import org.springframework.security.authentication.TestingAuthenticationToken;
 | 
	
		
			
				|  |  |  import org.springframework.security.core.Authentication;
 | 
	
		
			
				|  |  |  import org.springframework.security.core.authority.AuthorityUtils;
 | 
	
		
			
				|  |  | +import org.springframework.security.crypto.password.NoOpPasswordEncoder;
 | 
	
		
			
				|  |  | +import org.springframework.security.crypto.password.PasswordEncoder;
 | 
	
		
			
				|  |  |  import org.springframework.security.oauth2.core.AuthorizationGrantType;
 | 
	
		
			
				|  |  |  import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
 | 
	
		
			
				|  |  |  import org.springframework.security.oauth2.core.OAuth2AccessToken;
 | 
	
	
		
			
				|  | @@ -71,9 +73,11 @@ import static org.mockito.ArgumentMatchers.any;
 | 
	
		
			
				|  |  |  import static org.mockito.ArgumentMatchers.eq;
 | 
	
		
			
				|  |  |  import static org.mockito.Mockito.doReturn;
 | 
	
		
			
				|  |  |  import static org.mockito.Mockito.mock;
 | 
	
		
			
				|  |  | +import static org.mockito.Mockito.reset;
 | 
	
		
			
				|  |  |  import static org.mockito.Mockito.spy;
 | 
	
		
			
				|  |  |  import static org.mockito.Mockito.times;
 | 
	
		
			
				|  |  |  import static org.mockito.Mockito.verify;
 | 
	
		
			
				|  |  | +import static org.mockito.Mockito.verifyNoInteractions;
 | 
	
		
			
				|  |  |  import static org.mockito.Mockito.when;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
	
		
			
				|  | @@ -87,6 +91,7 @@ public class OidcClientRegistrationAuthenticationProviderTests {
 | 
	
		
			
				|  |  |  	private OAuth2AuthorizationService authorizationService;
 | 
	
		
			
				|  |  |  	private JwtEncoder jwtEncoder;
 | 
	
		
			
				|  |  |  	private OAuth2TokenGenerator<?> tokenGenerator;
 | 
	
		
			
				|  |  | +	private PasswordEncoder passwordEncoder;
 | 
	
		
			
				|  |  |  	private AuthorizationServerSettings authorizationServerSettings;
 | 
	
		
			
				|  |  |  	private OidcClientRegistrationAuthenticationProvider authenticationProvider;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -102,10 +107,22 @@ public class OidcClientRegistrationAuthenticationProviderTests {
 | 
	
		
			
				|  |  |  				return jwtGenerator.generate(context);
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		});
 | 
	
		
			
				|  |  | +		this.passwordEncoder = spy(new PasswordEncoder() {
 | 
	
		
			
				|  |  | +			@Override
 | 
	
		
			
				|  |  | +			public String encode(CharSequence rawPassword) {
 | 
	
		
			
				|  |  | +				return NoOpPasswordEncoder.getInstance().encode(rawPassword);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			@Override
 | 
	
		
			
				|  |  | +			public boolean matches(CharSequence rawPassword, String encodedPassword) {
 | 
	
		
			
				|  |  | +				return NoOpPasswordEncoder.getInstance().matches(rawPassword, encodedPassword);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		});
 | 
	
		
			
				|  |  |  		this.authorizationServerSettings = AuthorizationServerSettings.builder().issuer("https://provider.com").build();
 | 
	
		
			
				|  |  |  		AuthorizationServerContextHolder.setContext(new TestAuthorizationServerContext(this.authorizationServerSettings, null));
 | 
	
		
			
				|  |  |  		this.authenticationProvider = new OidcClientRegistrationAuthenticationProvider(
 | 
	
		
			
				|  |  |  				this.registeredClientRepository, this.authorizationService, this.tokenGenerator);
 | 
	
		
			
				|  |  | +		this.authenticationProvider.setPasswordEncoder(this.passwordEncoder);
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	@AfterEach
 | 
	
	
		
			
				|  | @@ -141,6 +158,13 @@ public class OidcClientRegistrationAuthenticationProviderTests {
 | 
	
		
			
				|  |  |  				.withMessage("registeredClientConverter cannot be null");
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	@Test
 | 
	
		
			
				|  |  | +	public void setPasswordEncoderWhenNullThenThrowIllegalArgumentException() {
 | 
	
		
			
				|  |  | +		assertThatThrownBy(() -> this.authenticationProvider.setPasswordEncoder(null))
 | 
	
		
			
				|  |  | +				.isInstanceOf(IllegalArgumentException.class)
 | 
	
		
			
				|  |  | +				.hasMessage("passwordEncoder cannot be null");
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	@Test
 | 
	
		
			
				|  |  |  	public void supportsWhenTypeOidcClientRegistrationAuthenticationTokenThenReturnTrue() {
 | 
	
		
			
				|  |  |  		assertThat(this.authenticationProvider.supports(OidcClientRegistrationAuthenticationToken.class)).isTrue();
 | 
	
	
		
			
				|  | @@ -544,6 +568,8 @@ public class OidcClientRegistrationAuthenticationProviderTests {
 | 
	
		
			
				|  |  |  		assertThat(authenticationResult.getClientRegistration().getTokenEndpointAuthenticationSigningAlgorithm())
 | 
	
		
			
				|  |  |  				.isEqualTo(MacAlgorithm.HS256.getName());
 | 
	
		
			
				|  |  |  		assertThat(authenticationResult.getClientRegistration().getClientSecret()).isNotNull();
 | 
	
		
			
				|  |  | +		verify(this.passwordEncoder).encode(any());
 | 
	
		
			
				|  |  | +		reset(this.passwordEncoder);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		// @formatter:off
 | 
	
		
			
				|  |  |  		builder
 | 
	
	
		
			
				|  | @@ -555,6 +581,7 @@ public class OidcClientRegistrationAuthenticationProviderTests {
 | 
	
		
			
				|  |  |  		assertThat(authenticationResult.getClientRegistration().getTokenEndpointAuthenticationSigningAlgorithm())
 | 
	
		
			
				|  |  |  				.isEqualTo(SignatureAlgorithm.RS256.getName());
 | 
	
		
			
				|  |  |  		assertThat(authenticationResult.getClientRegistration().getClientSecret()).isNull();
 | 
	
		
			
				|  |  | +		verifyNoInteractions(this.passwordEncoder);
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	@Test
 | 
	
	
		
			
				|  | @@ -638,6 +665,7 @@ public class OidcClientRegistrationAuthenticationProviderTests {
 | 
	
		
			
				|  |  |  		verify(this.registeredClientRepository).save(registeredClientCaptor.capture());
 | 
	
		
			
				|  |  |  		verify(this.authorizationService, times(2)).save(authorizationCaptor.capture());
 | 
	
		
			
				|  |  |  		verify(this.jwtEncoder).encode(any());
 | 
	
		
			
				|  |  | +		verify(this.passwordEncoder).encode(any());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		// assert "registration" access token, which should be used for subsequent calls to client configuration endpoint
 | 
	
		
			
				|  |  |  		OAuth2Authorization authorizationResult = authorizationCaptor.getAllValues().get(0);
 |