17
17
18
18
import java .net .URI ;
19
19
import java .net .URISyntaxException ;
20
- import java .time .Instant ;
21
- import java .util .Base64 ;
22
20
import java .util .Collection ;
23
21
import java .util .Collections ;
24
22
import java .util .HashSet ;
25
23
import java .util .List ;
26
24
import java .util .Map ;
27
25
import java .util .Set ;
28
- import java .util .UUID ;
29
26
30
27
import org .apache .commons .logging .Log ;
31
28
import org .apache .commons .logging .LogFactory ;
35
32
import org .springframework .security .core .Authentication ;
36
33
import org .springframework .security .core .AuthenticationException ;
37
34
import org .springframework .security .crypto .factory .PasswordEncoderFactories ;
38
- import org .springframework .security .crypto .keygen .Base64StringKeyGenerator ;
39
- import org .springframework .security .crypto .keygen .StringKeyGenerator ;
40
35
import org .springframework .security .crypto .password .PasswordEncoder ;
41
36
import org .springframework .security .oauth2 .core .AuthorizationGrantType ;
42
37
import org .springframework .security .oauth2 .core .ClaimAccessor ;
46
41
import org .springframework .security .oauth2 .core .OAuth2Error ;
47
42
import org .springframework .security .oauth2 .core .OAuth2ErrorCodes ;
48
43
import org .springframework .security .oauth2 .core .OAuth2Token ;
49
- import org .springframework .security .oauth2 .core .endpoint .OAuth2AuthorizationResponseType ;
50
44
import org .springframework .security .oauth2 .core .endpoint .OAuth2ParameterNames ;
51
45
import org .springframework .security .oauth2 .jose .jws .MacAlgorithm ;
52
46
import org .springframework .security .oauth2 .jose .jws .SignatureAlgorithm ;
59
53
import org .springframework .security .oauth2 .server .authorization .context .AuthorizationServerContextHolder ;
60
54
import org .springframework .security .oauth2 .server .authorization .oidc .OidcClientMetadataClaimNames ;
61
55
import 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 ;
64
56
import org .springframework .security .oauth2 .server .authorization .token .DefaultOAuth2TokenContext ;
65
57
import org .springframework .security .oauth2 .server .authorization .token .OAuth2TokenContext ;
66
58
import org .springframework .security .oauth2 .server .authorization .token .OAuth2TokenGenerator ;
75
67
* @author Ovidiu Popa
76
68
* @author Joe Grandja
77
69
* @author Rafal Lewczuk
70
+ * @author Dmitriy Dubson
78
71
* @since 0.1.1
79
72
* @see RegisteredClientRepository
80
73
* @see OAuth2AuthorizationService
@@ -91,7 +84,7 @@ public final class OidcClientRegistrationAuthenticationProvider implements Authe
91
84
private final RegisteredClientRepository registeredClientRepository ;
92
85
private final OAuth2AuthorizationService authorizationService ;
93
86
private final OAuth2TokenGenerator <? extends OAuth2Token > tokenGenerator ;
94
- private final Converter <RegisteredClient , OidcClientRegistration > clientRegistrationConverter ;
87
+ private Converter <RegisteredClient , OidcClientRegistration > clientRegistrationConverter ;
95
88
private Converter <OidcClientRegistration , RegisteredClient > registeredClientConverter ;
96
89
private PasswordEncoder passwordEncoder ;
97
90
@@ -172,6 +165,17 @@ public void setRegisteredClientConverter(Converter<OidcClientRegistration, Regis
172
165
this .registeredClientConverter = registeredClientConverter ;
173
166
}
174
167
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
+
175
179
/**
176
180
* Sets the {@link PasswordEncoder} used to encode the {@link RegisteredClient#getClientSecret() client secret}.
177
181
* 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
368
372
throw new OAuth2AuthenticationException (error );
369
373
}
370
374
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
- }
456
375
}
0 commit comments