Skip to content

Commit 0ac851f

Browse files
committed
Make OAuth's RestTemplate and WebClient customizable
1 parent 748538d commit 0ac851f

File tree

44 files changed

+925
-197
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+925
-197
lines changed

config/src/main/java/org/springframework/security/config/annotation/web/configuration/OAuth2ClientConfiguration.java

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,24 +67,32 @@ static class OAuth2ClientWebMvcSecurityConfiguration implements WebMvcConfigurer
6767
private ClientRegistrationRepository clientRegistrationRepository;
6868
private OAuth2AuthorizedClientRepository authorizedClientRepository;
6969
private OAuth2AccessTokenResponseClient<OAuth2ClientCredentialsGrantRequest> accessTokenResponseClient;
70+
private OAuth2AuthorizedClientProviderBuilder.RefreshTokenGrantBuilderCustomizer refreshTokenGrantBuilderCustomizer;
71+
private OAuth2AuthorizedClientProviderBuilder.ClientCredentialsGrantBuilderCustomizer clientCredentialsGrantBuilderCustomizer;
72+
private OAuth2AuthorizedClientProviderBuilder.PasswordGrantBuilderCustomizer passwordGrantBuilderCustomizer;
7073

7174
@Override
7275
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
7376
if (this.clientRegistrationRepository != null && this.authorizedClientRepository != null) {
7477
OAuth2AuthorizedClientProviderBuilder authorizedClientProviderBuilder =
7578
OAuth2AuthorizedClientProviderBuilder.builder()
7679
.authorizationCode()
77-
.refreshToken()
78-
.password();
80+
.refreshToken(refreshTokenGrantBuilderCustomizer)
81+
.password(passwordGrantBuilderCustomizer);
7982
if (this.accessTokenResponseClient != null) {
83+
authorizedClientProviderBuilder.clientCredentials(clientCredentialsGrantBuilderCustomizer);
8084
authorizedClientProviderBuilder.clientCredentials(configurer ->
81-
configurer.accessTokenResponseClient(this.accessTokenResponseClient));
85+
configurer.accessTokenResponseClient(this.accessTokenResponseClient));
8286
} else {
83-
authorizedClientProviderBuilder.clientCredentials();
87+
authorizedClientProviderBuilder.clientCredentials(clientCredentialsGrantBuilderCustomizer);
8488
}
8589
OAuth2AuthorizedClientProvider authorizedClientProvider = authorizedClientProviderBuilder.build();
8690
DefaultOAuth2AuthorizedClientManager authorizedClientManager = new DefaultOAuth2AuthorizedClientManager(
87-
this.clientRegistrationRepository, this.authorizedClientRepository);
91+
this.clientRegistrationRepository,
92+
this.authorizedClientRepository,
93+
this.refreshTokenGrantBuilderCustomizer,
94+
this.clientCredentialsGrantBuilderCustomizer,
95+
this.passwordGrantBuilderCustomizer);
8896
authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);
8997
argumentResolvers.add(new OAuth2AuthorizedClientArgumentResolver(authorizedClientManager));
9098
}
@@ -104,6 +112,30 @@ public void setAuthorizedClientRepository(List<OAuth2AuthorizedClientRepository>
104112
}
105113
}
106114

