|  | @@ -505,7 +505,7 @@ One of those extended parameters is the `prompt` parameter.
 | 
	
		
			
				|  |  |  [NOTE]
 | 
	
		
			
				|  |  |  OPTIONAL. Space delimited, case sensitive list of ASCII string values that specifies whether the Authorization Server prompts the End-User for reauthentication and consent. The defined values are: none, login, consent, select_account
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -The following example shows how to implement an `OAuth2AuthorizationRequestResolver` that customizes the Authorization Request for `oauth2Login()`, by including the request parameter `prompt=consent`.
 | 
	
		
			
				|  |  | +The following example shows how to configure the `DefaultOAuth2AuthorizationRequestResolver` with a `Consumer<OAuth2AuthorizationRequest.Builder>` that customizes the Authorization Request for `oauth2Login()`, by including the request parameter `prompt=consent`.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  [source,java]
 | 
	
		
			
				|  |  |  ----
 | 
	
	
		
			
				|  | @@ -524,72 +524,32 @@ public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {
 | 
	
		
			
				|  |  |  			.oauth2Login(oauth2 -> oauth2
 | 
	
		
			
				|  |  |  				.authorizationEndpoint(authorization -> authorization
 | 
	
		
			
				|  |  |  					.authorizationRequestResolver(
 | 
	
		
			
				|  |  | -					    new CustomAuthorizationRequestResolver(
 | 
	
		
			
				|  |  | -					            this.clientRegistrationRepository)    <1>
 | 
	
		
			
				|  |  | +						authorizationRequestResolver(this.clientRegistrationRepository)
 | 
	
		
			
				|  |  |  					)
 | 
	
		
			
				|  |  |  				)
 | 
	
		
			
				|  |  |  			);
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -public class CustomAuthorizationRequestResolver implements OAuth2AuthorizationRequestResolver {
 | 
	
		
			
				|  |  | -	private final OAuth2AuthorizationRequestResolver defaultAuthorizationRequestResolver;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	public CustomAuthorizationRequestResolver(
 | 
	
		
			
				|  |  | +	private OAuth2AuthorizationRequestResolver authorizationRequestResolver(
 | 
	
		
			
				|  |  |  			ClientRegistrationRepository clientRegistrationRepository) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		this.defaultAuthorizationRequestResolver =
 | 
	
		
			
				|  |  | +		DefaultOAuth2AuthorizationRequestResolver authorizationRequestResolver =
 | 
	
		
			
				|  |  |  				new DefaultOAuth2AuthorizationRequestResolver(
 | 
	
		
			
				|  |  |  						clientRegistrationRepository, "/oauth2/authorization");
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -	public OAuth2AuthorizationRequest resolve(HttpServletRequest request) {
 | 
	
		
			
				|  |  | -		OAuth2AuthorizationRequest authorizationRequest =
 | 
	
		
			
				|  |  | -				this.defaultAuthorizationRequestResolver.resolve(request);  <2>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		return authorizationRequest != null ?   <3>
 | 
	
		
			
				|  |  | -				customAuthorizationRequest(authorizationRequest) :
 | 
	
		
			
				|  |  | -				null;
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -	public OAuth2AuthorizationRequest resolve(
 | 
	
		
			
				|  |  | -			HttpServletRequest request, String clientRegistrationId) {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		OAuth2AuthorizationRequest authorizationRequest =
 | 
	
		
			
				|  |  | -				this.defaultAuthorizationRequestResolver.resolve(
 | 
	
		
			
				|  |  | -				    request, clientRegistrationId);    <2>
 | 
	
		
			
				|  |  | +		authorizationRequestResolver.setAuthorizationRequestCustomizer(
 | 
	
		
			
				|  |  | +				authorizationRequestCustomizer());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		return authorizationRequest != null ?   <3>
 | 
	
		
			
				|  |  | -				customAuthorizationRequest(authorizationRequest) :
 | 
	
		
			
				|  |  | -				null;
 | 
	
		
			
				|  |  | +		return  authorizationRequestResolver;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	private OAuth2AuthorizationRequest customAuthorizationRequest(
 | 
	
		
			
				|  |  | -			OAuth2AuthorizationRequest authorizationRequest) {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		Map<String, Object> additionalParameters =
 | 
	
		
			
				|  |  | -				new LinkedHashMap<>(authorizationRequest.getAdditionalParameters());
 | 
	
		
			
				|  |  | -		additionalParameters.put("prompt", "consent");  <4>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		return OAuth2AuthorizationRequest.from(authorizationRequest)    <5>
 | 
	
		
			
				|  |  | -				.additionalParameters(additionalParameters) <6>
 | 
	
		
			
				|  |  | -				.build();
 | 
	
		
			
				|  |  | +	private Consumer<OAuth2AuthorizationRequest.Builder> authorizationRequestCustomizer() {
 | 
	
		
			
				|  |  | +		return customizer -> customizer
 | 
	
		
			
				|  |  | +					.additionalParameters(params -> params.put("prompt", "consent"));
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  ----
 | 
	
		
			
				|  |  | -<1> Configure the custom `OAuth2AuthorizationRequestResolver`
 | 
	
		
			
				|  |  | -<2> Attempt to resolve the `OAuth2AuthorizationRequest` using the `DefaultOAuth2AuthorizationRequestResolver`
 | 
	
		
			
				|  |  | -<3> If an `OAuth2AuthorizationRequest` was resolved than return a customized version else return `null`
 | 
	
		
			
				|  |  | -<4> Add custom parameters to the existing `OAuth2AuthorizationRequest.additionalParameters`
 | 
	
		
			
				|  |  | -<5> Create a copy of the default `OAuth2AuthorizationRequest` which returns an `OAuth2AuthorizationRequest.Builder` for further modifications
 | 
	
		
			
				|  |  | -<6> Override the default `additionalParameters`
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -[TIP]
 | 
	
		
			
				|  |  | -`OAuth2AuthorizationRequest.Builder.build()` constructs the `OAuth2AuthorizationRequest.authorizationRequestUri`, which represents the complete Authorization Request URI including all query parameters using the `application/x-www-form-urlencoded` format.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -For the simple use case, where the additional request parameter is always the same for a specific provider, it can be added directly in the `authorization-uri`.
 | 
	
		
			
				|  |  | +For the simple use case, where the additional request parameter is always the same for a specific provider, it may be added directly in the `authorization-uri` property.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  For example, if the value for the request parameter `prompt` is always `consent` for the provider `okta`, than simply configure as follows:
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -605,24 +565,19 @@ spring:
 | 
	
		
			
				|  |  |  ----
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  The preceding example shows the common use case of adding a custom parameter on top of the standard parameters.
 | 
	
		
			
				|  |  | -Alternatively, if your requirements are more advanced, than you can take full control in building the Authorization Request URI by simply overriding the `OAuth2AuthorizationRequest.authorizationRequestUri` property.
 | 
	
		
			
				|  |  | +Alternatively, if your requirements are more advanced, you can take full control in building the Authorization Request URI by simply overriding the `OAuth2AuthorizationRequest.authorizationRequestUri` property.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -The following example shows a variation of the `customAuthorizationRequest()` method from the preceding example, and instead overrides the `OAuth2AuthorizationRequest.authorizationRequestUri` property.
 | 
	
		
			
				|  |  | +[TIP]
 | 
	
		
			
				|  |  | +`OAuth2AuthorizationRequest.Builder.build()` constructs the `OAuth2AuthorizationRequest.authorizationRequestUri`, which represents the Authorization Request URI including all query parameters using the `application/x-www-form-urlencoded` format.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +The following example shows a variation of `authorizationRequestCustomizer()` from the preceding example, and instead overrides the `OAuth2AuthorizationRequest.authorizationRequestUri` property.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  [source,java]
 | 
	
		
			
				|  |  |  ----
 | 
	
		
			
				|  |  | -private OAuth2AuthorizationRequest customAuthorizationRequest(
 | 
	
		
			
				|  |  | -		OAuth2AuthorizationRequest authorizationRequest) {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	String customAuthorizationRequestUri = UriComponentsBuilder
 | 
	
		
			
				|  |  | -			.fromUriString(authorizationRequest.getAuthorizationRequestUri())
 | 
	
		
			
				|  |  | -			.queryParam("prompt", "consent")
 | 
	
		
			
				|  |  | -			.build(true)
 | 
	
		
			
				|  |  | -			.toUriString();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	return OAuth2AuthorizationRequest.from(authorizationRequest)
 | 
	
		
			
				|  |  | -			.authorizationRequestUri(customAuthorizationRequestUri)
 | 
	
		
			
				|  |  | -			.build();
 | 
	
		
			
				|  |  | +private Consumer<OAuth2AuthorizationRequest.Builder> authorizationRequestCustomizer() {
 | 
	
		
			
				|  |  | +	return customizer -> customizer
 | 
	
		
			
				|  |  | +				.authorizationRequestUri(uriBuilder -> uriBuilder
 | 
	
		
			
				|  |  | +					.queryParam("prompt", "consent").build());
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  ----
 | 
	
		
			
				|  |  |  
 |