2020import java .io .Serializable ;
2121import java .lang .reflect .Field ;
2222import java .security .Principal ;
23+ import java .time .Duration ;
2324import java .time .Instant ;
2425import java .util .Collection ;
2526import java .util .Date ;
8586import org .springframework .security .authorization .AuthorityAuthorizationDecision ;
8687import org .springframework .security .authorization .AuthorizationDecision ;
8788import org .springframework .security .authorization .AuthorizationDeniedException ;
89+ import org .springframework .security .authorization .FactorAuthorizationDecision ;
90+ import org .springframework .security .authorization .RequiredFactor ;
91+ import org .springframework .security .authorization .RequiredFactorError ;
8892import org .springframework .security .authorization .event .AuthorizationEvent ;
8993import org .springframework .security .authorization .event .AuthorizationGrantedEvent ;
9094import org .springframework .security .cas .authentication .CasAssertionAuthenticationToken ;
161165import org .springframework .security .oauth2 .jwt .JwtValidationException ;
162166import org .springframework .security .oauth2 .jwt .TestJwts ;
163167import org .springframework .security .oauth2 .server .authorization .OAuth2Authorization ;
168+ import org .springframework .security .oauth2 .server .authorization .OAuth2AuthorizationCode ;
164169import org .springframework .security .oauth2 .server .authorization .OAuth2AuthorizationConsent ;
165170import org .springframework .security .oauth2 .server .authorization .OAuth2AuthorizationServerMetadata ;
166171import org .springframework .security .oauth2 .server .authorization .OAuth2ClientRegistration ;
167172import org .springframework .security .oauth2 .server .authorization .OAuth2TokenIntrospection ;
168173import org .springframework .security .oauth2 .server .authorization .OAuth2TokenType ;
169174import org .springframework .security .oauth2 .server .authorization .TestOAuth2Authorizations ;
170175import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2AccessTokenAuthenticationToken ;
176+ import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2AuthorizationCodeRequestAuthenticationException ;
171177import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2AuthorizationCodeRequestAuthenticationToken ;
172178import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2AuthorizationConsentAuthenticationToken ;
173179import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2AuthorizationGrantAuthenticationToken ;
174180import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2ClientAuthenticationToken ;
181+ import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2ClientCredentialsAuthenticationToken ;
175182import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2ClientRegistrationAuthenticationToken ;
176183import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2DeviceAuthorizationConsentAuthenticationToken ;
177184import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2DeviceAuthorizationRequestAuthenticationToken ;
185+ import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2DeviceCodeAuthenticationToken ;
178186import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2DeviceVerificationAuthenticationToken ;
179187import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2PushedAuthorizationRequestAuthenticationToken ;
188+ import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2RefreshTokenAuthenticationToken ;
189+ import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2TokenExchangeActor ;
190+ import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2TokenExchangeAuthenticationToken ;
191+ import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2TokenExchangeCompositeAuthenticationToken ;
180192import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2TokenIntrospectionAuthenticationToken ;
181193import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2TokenRevocationAuthenticationToken ;
182194import org .springframework .security .oauth2 .server .authorization .client .RegisteredClient ;
190202import org .springframework .security .oauth2 .server .authorization .settings .ClientSettings ;
191203import org .springframework .security .oauth2 .server .authorization .settings .OAuth2TokenFormat ;
192204import org .springframework .security .oauth2 .server .authorization .settings .TokenSettings ;
205+ import org .springframework .security .oauth2 .server .authorization .token .OAuth2TokenClaimNames ;
193206import org .springframework .security .oauth2 .server .resource .BearerTokenError ;
194207import org .springframework .security .oauth2 .server .resource .BearerTokenErrors ;
195208import org .springframework .security .oauth2 .server .resource .InvalidBearerTokenException ;
@@ -429,6 +442,8 @@ final class SerializationSamples {
429442 generatorByClassName .put (RegisteredClient .class , (r ) -> registeredClient );
430443 generatorByClassName .put (OAuth2Authorization .class , (r ) -> authorization );
431444 generatorByClassName .put (OAuth2Authorization .Token .class , (r ) -> authorization .getAccessToken ());
445+ generatorByClassName .put (OAuth2AuthorizationCode .class ,
446+ (r ) -> new OAuth2AuthorizationCode ("code" , Instant .now (), Instant .now ().plusSeconds (300 )));
432447 generatorByClassName .put (OAuth2AuthorizationConsent .class ,
433448 (r ) -> OAuth2AuthorizationConsent .withId ("registeredClientId" , "principalName" )
434449 .scope ("scope1" )
@@ -454,6 +469,58 @@ final class SerializationSamples {
454469 authenticationToken .setDetails (details );
455470 return authenticationToken ;
456471 });
472+ generatorByClassName .put (
473+ org .springframework .security .oauth2 .server .authorization .authentication .OAuth2AuthorizationCodeAuthenticationToken .class ,
474+ (r ) -> {
475+ org .springframework .security .oauth2 .server .authorization .authentication .OAuth2AuthorizationCodeAuthenticationToken token = new org .springframework .security .oauth2 .server .authorization .authentication .OAuth2AuthorizationCodeAuthenticationToken (
476+ "code" , principal , "https://localhost/callback" , Map .of ("custom_param" , "custom_value" ));
477+ token .setDetails (details );
478+ return token ;
479+ });
480+ generatorByClassName .put (OAuth2AuthorizationCodeRequestAuthenticationException .class , (r ) -> {
481+ OAuth2AuthorizationCodeRequestAuthenticationToken authToken = new OAuth2AuthorizationCodeRequestAuthenticationToken (
482+ "https://localhost/authorize" , "clientId" , principal , "https://localhost/callback" , "state" ,
483+ authorizationRequest .getScopes (), authorizationRequest .getAdditionalParameters ());
484+ return new OAuth2AuthorizationCodeRequestAuthenticationException (
485+ new OAuth2Error ("invalid_request" , "Missing required parameter" , "https://example.com/error" ),
486+ authToken );
487+ });
488+ generatorByClassName .put (OAuth2ClientCredentialsAuthenticationToken .class , (r ) -> {
489+ OAuth2ClientCredentialsAuthenticationToken token = new OAuth2ClientCredentialsAuthenticationToken (principal ,
490+ Set .of ("scope1" , "scope2" ), Map .of ("custom_param" , "custom_value" ));
491+ token .setDetails (details );
492+ return token ;
493+ });
494+ generatorByClassName .put (OAuth2DeviceCodeAuthenticationToken .class , (r ) -> {
495+ OAuth2DeviceCodeAuthenticationToken token = new OAuth2DeviceCodeAuthenticationToken ("device-code" ,
496+ principal , Map .of ("custom_param" , "custom_value" ));
497+ token .setDetails (details );
498+ return token ;
499+ });
500+ generatorByClassName .put (OAuth2RefreshTokenAuthenticationToken .class , (r ) -> {
501+ OAuth2RefreshTokenAuthenticationToken token = new OAuth2RefreshTokenAuthenticationToken ("refresh-token" ,
502+ principal , Set .of ("scope1" , "scope2" ), Map .of ("custom_param" , "custom_value" ));
503+ token .setDetails (details );
504+ return token ;
505+ });
506+ generatorByClassName .put (OAuth2TokenExchangeAuthenticationToken .class , (r ) -> {
507+ OAuth2TokenExchangeAuthenticationToken token = new OAuth2TokenExchangeAuthenticationToken (
508+ "urn:ietf:params:oauth:token-type:access_token" , "subject-token" ,
509+ "urn:ietf:params:oauth:token-type:jwt" , principal , "actor-token" ,
510+ "urn:ietf:params:oauth:token-type:jwt" , Set .of ("https://resource.example.com" ), Set .of ("audience" ),
511+ Set .of ("scope1" ), Map .of ("custom_param" , "custom_value" ));
512+ token .setDetails (details );
513+ return token ;
514+ });
515+ OAuth2TokenExchangeActor actor = new OAuth2TokenExchangeActor (Map .of (OAuth2TokenClaimNames .ISS ,
516+ "https://issuer.example.com" , OAuth2TokenClaimNames .SUB , "actor-subject" ));
517+ generatorByClassName .put (OAuth2TokenExchangeActor .class , (r ) -> actor );
518+ generatorByClassName .put (OAuth2TokenExchangeCompositeAuthenticationToken .class , (r ) -> {
519+ AbstractAuthenticationToken token = new OAuth2TokenExchangeCompositeAuthenticationToken (authentication ,
520+ List .of (actor ));
521+ token .setDetails (details );
522+ return token ;
523+ });
457524 generatorByClassName .put (OAuth2AuthorizationConsentAuthenticationToken .class , (r ) -> {
458525 OAuth2AuthorizationConsentAuthenticationToken authenticationToken = new OAuth2AuthorizationConsentAuthenticationToken (
459526 "authorizationUri" , "clientId" , principal , "state" , authorizationRequest .getScopes (),
@@ -670,6 +737,12 @@ final class SerializationSamples {
670737 generatorByClassName .put (AuthorizationDecision .class , (r ) -> new AuthorizationDecision (true ));
671738 generatorByClassName .put (AuthorityAuthorizationDecision .class ,
672739 (r ) -> new AuthorityAuthorizationDecision (true , AuthorityUtils .createAuthorityList ("ROLE_USER" )));
740+ RequiredFactor factor = RequiredFactor .withAuthority ("authority" ).validDuration (Duration .ofSeconds (5 )).build ();
741+ generatorByClassName .put (RequiredFactor .class , (r ) -> factor );
742+ RequiredFactorError error = RequiredFactorError .createMissing (factor );
743+ generatorByClassName .put (RequiredFactorError .class , (r ) -> error );
744+ generatorByClassName .put (FactorAuthorizationDecision .class ,
745+ (r ) -> new FactorAuthorizationDecision (List .of (error )));
673746 generatorByClassName .put (CycleInRoleHierarchyException .class , (r ) -> new CycleInRoleHierarchyException ());
674747 generatorByClassName .put (AuthorizationEvent .class ,
675748 (r ) -> new AuthorizationEvent (new SerializableSupplier <>(authentication ), "source" ,
0 commit comments