1717
1818import java .net .URI ;
1919import java .net .URISyntaxException ;
20- import java .time .Instant ;
21- import java .util .Base64 ;
2220import java .util .Collection ;
2321import java .util .Collections ;
2422import java .util .HashSet ;
2523import java .util .List ;
2624import java .util .Map ;
2725import java .util .Set ;
28- import java .util .UUID ;
2926
3027import org .apache .commons .logging .Log ;
3128import org .apache .commons .logging .LogFactory ;
3532import org .springframework .security .core .Authentication ;
3633import org .springframework .security .core .AuthenticationException ;
3734import org .springframework .security .crypto .factory .PasswordEncoderFactories ;
38- import org .springframework .security .crypto .keygen .Base64StringKeyGenerator ;
39- import org .springframework .security .crypto .keygen .StringKeyGenerator ;
4035import org .springframework .security .crypto .password .PasswordEncoder ;
4136import org .springframework .security .oauth2 .core .AuthorizationGrantType ;
4237import org .springframework .security .oauth2 .core .ClaimAccessor ;
4641import org .springframework .security .oauth2 .core .OAuth2Error ;
4742import org .springframework .security .oauth2 .core .OAuth2ErrorCodes ;
4843import org .springframework .security .oauth2 .core .OAuth2Token ;
49- import org .springframework .security .oauth2 .core .endpoint .OAuth2AuthorizationResponseType ;
5044import org .springframework .security .oauth2 .core .endpoint .OAuth2ParameterNames ;
5145import org .springframework .security .oauth2 .jose .jws .MacAlgorithm ;
5246import org .springframework .security .oauth2 .jose .jws .SignatureAlgorithm ;
5953import org .springframework .security .oauth2 .server .authorization .context .AuthorizationServerContextHolder ;
6054import org .springframework .security .oauth2 .server .authorization .oidc .OidcClientMetadataClaimNames ;
6155import org .springframework .security .oauth2 .server .authorization .oidc .OidcClientRegistration ;
62- import org .springframework .security .oauth2 .server .authorization .settings .ClientSettings ;
63- import org .springframework .security .oauth2 .server .authorization .settings .TokenSettings ;
6456import org .springframework .security .oauth2 .server .authorization .token .DefaultOAuth2TokenContext ;
6557import org .springframework .security .oauth2 .server .authorization .token .OAuth2TokenContext ;
6658import org .springframework .security .oauth2 .server .authorization .token .OAuth2TokenGenerator ;
7567 * @author Ovidiu Popa
7668 * @author Joe Grandja
7769 * @author Rafal Lewczuk
70+ * @author Dmitriy Dubson
7871 * @since 0.1.1
7972 * @see RegisteredClientRepository
8073 * @see OAuth2AuthorizationService
@@ -91,7 +84,7 @@ public final class OidcClientRegistrationAuthenticationProvider implements Authe
9184 private final RegisteredClientRepository registeredClientRepository ;
9285 private final OAuth2AuthorizationService authorizationService ;
9386 private final OAuth2TokenGenerator <? extends OAuth2Token > tokenGenerator ;
94- private final Converter <RegisteredClient , OidcClientRegistration > clientRegistrationConverter ;
87+ private Converter <RegisteredClient , OidcClientRegistration > clientRegistrationConverter ;
9588 private Converter <OidcClientRegistration , RegisteredClient > registeredClientConverter ;
9689 private PasswordEncoder passwordEncoder ;
9790
@@ -172,6 +165,17 @@ public void setRegisteredClientConverter(Converter<OidcClientRegistration, Regis
172165 this .registeredClientConverter = registeredClientConverter ;
173166 }
174167
168+ /**
169+ * Sets the {@link Converter} used for converting an {@link RegisteredClient} to a {@link OidcClientRegistration}.
170+ *
171+ * @param clientRegistrationConverter the {@link Converter} used for converting an {@link RegisteredClient} to a {@link OidcClientRegistration}
172+ * @since 1.2.0
173+ */
174+ public void setClientRegistrationConverter (Converter <RegisteredClient , OidcClientRegistration > clientRegistrationConverter ) {
175+ Assert .notNull (clientRegistrationConverter , "clientRegistrationConverter cannot be null" );
176+ this .clientRegistrationConverter = clientRegistrationConverter ;
177+ }
178+
175179 /**
176180 * Sets the {@link PasswordEncoder} used to encode the {@link RegisteredClient#getClientSecret() client secret}.
177181 * If not set, the client secret will be encoded using {@link PasswordEncoderFactories#createDelegatingPasswordEncoder()}.
@@ -368,89 +372,4 @@ private static void throwInvalidClientRegistration(String errorCode, String fiel
368372 throw new OAuth2AuthenticationException (error );
369373 }
370374
371- private static final class OidcClientRegistrationRegisteredClientConverter implements Converter <OidcClientRegistration , RegisteredClient > {
372- private static final StringKeyGenerator CLIENT_ID_GENERATOR = new Base64StringKeyGenerator (
373- Base64 .getUrlEncoder ().withoutPadding (), 32 );
374- private static final StringKeyGenerator CLIENT_SECRET_GENERATOR = new Base64StringKeyGenerator (
375- Base64 .getUrlEncoder ().withoutPadding (), 48 );
376-
377- @ Override
378- public RegisteredClient convert (OidcClientRegistration clientRegistration ) {
379- // @formatter:off
380- RegisteredClient .Builder builder = RegisteredClient .withId (UUID .randomUUID ().toString ())
381- .clientId (CLIENT_ID_GENERATOR .generateKey ())
382- .clientIdIssuedAt (Instant .now ())
383- .clientName (clientRegistration .getClientName ());
384-
385- if (ClientAuthenticationMethod .CLIENT_SECRET_POST .getValue ().equals (clientRegistration .getTokenEndpointAuthenticationMethod ())) {
386- builder
387- .clientAuthenticationMethod (ClientAuthenticationMethod .CLIENT_SECRET_POST )
388- .clientSecret (CLIENT_SECRET_GENERATOR .generateKey ());
389- } else if (ClientAuthenticationMethod .CLIENT_SECRET_JWT .getValue ().equals (clientRegistration .getTokenEndpointAuthenticationMethod ())) {
390- builder
391- .clientAuthenticationMethod (ClientAuthenticationMethod .CLIENT_SECRET_JWT )
392- .clientSecret (CLIENT_SECRET_GENERATOR .generateKey ());
393- } else if (ClientAuthenticationMethod .PRIVATE_KEY_JWT .getValue ().equals (clientRegistration .getTokenEndpointAuthenticationMethod ())) {
394- builder .clientAuthenticationMethod (ClientAuthenticationMethod .PRIVATE_KEY_JWT );
395- } else {
396- builder
397- .clientAuthenticationMethod (ClientAuthenticationMethod .CLIENT_SECRET_BASIC )
398- .clientSecret (CLIENT_SECRET_GENERATOR .generateKey ());
399- }
400-
401- builder .redirectUris (redirectUris ->
402- redirectUris .addAll (clientRegistration .getRedirectUris ()));
403-
404- if (!CollectionUtils .isEmpty (clientRegistration .getPostLogoutRedirectUris ())) {
405- builder .postLogoutRedirectUris (postLogoutRedirectUris ->
406- postLogoutRedirectUris .addAll (clientRegistration .getPostLogoutRedirectUris ()));
407- }
408-
409- if (!CollectionUtils .isEmpty (clientRegistration .getGrantTypes ())) {
410- builder .authorizationGrantTypes (authorizationGrantTypes ->
411- clientRegistration .getGrantTypes ().forEach (grantType ->
412- authorizationGrantTypes .add (new AuthorizationGrantType (grantType ))));
413- } else {
414- builder .authorizationGrantType (AuthorizationGrantType .AUTHORIZATION_CODE );
415- }
416- if (CollectionUtils .isEmpty (clientRegistration .getResponseTypes ()) ||
417- clientRegistration .getResponseTypes ().contains (OAuth2AuthorizationResponseType .CODE .getValue ())) {
418- builder .authorizationGrantType (AuthorizationGrantType .AUTHORIZATION_CODE );
419- }
420-
421- if (!CollectionUtils .isEmpty (clientRegistration .getScopes ())) {
422- builder .scopes (scopes ->
423- scopes .addAll (clientRegistration .getScopes ()));
424- }
425-
426- ClientSettings .Builder clientSettingsBuilder = ClientSettings .builder ()
427- .requireProofKey (true )
428- .requireAuthorizationConsent (true );
429-
430- if (ClientAuthenticationMethod .CLIENT_SECRET_JWT .getValue ().equals (clientRegistration .getTokenEndpointAuthenticationMethod ())) {
431- MacAlgorithm macAlgorithm = MacAlgorithm .from (clientRegistration .getTokenEndpointAuthenticationSigningAlgorithm ());
432- if (macAlgorithm == null ) {
433- macAlgorithm = MacAlgorithm .HS256 ;
434- }
435- clientSettingsBuilder .tokenEndpointAuthenticationSigningAlgorithm (macAlgorithm );
436- } else if (ClientAuthenticationMethod .PRIVATE_KEY_JWT .getValue ().equals (clientRegistration .getTokenEndpointAuthenticationMethod ())) {
437- SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm .from (clientRegistration .getTokenEndpointAuthenticationSigningAlgorithm ());
438- if (signatureAlgorithm == null ) {
439- signatureAlgorithm = SignatureAlgorithm .RS256 ;
440- }
441- clientSettingsBuilder .tokenEndpointAuthenticationSigningAlgorithm (signatureAlgorithm );
442- clientSettingsBuilder .jwkSetUrl (clientRegistration .getJwkSetUrl ().toString ());
443- }
444-
445- builder
446- .clientSettings (clientSettingsBuilder .build ())
447- .tokenSettings (TokenSettings .builder ()
448- .idTokenSignatureAlgorithm (SignatureAlgorithm .RS256 )
449- .build ());
450-
451- return builder .build ();
452- // @formatter:on
453- }
454-
455- }
456375}
0 commit comments