11/*
2- * Copyright 2020-2024 the original author or authors.
2+ * Copyright 2020-2026 the original author or authors.
33 *
44 * Licensed under the Apache License, Version 2.0 (the "License");
55 * you may not use this file except in compliance with the License.
1515 */
1616package org .springframework .security .oauth2 .server .authorization .oidc .authentication ;
1717
18- import java .net .URI ;
19- import java .net .URISyntaxException ;
2018import java .util .Collection ;
2119import java .util .Collections ;
2220import java .util .HashSet ;
23- import java .util .List ;
2421import java .util .Map ;
2522import java .util .Set ;
23+ import java .util .function .Consumer ;
2624
2725import org .apache .commons .logging .Log ;
2826import org .apache .commons .logging .LogFactory ;
5957import org .springframework .security .oauth2 .server .authorization .token .OAuth2TokenGenerator ;
6058import org .springframework .security .oauth2 .server .resource .authentication .AbstractOAuth2TokenAuthenticationToken ;
6159import org .springframework .util .Assert ;
62- import org .springframework .util .CollectionUtils ;
6360import org .springframework .util .StringUtils ;
6461
6562/**
@@ -101,6 +98,8 @@ public final class OidcClientRegistrationAuthenticationProvider implements Authe
10198
10299 private PasswordEncoder passwordEncoder ;
103100
101+ private Consumer <OidcClientRegistrationAuthenticationContext > authenticationValidator ;
102+
104103 /**
105104 * Constructs an {@code OidcClientRegistrationAuthenticationProvider} using the
106105 * provided parameters.
@@ -121,6 +120,7 @@ public OidcClientRegistrationAuthenticationProvider(RegisteredClientRepository r
121120 this .clientRegistrationConverter = new RegisteredClientOidcClientRegistrationConverter ();
122121 this .registeredClientConverter = new OidcClientRegistrationRegisteredClientConverter ();
123122 this .passwordEncoder = PasswordEncoderFactories .createDelegatingPasswordEncoder ();
123+ this .authenticationValidator = new OidcClientRegistrationAuthenticationValidator ();
124124 }
125125
126126 @ Override
@@ -209,20 +209,35 @@ public void setPasswordEncoder(PasswordEncoder passwordEncoder) {
209209 this .passwordEncoder = passwordEncoder ;
210210 }
211211
212+ /**
213+ * Sets the {@code Consumer} providing access to the
214+ * {@link OidcClientRegistrationAuthenticationContext} and is responsible for
215+ * validating specific OpenID Connect 1.0 Client Registration Request parameters
216+ * associated in the {@link OidcClientRegistrationAuthenticationToken}. The default
217+ * authentication validator is {@link OidcClientRegistrationAuthenticationValidator}.
218+ *
219+ * <p>
220+ * <b>NOTE:</b> The authentication validator MUST throw
221+ * {@link OAuth2AuthenticationException} if validation fails.
222+ * @param authenticationValidator the {@code Consumer} providing access to the
223+ * {@link OidcClientRegistrationAuthenticationContext} and is responsible for
224+ * validating specific OpenID Connect 1.0 Client Registration Request parameters
225+ * @since 1.5.7
226+ */
227+ public void setAuthenticationValidator (
228+ Consumer <OidcClientRegistrationAuthenticationContext > authenticationValidator ) {
229+ Assert .notNull (authenticationValidator , "authenticationValidator cannot be null" );
230+ this .authenticationValidator = authenticationValidator ;
231+ }
232+
212233 private OidcClientRegistrationAuthenticationToken registerClient (
213234 OidcClientRegistrationAuthenticationToken clientRegistrationAuthentication ,
214235 OAuth2Authorization authorization ) {
215236
216- if (!isValidRedirectUris (clientRegistrationAuthentication .getClientRegistration ().getRedirectUris ())) {
217- throwInvalidClientRegistration (OAuth2ErrorCodes .INVALID_REDIRECT_URI ,
218- OidcClientMetadataClaimNames .REDIRECT_URIS );
219- }
220-
221- if (!isValidRedirectUris (
222- clientRegistrationAuthentication .getClientRegistration ().getPostLogoutRedirectUris ())) {
223- throwInvalidClientRegistration ("invalid_client_metadata" ,
224- OidcClientMetadataClaimNames .POST_LOGOUT_REDIRECT_URIS );
225- }
237+ OidcClientRegistrationAuthenticationContext authenticationContext = OidcClientRegistrationAuthenticationContext
238+ .with (clientRegistrationAuthentication )
239+ .build ();
240+ this .authenticationValidator .accept (authenticationContext );
226241
227242 if (!isValidTokenEndpointAuthenticationMethod (clientRegistrationAuthentication .getClientRegistration ())) {
228243 throwInvalidClientRegistration ("invalid_client_metadata" ,
@@ -354,26 +369,6 @@ else if (authorizedScope.size() != requiredScope.size()) {
354369 }
355370 }
356371
357- private static boolean isValidRedirectUris (List <String > redirectUris ) {
358- if (CollectionUtils .isEmpty (redirectUris )) {
359- return true ;
360- }
361-
362- for (String redirectUri : redirectUris ) {
363- try {
364- URI validRedirectUri = new URI (redirectUri );
365- if (validRedirectUri .getFragment () != null ) {
366- return false ;
367- }
368- }
369- catch (URISyntaxException ex ) {
370- return false ;
371- }
372- }
373-
374- return true ;
375- }
376-
377372 private static boolean isValidTokenEndpointAuthenticationMethod (OidcClientRegistration clientRegistration ) {
378373 String authenticationMethod = clientRegistration .getTokenEndpointAuthenticationMethod ();
379374 String authenticationSigningAlgorithm = clientRegistration .getTokenEndpointAuthenticationSigningAlgorithm ();
0 commit comments