Skip to content

Commit d6382b8

Browse files
committed
Configure token-exchange via a bean
Issue gh-5199 Issue gh-11783 Closes gh-14701
1 parent 85c3d0a commit d6382b8

File tree

6 files changed

+208
-2
lines changed

6 files changed

+208
-2
lines changed

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

+29-1
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,13 @@
5151
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProvider;
5252
import org.springframework.security.oauth2.client.PasswordOAuth2AuthorizedClientProvider;
5353
import org.springframework.security.oauth2.client.RefreshTokenOAuth2AuthorizedClientProvider;
54+
import org.springframework.security.oauth2.client.TokenExchangeOAuth2AuthorizedClientProvider;
5455
import org.springframework.security.oauth2.client.endpoint.JwtBearerGrantRequest;
5556
import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient;
5657
import org.springframework.security.oauth2.client.endpoint.OAuth2ClientCredentialsGrantRequest;
5758
import org.springframework.security.oauth2.client.endpoint.OAuth2PasswordGrantRequest;
5859
import org.springframework.security.oauth2.client.endpoint.OAuth2RefreshTokenGrantRequest;
60+
import org.springframework.security.oauth2.client.endpoint.TokenExchangeGrantRequest;
5961
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
6062
import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizedClientManager;
6163
import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository;
@@ -183,7 +185,8 @@ static final class OAuth2AuthorizedClientManagerRegistrar
183185
RefreshTokenOAuth2AuthorizedClientProvider.class,
184186
ClientCredentialsOAuth2AuthorizedClientProvider.class,
185187
PasswordOAuth2AuthorizedClientProvider.class,
186-
JwtBearerOAuth2AuthorizedClientProvider.class
188+
JwtBearerOAuth2AuthorizedClientProvider.class,
189+
TokenExchangeOAuth2AuthorizedClientProvider.class
187190
);
188191
// @formatter:on
189192

@@ -255,6 +258,12 @@ OAuth2AuthorizedClientManager getAuthorizedClientManager() {
255258
authorizedClientProviders.add(jwtBearerAuthorizedClientProvider);
256259
}
257260

261+
OAuth2AuthorizedClientProvider tokenExchangeAuthorizedClientProvider = getTokenExchangeAuthorizedClientProvider(
262+
authorizedClientProviderBeans);
263+
if (tokenExchangeAuthorizedClientProvider != null) {
264+
authorizedClientProviders.add(tokenExchangeAuthorizedClientProvider);
265+
}
266+
258267
authorizedClientProviders.addAll(getAdditionalAuthorizedClientProviders(authorizedClientProviderBeans));
259268
authorizedClientProvider = new DelegatingOAuth2AuthorizedClientProvider(authorizedClientProviders);
260269
}
@@ -364,6 +373,25 @@ private OAuth2AuthorizedClientProvider getJwtBearerAuthorizedClientProvider(
364373
return authorizedClientProvider;
365374
}
366375

376+
private OAuth2AuthorizedClientProvider getTokenExchangeAuthorizedClientProvider(
377+
Collection<OAuth2AuthorizedClientProvider> authorizedClientProviders) {
378+
TokenExchangeOAuth2AuthorizedClientProvider authorizedClientProvider = getAuthorizedClientProviderByType(
379+
authorizedClientProviders, TokenExchangeOAuth2AuthorizedClientProvider.class);
380+
381+
OAuth2AccessTokenResponseClient<TokenExchangeGrantRequest> accessTokenResponseClient = getBeanOfType(
382+
ResolvableType.forClassWithGenerics(OAuth2AccessTokenResponseClient.class,
383+
TokenExchangeGrantRequest.class));
384+
if (accessTokenResponseClient != null) {
385+
if (authorizedClientProvider == null) {
386+
authorizedClientProvider = new TokenExchangeOAuth2AuthorizedClientProvider();
387+
}
388+
389+
authorizedClientProvider.setAccessTokenResponseClient(accessTokenResponseClient);
390+
}
391+
392+
return authorizedClientProvider;
393+
}
394+
367395
private List<OAuth2AuthorizedClientProvider> getAdditionalAuthorizedClientProviders(
368396
Collection<OAuth2AuthorizedClientProvider> authorizedClientProviders) {
369397
List<OAuth2AuthorizedClientProvider> additionalAuthorizedClientProviders = new ArrayList<>(

Diff for: config/src/main/java/org/springframework/security/config/http/OAuth2AuthorizedClientManagerRegistrar.java

+29-1
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,13 @@
4444
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProvider;
4545
import org.springframework.security.oauth2.client.PasswordOAuth2AuthorizedClientProvider;
4646
import org.springframework.security.oauth2.client.RefreshTokenOAuth2AuthorizedClientProvider;
47+
import org.springframework.security.oauth2.client.TokenExchangeOAuth2AuthorizedClientProvider;
4748
import org.springframework.security.oauth2.client.endpoint.JwtBearerGrantRequest;
4849
import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient;
4950
import org.springframework.security.oauth2.client.endpoint.OAuth2ClientCredentialsGrantRequest;
5051
import org.springframework.security.oauth2.client.endpoint.OAuth2PasswordGrantRequest;
5152
import org.springframework.security.oauth2.client.endpoint.OAuth2RefreshTokenGrantRequest;
53+
import org.springframework.security.oauth2.client.endpoint.TokenExchangeGrantRequest;
5254
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
5355
import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizedClientManager;
5456
import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository;
@@ -76,7 +78,8 @@ final class OAuth2AuthorizedClientManagerRegistrar implements BeanDefinitionRegi
7678
RefreshTokenOAuth2AuthorizedClientProvider.class,
7779
ClientCredentialsOAuth2AuthorizedClientProvider.class,
7880
PasswordOAuth2AuthorizedClientProvider.class,
79-
JwtBearerOAuth2AuthorizedClientProvider.class
81+
JwtBearerOAuth2AuthorizedClientProvider.class,
82+
TokenExchangeOAuth2AuthorizedClientProvider.class
8083
);
8184
// @formatter:on
8285

@@ -137,6 +140,12 @@ private OAuth2AuthorizedClientManager getAuthorizedClientManager() {
137140
authorizedClientProviders.add(jwtBearerAuthorizedClientProvider);
138141
}
139142

143+
OAuth2AuthorizedClientProvider tokenExchangeAuthorizedClientProvider = getTokenExchangeAuthorizedClientProvider(
144+
authorizedClientProviderBeans);
145+
if (tokenExchangeAuthorizedClientProvider != null) {
146+
authorizedClientProviders.add(tokenExchangeAuthorizedClientProvider);
147+
}
148+
140149
authorizedClientProviders.addAll(getAdditionalAuthorizedClientProviders(authorizedClientProviderBeans));
141150
authorizedClientProvider = new DelegatingOAuth2AuthorizedClientProvider(authorizedClientProviders);
142151
}
@@ -245,6 +254,25 @@ private OAuth2AuthorizedClientProvider getJwtBearerAuthorizedClientProvider(
245254
return authorizedClientProvider;
246255
}
247256

257+
private OAuth2AuthorizedClientProvider getTokenExchangeAuthorizedClientProvider(
258+
Collection<OAuth2AuthorizedClientProvider> authorizedClientProviders) {
259+
TokenExchangeOAuth2AuthorizedClientProvider authorizedClientProvider = getAuthorizedClientProviderByType(
260+
authorizedClientProviders, TokenExchangeOAuth2AuthorizedClientProvider.class);
261+
262+
OAuth2AccessTokenResponseClient<TokenExchangeGrantRequest> accessTokenResponseClient = getBeanOfType(
263+
ResolvableType.forClassWithGenerics(OAuth2AccessTokenResponseClient.class,
264+
TokenExchangeGrantRequest.class));
265+
if (accessTokenResponseClient != null) {
266+
if (authorizedClientProvider == null) {
267+
authorizedClientProvider = new TokenExchangeOAuth2AuthorizedClientProvider();
268+
}
269+
270+
authorizedClientProvider.setAccessTokenResponseClient(accessTokenResponseClient);
271+
}
272+
273+
return authorizedClientProvider;
274+
}
275+
248276
private List<OAuth2AuthorizedClientProvider> getAdditionalAuthorizedClientProviders(
249277
Collection<OAuth2AuthorizedClientProvider> authorizedClientProviders) {
250278
List<OAuth2AuthorizedClientProvider> additionalAuthorizedClientProviders = new ArrayList<>(

Diff for: config/src/test/java/org/springframework/security/config/annotation/web/configuration/OAuth2AuthorizedClientManagerConfigurationTests.java

+73
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,15 @@
5252
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager;
5353
import org.springframework.security.oauth2.client.PasswordOAuth2AuthorizedClientProvider;
5454
import org.springframework.security.oauth2.client.RefreshTokenOAuth2AuthorizedClientProvider;
55+
import org.springframework.security.oauth2.client.TokenExchangeOAuth2AuthorizedClientProvider;
5556
import org.springframework.security.oauth2.client.endpoint.AbstractOAuth2AuthorizationGrantRequest;
5657
import org.springframework.security.oauth2.client.endpoint.JwtBearerGrantRequest;
5758
import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient;
5859
import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest;
5960
import org.springframework.security.oauth2.client.endpoint.OAuth2ClientCredentialsGrantRequest;
6061
import org.springframework.security.oauth2.client.endpoint.OAuth2PasswordGrantRequest;
6162
import org.springframework.security.oauth2.client.endpoint.OAuth2RefreshTokenGrantRequest;
63+
import org.springframework.security.oauth2.client.endpoint.TokenExchangeGrantRequest;
6264
import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserRequest;
6365
import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService;
6466
import org.springframework.security.oauth2.client.registration.ClientRegistration;
@@ -70,6 +72,7 @@
7072
import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizedClientManager;
7173
import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository;
7274
import org.springframework.security.oauth2.core.AuthorizationGrantType;
75+
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
7376
import org.springframework.security.oauth2.core.OAuth2AccessToken;
7477
import org.springframework.security.oauth2.core.OAuth2AuthorizationException;
7578
import org.springframework.security.oauth2.core.OAuth2Error;
@@ -327,6 +330,47 @@ private void testJwtBearerGrant() {
327330
assertThat(grantRequest.getJwt().getSubject()).isEqualTo("user");
328331
}
329332

333+
@Test
334+
public void authorizeWhenTokenExchangeAccessTokenResponseClientBeanThenUsed() {
335+
this.spring.register(CustomAccessTokenResponseClientsConfig.class).autowire();
336+
testTokenExchangeGrant();
337+
}
338+
339+
@Test
340+
public void authorizeWhenTokenExchangeAuthorizedClientProviderBeanThenUsed() {
341+
this.spring.register(CustomAuthorizedClientProvidersConfig.class).autowire();
342+
testTokenExchangeGrant();
343+
}
344+
345+
private void testTokenExchangeGrant() {
346+
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse().build();
347+
given(MOCK_RESPONSE_CLIENT.getTokenResponse(any(TokenExchangeGrantRequest.class)))
348+
.willReturn(accessTokenResponse);
349+
350+
JwtAuthenticationToken authentication = new JwtAuthenticationToken(getJwt());
351+
ClientRegistration clientRegistration = this.clientRegistrationRepository.findByRegistrationId("auth0");
352+
// @formatter:off
353+
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
354+
.withClientRegistrationId(clientRegistration.getRegistrationId())
355+
.principal(authentication)
356+
.attribute(HttpServletRequest.class.getName(), this.request)
357+
.attribute(HttpServletResponse.class.getName(), this.response)
358+
.build();
359+
// @formatter:on
360+
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(authorizeRequest);
361+
assertThat(authorizedClient).isNotNull();
362+
363+
ArgumentCaptor<TokenExchangeGrantRequest> grantRequestCaptor = ArgumentCaptor
364+
.forClass(TokenExchangeGrantRequest.class);
365+
verify(MOCK_RESPONSE_CLIENT).getTokenResponse(grantRequestCaptor.capture());
366+
367+
TokenExchangeGrantRequest grantRequest = grantRequestCaptor.getValue();
368+
assertThat(grantRequest.getClientRegistration().getRegistrationId())
369+
.isEqualTo(clientRegistration.getRegistrationId());
370+
assertThat(grantRequest.getGrantType()).isEqualTo(AuthorizationGrantType.TOKEN_EXCHANGE);
371+
assertThat(grantRequest.getSubjectToken()).isEqualTo(authentication.getToken());
372+
}
373+
330374
private static OAuth2AccessToken getExpiredAccessToken() {
331375
Instant expiresAt = Instant.now().minusSeconds(60);
332376
Instant issuedAt = expiresAt.minus(Duration.ofDays(1));
@@ -376,6 +420,11 @@ OAuth2AccessTokenResponseClient<JwtBearerGrantRequest> jwtBearerTokenResponseCli
376420
return new MockJwtBearerClient();
377421
}
378422

423+
@Bean
424+
OAuth2AccessTokenResponseClient<TokenExchangeGrantRequest> tokenExchangeTokenResponseClient() {
425+
return new MockTokenExchangeClient();
426+
}
427+
379428
@Bean
380429
OAuth2UserService<OAuth2UserRequest, OAuth2User> oauth2UserService() {
381430
return mock(DefaultOAuth2UserService.class);
@@ -425,6 +474,13 @@ JwtBearerOAuth2AuthorizedClientProvider jwtBearerAuthorizedClientProvider() {
425474
return authorizedClientProvider;
426475
}
427476

477+
@Bean
478+
TokenExchangeOAuth2AuthorizedClientProvider tokenExchangeAuthorizedClientProvider() {
479+
TokenExchangeOAuth2AuthorizedClientProvider authorizedClientProvider = new TokenExchangeOAuth2AuthorizedClientProvider();
480+
authorizedClientProvider.setAccessTokenResponseClient(new MockTokenExchangeClient());
481+
return authorizedClientProvider;
482+
}
483+
428484
}
429485

430486
abstract static class OAuth2ClientBaseConfig {
@@ -463,6 +519,14 @@ ClientRegistrationRepository clientRegistrationRepository() {
463519
.clientId("okta-client-id")
464520
.clientSecret("okta-client-secret")
465521
.authorizationGrantType(AuthorizationGrantType.JWT_BEARER)
522+
.build(),
523+
ClientRegistration.withRegistrationId("auth0")
524+
.clientName("Auth0")
525+
.clientId("auth0-client-id")
526+
.clientSecret("auth0-client-secret")
527+
.clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC)
528+
.authorizationGrantType(AuthorizationGrantType.TOKEN_EXCHANGE)
529+
.scope("user.read", "user.write")
466530
.build()));
467531
// @formatter:on
468532
}
@@ -544,4 +608,13 @@ public OAuth2AccessTokenResponse getTokenResponse(JwtBearerGrantRequest authoriz
544608

545609
}
546610

611+
private static class MockTokenExchangeClient implements OAuth2AccessTokenResponseClient<TokenExchangeGrantRequest> {
612+
613+
@Override
614+
public OAuth2AccessTokenResponse getTokenResponse(TokenExchangeGrantRequest authorizationGrantRequest) {
615+
return MOCK_RESPONSE_CLIENT.getTokenResponse(authorizationGrantRequest);
616+
}
617+
618+
}
619+
547620
}

Diff for: config/src/test/java/org/springframework/security/config/http/OAuth2AuthorizedClientManagerRegistrarTests.java

+71
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,21 @@
4949
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager;
5050
import org.springframework.security.oauth2.client.PasswordOAuth2AuthorizedClientProvider;
5151
import org.springframework.security.oauth2.client.RefreshTokenOAuth2AuthorizedClientProvider;
52+
import org.springframework.security.oauth2.client.TokenExchangeOAuth2AuthorizedClientProvider;
5253
import org.springframework.security.oauth2.client.endpoint.AbstractOAuth2AuthorizationGrantRequest;
5354
import org.springframework.security.oauth2.client.endpoint.JwtBearerGrantRequest;
5455
import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient;
5556
import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest;
5657
import org.springframework.security.oauth2.client.endpoint.OAuth2ClientCredentialsGrantRequest;
5758
import org.springframework.security.oauth2.client.endpoint.OAuth2PasswordGrantRequest;
5859
import org.springframework.security.oauth2.client.endpoint.OAuth2RefreshTokenGrantRequest;
60+
import org.springframework.security.oauth2.client.endpoint.TokenExchangeGrantRequest;
5961
import org.springframework.security.oauth2.client.registration.ClientRegistration;
6062
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
6163
import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizedClientManager;
6264
import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository;
6365
import org.springframework.security.oauth2.core.AuthorizationGrantType;
66+
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
6467
import org.springframework.security.oauth2.core.OAuth2AccessToken;
6568
import org.springframework.security.oauth2.core.OAuth2AuthorizationException;
6669
import org.springframework.security.oauth2.core.OAuth2Error;
@@ -316,6 +319,47 @@ private void testJwtBearerGrant() {
316319
assertThat(grantRequest.getJwt().getSubject()).isEqualTo("user");
317320
}
318321

322+
@Test
323+
public void authorizeWhenTokenExchangeAccessTokenResponseClientBeanThenUsed() {
324+
this.spring.configLocations(xml("clients")).autowire();
325+
testTokenExchangeGrant();
326+
}
327+
328+
@Test
329+
public void authorizeWhenTokenExchangeAuthorizedClientProviderBeanThenUsed() {
330+
this.spring.configLocations(xml("providers")).autowire();
331+
testTokenExchangeGrant();
332+
}
333+
334+
private void testTokenExchangeGrant() {
335+
OAuth2AccessTokenResponse accessTokenResponse = TestOAuth2AccessTokenResponses.accessTokenResponse().build();
336+
given(MOCK_RESPONSE_CLIENT.getTokenResponse(any(TokenExchangeGrantRequest.class)))
337+
.willReturn(accessTokenResponse);
338+
339+
JwtAuthenticationToken authentication = new JwtAuthenticationToken(getJwt());
340+
ClientRegistration clientRegistration = this.clientRegistrationRepository.findByRegistrationId("auth0");
341+
// @formatter:off
342+
OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest
343+
.withClientRegistrationId(clientRegistration.getRegistrationId())
344+
.principal(authentication)
345+
.attribute(HttpServletRequest.class.getName(), this.request)
346+
.attribute(HttpServletResponse.class.getName(), this.response)
347+
.build();
348+
// @formatter:on
349+
OAuth2AuthorizedClient authorizedClient = this.authorizedClientManager.authorize(authorizeRequest);
350+
assertThat(authorizedClient).isNotNull();
351+
352+
ArgumentCaptor<TokenExchangeGrantRequest> grantRequestCaptor = ArgumentCaptor
353+
.forClass(TokenExchangeGrantRequest.class);
354+
verify(MOCK_RESPONSE_CLIENT).getTokenResponse(grantRequestCaptor.capture());
355+
356+
TokenExchangeGrantRequest grantRequest = grantRequestCaptor.getValue();
357+
assertThat(grantRequest.getClientRegistration().getRegistrationId())
358+
.isEqualTo(clientRegistration.getRegistrationId());
359+
assertThat(grantRequest.getGrantType()).isEqualTo(AuthorizationGrantType.TOKEN_EXCHANGE);
360+
assertThat(grantRequest.getSubjectToken()).isEqualTo(authentication.getToken());
361+
}
362+
319363
private static OAuth2AccessToken getExpiredAccessToken() {
320364
Instant expiresAt = Instant.now().minusSeconds(60);
321365
Instant issuedAt = expiresAt.minus(Duration.ofDays(1));
@@ -356,6 +400,14 @@ public static List<ClientRegistration> getClientRegistrations() {
356400
.clientId("okta-client-id")
357401
.clientSecret("okta-client-secret")
358402
.authorizationGrantType(AuthorizationGrantType.JWT_BEARER)
403+
.build(),
404+
ClientRegistration.withRegistrationId("auth0")
405+
.clientName("Auth0")
406+
.clientId("auth0-client-id")
407+
.clientSecret("auth0-client-secret")
408+
.clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC)
409+
.authorizationGrantType(AuthorizationGrantType.TOKEN_EXCHANGE)
410+
.scope("user.read", "user.write")
359411
.build());
360412
// @formatter:on
361413
}
@@ -422,6 +474,16 @@ public static OAuth2AccessTokenResponseClient<JwtBearerGrantRequest> jwtBearerAc
422474
return new MockJwtBearerClient();
423475
}
424476

477+
public static TokenExchangeOAuth2AuthorizedClientProvider tokenExchangeAuthorizedClientProvider() {
478+
TokenExchangeOAuth2AuthorizedClientProvider authorizedClientProvider = new TokenExchangeOAuth2AuthorizedClientProvider();
479+
authorizedClientProvider.setAccessTokenResponseClient(tokenExchangeAccessTokenResponseClient());
480+
return authorizedClientProvider;
481+
}
482+
483+
public static OAuth2AccessTokenResponseClient<TokenExchangeGrantRequest> tokenExchangeAccessTokenResponseClient() {
484+
return new MockTokenExchangeClient();
485+
}
486+
425487
private static class MockAuthorizationCodeClient
426488
implements OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest> {
427489

@@ -472,4 +534,13 @@ public OAuth2AccessTokenResponse getTokenResponse(JwtBearerGrantRequest authoriz
472534

473535
}
474536

537+
private static class MockTokenExchangeClient implements OAuth2AccessTokenResponseClient<TokenExchangeGrantRequest> {
538+
539+
@Override
540+
public OAuth2AccessTokenResponse getTokenResponse(TokenExchangeGrantRequest authorizationGrantRequest) {
541+
return MOCK_RESPONSE_CLIENT.getTokenResponse(authorizationGrantRequest);
542+
}
543+
544+
}
545+
475546
}

Diff for: config/src/test/resources/org/springframework/security/config/http/OAuth2AuthorizedClientManagerRegistrarTests-clients.xml

+3
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,7 @@
5353
<b:bean class="org.springframework.security.config.http.OAuth2AuthorizedClientManagerRegistrarTests"
5454
factory-method="jwtBearerAccessTokenResponseClient"/>
5555

56+
<b:bean class="org.springframework.security.config.http.OAuth2AuthorizedClientManagerRegistrarTests"
57+
factory-method="tokenExchangeAccessTokenResponseClient"/>
58+
5659
</b:beans>

Diff for: config/src/test/resources/org/springframework/security/config/http/OAuth2AuthorizedClientManagerRegistrarTests-providers.xml

+3
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,7 @@
5656
<b:bean class="org.springframework.security.config.http.OAuth2AuthorizedClientManagerRegistrarTests"
5757
factory-method="jwtBearerAuthorizedClientProvider"/>
5858

59+
<b:bean class="org.springframework.security.config.http.OAuth2AuthorizedClientManagerRegistrarTests"
60+
factory-method="tokenExchangeAuthorizedClientProvider"/>
61+
5962
</b:beans>

0 commit comments

Comments
 (0)