3434import org .springframework .security .oauth2 .server .authorization .InMemoryOAuth2AuthorizationService ;
3535import org .springframework .security .oauth2 .server .authorization .JwtEncodingContext ;
3636import org .springframework .security .oauth2 .server .authorization .JwtGenerator ;
37+ import org .springframework .security .oauth2 .server .authorization .OAuth2AccessTokenGenerator ;
3738import org .springframework .security .oauth2 .server .authorization .OAuth2AuthorizationConsentService ;
3839import org .springframework .security .oauth2 .server .authorization .OAuth2AuthorizationService ;
3940import org .springframework .security .oauth2 .server .authorization .OAuth2RefreshTokenGenerator ;
41+ import org .springframework .security .oauth2 .server .authorization .OAuth2TokenClaimsContext ;
4042import org .springframework .security .oauth2 .server .authorization .OAuth2TokenCustomizer ;
4143import org .springframework .security .oauth2 .server .authorization .OAuth2TokenGenerator ;
4244import org .springframework .security .oauth2 .server .authorization .client .RegisteredClientRepository ;
@@ -93,28 +95,55 @@ static <B extends HttpSecurityBuilder<B>> OAuth2TokenGenerator<? extends OAuth2T
9395 if (tokenGenerator == null ) {
9496 tokenGenerator = getOptionalBean (builder , OAuth2TokenGenerator .class );
9597 if (tokenGenerator == null ) {
96- JwtGenerator jwtGenerator = new JwtGenerator (getJwtEncoder (builder ));
97- OAuth2TokenCustomizer <JwtEncodingContext > jwtCustomizer = getJwtCustomizer (builder );
98- if (jwtCustomizer != null ) {
99- jwtGenerator .setJwtCustomizer (jwtCustomizer );
98+ JwtGenerator jwtGenerator = getJwtGenerator (builder );
99+ OAuth2AccessTokenGenerator accessTokenGenerator = new OAuth2AccessTokenGenerator ();
100+ OAuth2TokenCustomizer <OAuth2TokenClaimsContext > accessTokenCustomizer = getAccessTokenCustomizer (builder );
101+ if (accessTokenCustomizer != null ) {
102+ accessTokenGenerator .setAccessTokenCustomizer (accessTokenCustomizer );
100103 }
101104 OAuth2RefreshTokenGenerator refreshTokenGenerator = new OAuth2RefreshTokenGenerator ();
102- tokenGenerator = new DelegatingOAuth2TokenGenerator (jwtGenerator , refreshTokenGenerator );
105+ if (jwtGenerator != null ) {
106+ tokenGenerator = new DelegatingOAuth2TokenGenerator (
107+ jwtGenerator , accessTokenGenerator , refreshTokenGenerator );
108+ } else {
109+ tokenGenerator = new DelegatingOAuth2TokenGenerator (
110+ accessTokenGenerator , refreshTokenGenerator );
111+ }
103112 }
104113 builder .setSharedObject (OAuth2TokenGenerator .class , tokenGenerator );
105114 }
106115 return tokenGenerator ;
107116 }
108117
118+ private static <B extends HttpSecurityBuilder <B >> JwtGenerator getJwtGenerator (B builder ) {
119+ JwtGenerator jwtGenerator = builder .getSharedObject (JwtGenerator .class );
120+ if (jwtGenerator == null ) {
121+ JwtEncoder jwtEncoder = getJwtEncoder (builder );
122+ if (jwtEncoder != null ) {
123+ jwtGenerator = new JwtGenerator (jwtEncoder );
124+ OAuth2TokenCustomizer <JwtEncodingContext > jwtCustomizer = getJwtCustomizer (builder );
125+ if (jwtCustomizer != null ) {
126+ jwtGenerator .setJwtCustomizer (jwtCustomizer );
127+ }
128+ builder .setSharedObject (JwtGenerator .class , jwtGenerator );
129+ }
130+ }
131+ return jwtGenerator ;
132+ }
133+
109134 private static <B extends HttpSecurityBuilder <B >> JwtEncoder getJwtEncoder (B builder ) {
110135 JwtEncoder jwtEncoder = builder .getSharedObject (JwtEncoder .class );
111136 if (jwtEncoder == null ) {
112137 jwtEncoder = getOptionalBean (builder , JwtEncoder .class );
113138 if (jwtEncoder == null ) {
114139 JWKSource <SecurityContext > jwkSource = getJwkSource (builder );
115- jwtEncoder = new NimbusJwsEncoder (jwkSource );
140+ if (jwkSource != null ) {
141+ jwtEncoder = new NimbusJwsEncoder (jwkSource );
142+ }
143+ }
144+ if (jwtEncoder != null ) {
145+ builder .setSharedObject (JwtEncoder .class , jwtEncoder );
116146 }
117- builder .setSharedObject (JwtEncoder .class , jwtEncoder );
118147 }
119148 return jwtEncoder ;
120149 }
@@ -124,23 +153,22 @@ static <B extends HttpSecurityBuilder<B>> JWKSource<SecurityContext> getJwkSourc
124153 JWKSource <SecurityContext > jwkSource = builder .getSharedObject (JWKSource .class );
125154 if (jwkSource == null ) {
126155 ResolvableType type = ResolvableType .forClassWithGenerics (JWKSource .class , SecurityContext .class );
127- jwkSource = getBean (builder , type );
128- builder .setSharedObject (JWKSource .class , jwkSource );
156+ jwkSource = getOptionalBean (builder , type );
157+ if (jwkSource != null ) {
158+ builder .setSharedObject (JWKSource .class , jwkSource );
159+ }
129160 }
130161 return jwkSource ;
131162 }
132163
133- @ SuppressWarnings ("unchecked" )
134164 private static <B extends HttpSecurityBuilder <B >> OAuth2TokenCustomizer <JwtEncodingContext > getJwtCustomizer (B builder ) {
135- OAuth2TokenCustomizer <JwtEncodingContext > jwtCustomizer = builder .getSharedObject (OAuth2TokenCustomizer .class );
136- if (jwtCustomizer == null ) {
137- ResolvableType type = ResolvableType .forClassWithGenerics (OAuth2TokenCustomizer .class , JwtEncodingContext .class );
138- jwtCustomizer = getOptionalBean (builder , type );
139- if (jwtCustomizer != null ) {
140- builder .setSharedObject (OAuth2TokenCustomizer .class , jwtCustomizer );
141- }
142- }
143- return jwtCustomizer ;
165+ ResolvableType type = ResolvableType .forClassWithGenerics (OAuth2TokenCustomizer .class , JwtEncodingContext .class );
166+ return getOptionalBean (builder , type );
167+ }
168+
169+ private static <B extends HttpSecurityBuilder <B >> OAuth2TokenCustomizer <OAuth2TokenClaimsContext > getAccessTokenCustomizer (B builder ) {
170+ ResolvableType type = ResolvableType .forClassWithGenerics (OAuth2TokenCustomizer .class , OAuth2TokenClaimsContext .class );
171+ return getOptionalBean (builder , type );
144172 }
145173
146174 static <B extends HttpSecurityBuilder <B >> ProviderSettings getProviderSettings (B builder ) {
0 commit comments