115+
@Autowired(required = false)
116+
public void setRefreshTokenGrantBuilderCustomizer(
117+
List<OAuth2AuthorizedClientProviderBuilder.RefreshTokenGrantBuilderCustomizer> beans) {
118+
if (beans.size() == 1) {
119+
this.refreshTokenGrantBuilderCustomizer = beans.get(0);
120+
}
121+
}
122+
123+
@Autowired(required = false)
124+
public void setClientCredentialsGrantBuilderCustomizer(
125+
List<OAuth2AuthorizedClientProviderBuilder.ClientCredentialsGrantBuilderCustomizer> beans) {
126+
if (beans.size() == 1) {
127+
this.clientCredentialsGrantBuilderCustomizer = beans.get(0);
128+
}
129+
}
130+
131+
@Autowired(required = false)
132+
public void setPasswordGrantBuilderCustomizer(
133+
List<OAuth2AuthorizedClientProviderBuilder.PasswordGrantBuilderCustomizer> beans) {
134+
if (beans.size() == 1) {
135+
this.passwordGrantBuilderCustomizer = beans.get(0);
136+
}
137+
}
138+
107139
@Autowired
108140
public void setAccessTokenResponseClient(
109141
Optional<OAuth2AccessTokenResponseClient<OAuth2ClientCredentialsGrantRequest>> accessTokenResponseClient) {

config/src/main/java/org/springframework/security/config/annotation/web/configurers/oauth2/client/OAuth2ClientConfigurer.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.security.oauth2.client.endpoint.DefaultAuthorizationCodeTokenResponseClient;
2525
import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient;
2626
import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest;
27+
import org.springframework.security.oauth2.client.endpoint.OAuth2RestTemplateFactory;
2728
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
2829
import org.springframework.security.oauth2.client.web.AuthenticatedPrincipalOAuth2AuthorizedClientRepository;
2930
import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository;
@@ -156,6 +157,7 @@ public class AuthorizationCodeGrantConfigurer {
156157
private OAuth2AuthorizationRequestResolver authorizationRequestResolver;
157158
private AuthorizationRequestRepository<OAuth2AuthorizationRequest> authorizationRequestRepository;
158159
private OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest> accessTokenResponseClient;
160+
private OAuth2RestTemplateFactory restTemplateFactory;
159161

160162
private AuthorizationCodeGrantConfigurer() {
161163
}
@@ -200,6 +202,12 @@ public AuthorizationCodeGrantConfigurer accessTokenResponseClient(
200202
return this;
201203
}
202204

205+
public AuthorizationCodeGrantConfigurer restTemplateFactory(OAuth2RestTemplateFactory restTemplateFactory) {
206+
Assert.notNull(restTemplateFactory, "restTemplateFactory cannot be null");
207+
this.restTemplateFactory = restTemplateFactory;
208+
return this;
209+
}
210+
203211
/**
204212
* Returns the {@link OAuth2ClientConfigurer} for further configuration.
205213
*
@@ -211,7 +219,7 @@ public OAuth2ClientConfigurer<B> and() {
211219

212220
private void init(B builder) {
213221
OAuth2AuthorizationCodeAuthenticationProvider authorizationCodeAuthenticationProvider =
214-
new OAuth2AuthorizationCodeAuthenticationProvider(getAccessTokenResponseClient());
222+
new OAuth2AuthorizationCodeAuthenticationProvider(getOrCreateAccessTokenResponseClient());
215223
builder.authenticationProvider(postProcess(authorizationCodeAuthenticationProvider));
216224
}
217225

@@ -264,11 +272,14 @@ private OAuth2AuthorizationCodeGrantFilter createAuthorizationCodeGrantFilter(B
264272
return authorizationCodeGrantFilter;
265273
}
266274

267-
private OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest> getAccessTokenResponseClient() {
268-
if (this.accessTokenResponseClient != null) {
275+
private OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest> getOrCreateAccessTokenResponseClient() {
276+
if (this.accessTokenResponseClient == null) {
277+
return restTemplateFactory == null
278+
? new DefaultAuthorizationCodeTokenResponseClient()
279+
: new DefaultAuthorizationCodeTokenResponseClient(restTemplateFactory);
280+
} else {
269281
return this.accessTokenResponseClient;
270282
}
271-
return new DefaultAuthorizationCodeTokenResponseClient();
272283
}
273284
}
274285

config/src/main/java/org/springframework/security/config/annotation/web/configurers/oauth2/client/OAuth2LoginConfigurer.java

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,19 @@
4141
import org.springframework.security.oauth2.client.endpoint.DefaultAuthorizationCodeTokenResponseClient;
4242
import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient;
4343
import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest;
44+
import org.springframework.security.oauth2.client.endpoint.OAuth2RestTemplateFactory;
4445
import org.springframework.security.oauth2.client.oidc.authentication.OidcAuthorizationCodeAuthenticationProvider;
4546
import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserRequest;
4647
import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService;
4748
import org.springframework.security.oauth2.client.registration.ClientRegistration;
4849
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
4950
import org.springframework.security.oauth2.client.userinfo.CustomUserTypesOAuth2UserService;
5051
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
52+
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserServiceRestTemplateFactory;
5153
import org.springframework.security.oauth2.client.userinfo.DelegatingOAuth2UserService;
5254
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
5355
import org.springframework.security.oauth2.client.userinfo.OAuth2UserService;
56+
import org.springframework.security.oauth2.client.userinfo.OAuth2UserServiceRestTemplateFactory;
5457
import org.springframework.security.oauth2.client.web.AuthenticatedPrincipalOAuth2AuthorizedClientRepository;
5558
import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository;
5659
import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter;
@@ -299,6 +302,7 @@ public OAuth2LoginConfigurer<B> tokenEndpoint(Customizer<TokenEndpointConfig> to
299302
*/
300303
public class TokenEndpointConfig {
301304
private OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest> accessTokenResponseClient;
305+
private OAuth2RestTemplateFactory restTemplateFactory;
302306

303307
private TokenEndpointConfig() {
304308
}
@@ -317,6 +321,12 @@ public TokenEndpointConfig accessTokenResponseClient(
317321
return this;
318322
}
319323

324+
public TokenEndpointConfig restTemplateFactory(OAuth2RestTemplateFactory restTemplateFactory) {
325+
Assert.notNull(restTemplateFactory, "restTemplateFactory cannot be null");
326+
this.restTemplateFactory = restTemplateFactory;
327+
return this;
328+
}
329+
320330
/**
321331
* Returns the {@link OAuth2LoginConfigurer} for further configuration.
322332
*
@@ -325,6 +335,16 @@ public TokenEndpointConfig accessTokenResponseClient(
325335
public OAuth2LoginConfigurer<B> and() {
326336
return OAuth2LoginConfigurer.this;
327337
}
338+
339+
private OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest> getOrCreateAccessTokenResponseClient() {
340+
if (accessTokenResponseClient == null) {
341+
return restTemplateFactory == null
342+
? new DefaultAuthorizationCodeTokenResponseClient()
343+
: new DefaultAuthorizationCodeTokenResponseClient(restTemplateFactory);
344+
} else {
345+
return accessTokenResponseClient;
346+
}
347+
}
328348
}
329349

330350
/**
@@ -407,8 +427,10 @@ public class UserInfoEndpointConfig {
407427
private OAuth2UserService<OAuth2UserRequest, OAuth2User> userService;
408428
private OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService;
409429
private Map<String, Class<? extends OAuth2User>> customUserTypes = new HashMap<>();
430+
private OAuth2UserServiceRestTemplateFactory restTemplateFactory;
410431

411432
private UserInfoEndpointConfig() {
433+
this.restTemplateFactory = DefaultOAuth2UserServiceRestTemplateFactory.DEFAULT;
412434
}
413435

414436
/**
@@ -462,6 +484,12 @@ public UserInfoEndpointConfig userAuthoritiesMapper(GrantedAuthoritiesMapper use
462484
return this;
463485
}
464486

487+
public UserInfoEndpointConfig restTemplateFactory(OAuth2UserServiceRestTemplateFactory restTemplateFactory) {
488+
Assert.notNull(restTemplateFactory, "restTemplateFactory cannot be null");
489+
this.restTemplateFactory = restTemplateFactory;
490+
return this;
491+
}
492+
465493
/**
466494
* Returns the {@link OAuth2LoginConfigurer} for further configuration.
467495
*
@@ -501,10 +529,7 @@ public void init(B http) throws Exception {
501529
}
502530

503531
OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest> accessTokenResponseClient =
504-
this.tokenEndpointConfig.accessTokenResponseClient;
505-
if (accessTokenResponseClient == null) {
506-
accessTokenResponseClient = new DefaultAuthorizationCodeTokenResponseClient();
507-
}
532+
this.tokenEndpointConfig.getOrCreateAccessTokenResponseClient();
508533

509534
OAuth2UserService<OAuth2UserRequest, OAuth2User> oauth2UserService = getOAuth2UserService();
510535
OAuth2LoginAuthenticationProvider oauth2LoginAuthenticationProvider =
@@ -619,7 +644,7 @@ private OAuth2UserService<OidcUserRequest, OidcUser> getOidcUserService() {
619644
ResolvableType type = ResolvableType.forClassWithGenerics(OAuth2UserService.class, OidcUserRequest.class, OidcUser.class);
620645
OAuth2UserService<OidcUserRequest, OidcUser> bean = getBeanOrNull(type);
621646
if (bean == null) {
622-
return new OidcUserService();
647+
return new OidcUserService(userInfoEndpointConfig.restTemplateFactory);
623648
}
624649

625650
return bean;
@@ -634,11 +659,13 @@ private OAuth2UserService<OAuth2UserRequest, OAuth2User> getOAuth2UserService()
634659
if (bean == null) {
635660
if (!this.userInfoEndpointConfig.customUserTypes.isEmpty()) {
636661
List<OAuth2UserService<OAuth2UserRequest, OAuth2User>> userServices = new ArrayList<>();
637-
userServices.add(new CustomUserTypesOAuth2UserService(this.userInfoEndpointConfig.customUserTypes));
638-
userServices.add(new DefaultOAuth2UserService());
662+
userServices.add(new CustomUserTypesOAuth2UserService(
663+
this.userInfoEndpointConfig.customUserTypes,
664+
this.userInfoEndpointConfig.restTemplateFactory));
665+
userServices.add(new DefaultOAuth2UserService(this.userInfoEndpointConfig.restTemplateFactory));
639666
return new DelegatingOAuth2UserService<>(userServices);
640667
} else {
641-
return new DefaultOAuth2UserService();
668+
return new DefaultOAuth2UserService(this.userInfoEndpointConfig.restTemplateFactory);
642669
}
643670
}
644671

config/src/main/java/org/springframework/security/config/annotation/web/configurers/oauth2/server/resource/OAuth2ResourceServerConfigurer.java

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.springframework.security.oauth2.server.resource.authentication.OpaqueTokenAuthenticationProvider;
4141
import org.springframework.security.oauth2.server.resource.introspection.NimbusOpaqueTokenIntrospector;
4242
import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector;
43+
import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospectorRestTemplateFactory;
4344
import org.springframework.security.oauth2.server.resource.web.BearerTokenAuthenticationEntryPoint;
4445
import org.springframework.security.oauth2.server.resource.web.BearerTokenAuthenticationFilter;
4546
import org.springframework.security.oauth2.server.resource.web.BearerTokenResolver;
@@ -49,6 +50,7 @@
4950
import org.springframework.security.web.access.AccessDeniedHandler;
5051
import org.springframework.security.web.util.matcher.RequestMatcher;
5152
import org.springframework.util.Assert;
53+
import org.springframework.web.client.RestOperations;
5254

5355
import static org.springframework.security.oauth2.jwt.NimbusJwtDecoder.withJwkSetUri;
5456

@@ -283,6 +285,8 @@ public class JwtConfigurer {
283285

284286
private Converter<Jwt, ? extends AbstractAuthenticationToken> jwtAuthenticationConverter;
285287

288+
private RestOperations restOperations;
289+
286290
JwtConfigurer(ApplicationContext context) {
287291
this.context = context;
288292
}
@@ -299,7 +303,15 @@ public JwtConfigurer decoder(JwtDecoder decoder) {
299303
}
300304

301305
public JwtConfigurer jwkSetUri(String uri) {
302-
this.decoder = withJwkSetUri(uri).build();
306+
final NimbusJwtDecoder.JwkSetUriJwtDecoderBuilder builder = withJwkSetUri(uri);
307+
this.decoder = restOperations == null
308+
? builder.build()
309+
: builder.restOperations(restOperations).build();
310+
return this;
311+
}
312+
313+
public JwtConfigurer restOperations(RestOperations restOperations) {
314+
this.restOperations = restOperations;
303315
return this;
304316
}
305317

@@ -366,6 +378,7 @@ public class OpaqueTokenConfigurer {
366378
private String clientId;
367379
private String clientSecret;
368380
private Supplier<OpaqueTokenIntrospector> introspector;
381+
private OpaqueTokenIntrospectorRestTemplateFactory restTemplateFactory;
369382

370383
OpaqueTokenConfigurer(ApplicationContext context) {
371384
this.context = context;
@@ -380,8 +393,7 @@ public OpaqueTokenConfigurer authenticationManager(AuthenticationManager authent
380393
public OpaqueTokenConfigurer introspectionUri(String introspectionUri) {
381394
Assert.notNull(introspectionUri, "introspectionUri cannot be null");
382395
this.introspectionUri = introspectionUri;
383-
this.introspector = () ->
384-
new NimbusOpaqueTokenIntrospector(this.introspectionUri, this.clientId, this.clientSecret);
396+
this.introspector = createIntrospectorSupplier();
385397
return this;
386398
}
387399

@@ -390,11 +402,23 @@ public OpaqueTokenConfigurer introspectionClientCredentials(String clientId, Str
390402
Assert.notNull(clientSecret, "clientSecret cannot be null");
391403
this.clientId = clientId;
392404
this.clientSecret = clientSecret;
393-
this.introspector = () ->
394-
new NimbusOpaqueTokenIntrospector(this.introspectionUri, this.clientId, this.clientSecret);
405+
this.introspector = createIntrospectorSupplier();
395406
return this;
396407
}
397408

409+
public OpaqueTokenConfigurer restTemplateFactory(OpaqueTokenIntrospectorRestTemplateFactory restTemplateFactory) {
410+
Assert.notNull(restTemplateFactory, "restTemplateFactory cannot be null");
411+
this.restTemplateFactory = restTemplateFactory;
412+
this.introspector = createIntrospectorSupplier();
413+
return this;
414+
}
415+
416+
private Supplier<OpaqueTokenIntrospector> createIntrospectorSupplier() {
417+
return () -> restTemplateFactory == null
418+
? new NimbusOpaqueTokenIntrospector(this.introspectionUri, this.clientId, this.clientSecret)
419+
: new NimbusOpaqueTokenIntrospector(this.introspectionUri, this.clientId, this.clientSecret, restTemplateFactory);
420+
}
421+
398422
public OpaqueTokenConfigurer introspector(OpaqueTokenIntrospector introspector) {
399423
Assert.notNull(introspector, "introspector cannot be null");
400424
this.introspector = () -> introspector;

config/src/main/java/org/springframework/security/config/annotation/web/reactive/ReactiveOAuth2ClientImportSelector.java

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424
import org.springframework.security.oauth2.client.ReactiveOAuth2AuthorizedClientProviderBuilder;
2525
import org.springframework.security.oauth2.client.ReactiveOAuth2AuthorizedClientService;
2626
import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository;
27+
import org.springframework.security.oauth2.client.web.DefaultReactiveOAuth2AuthorizedClientManager;
2728
import org.springframework.security.oauth2.client.web.reactive.result.method.annotation.OAuth2AuthorizedClientArgumentResolver;
2829
import org.springframework.security.oauth2.client.web.server.AuthenticatedPrincipalServerOAuth2AuthorizedClientRepository;
29-
import org.springframework.security.oauth2.client.web.DefaultReactiveOAuth2AuthorizedClientManager;
3030
import org.springframework.security.oauth2.client.web.server.ServerOAuth2AuthorizedClientRepository;
3131
import org.springframework.util.ClassUtils;
3232
import org.springframework.web.reactive.config.WebFluxConfigurer;
@@ -63,15 +63,19 @@ static class OAuth2ClientWebFluxSecurityConfiguration implements WebFluxConfigur
6363

6464
private ReactiveOAuth2AuthorizedClientService authorizedClientService;
6565

66+
private ReactiveOAuth2AuthorizedClientProviderBuilder.RefreshTokenGrantBuilderCustomizer refreshTokenGrantBuilderCustomizer;
67+
private ReactiveOAuth2AuthorizedClientProviderBuilder.ClientCredentialsGrantBuilderCustomizer clientCredentialsGrantBuilderCustomizer;
68+
private ReactiveOAuth2AuthorizedClientProviderBuilder.PasswordGrantBuilderCustomizer passwordGrantBuilderCustomizer;
69+
6670
@Override
6771
public void configureArgumentResolvers(ArgumentResolverConfigurer configurer) {
6872
if (this.authorizedClientRepository != null && this.clientRegistrationRepository != null) {
6973
ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider =
7074
ReactiveOAuth2AuthorizedClientProviderBuilder.builder()
7175
.authorizationCode()
72-
.refreshToken()
73-
.clientCredentials()
74-
.password()
76+
.refreshToken(refreshTokenGrantBuilderCustomizer)
77+
.clientCredentials(clientCredentialsGrantBuilderCustomizer)
78+
.password(passwordGrantBuilderCustomizer)
7579
.build();
7680
DefaultReactiveOAuth2AuthorizedClientManager authorizedClientManager = new DefaultReactiveOAuth2AuthorizedClientManager(
7781
this.clientRegistrationRepository, getAuthorizedClientRepository());
@@ -98,6 +102,27 @@ public void setAuthorizedClientService(List<ReactiveOAuth2AuthorizedClientServic
98102
}
99103
}
100104

105+
@Autowired(required = false)
106+
public void setRefreshTokenGrantBuilderCustomizer(List<ReactiveOAuth2AuthorizedClientProviderBuilder.RefreshTokenGrantBuilderCustomizer> beans) {
107+
if (beans.size() == 1) {
108+
this.refreshTokenGrantBuilderCustomizer = beans.get(0);
109+
}
110+
}
111+
112+
@Autowired(required = false)
113+
public void setClientCredentialsGrantBuilderCustomizer(List<ReactiveOAuth2AuthorizedClientProviderBuilder.ClientCredentialsGrantBuilderCustomizer> beans) {
114+
if (beans.size() == 1) {
115+
this.clientCredentialsGrantBuilderCustomizer = beans.get(0);
116+
}
117+
}
118+
119+
@Autowired(required = false)
120+
public void setPasswordGrantBuilderCustomizer(List<ReactiveOAuth2AuthorizedClientProviderBuilder.PasswordGrantBuilderCustomizer> beans) {
121+
if (beans.size() == 1) {
122+
this.passwordGrantBuilderCustomizer = beans.get(0);
123+
}
124+
}
125+
101126
private ServerOAuth2AuthorizedClientRepository getAuthorizedClientRepository() {
102127
if (this.authorizedClientRepository != null) {
103128
return this.authorizedClientRepository;

0 commit comments

Comments
 (0)