| 
					
				 | 
			
			
				@@ -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()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ---- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |