Skip to content

Commit dab6950

Browse files
committed
Move parametersCustomizer
The parametersCustomizer was introduced in 6.4.0-M4 with DefaultOAuth2TokenRequestParametersConverter. However, it cannot be applied to all parameters and so does not fully solve gh-11298. This commit moves the customizer to the abstract class so it can be applied to all parameters. Closes gh-15939
1 parent af2b842 commit dab6950

14 files changed

+153
-47
lines changed

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/endpoint/AbstractRestClientOAuth2AccessTokenResponseClient.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.security.oauth2.client.endpoint;
1818

19+
import java.util.function.Consumer;
20+
1921
import org.springframework.core.convert.converter.Converter;
2022
import org.springframework.http.HttpHeaders;
2123
import org.springframework.http.converter.FormHttpMessageConverter;
@@ -76,6 +78,9 @@ public abstract class AbstractRestClientOAuth2AccessTokenResponseClient<T extend
7678

7779
private Converter<T, MultiValueMap<String, String>> parametersConverter = new DefaultOAuth2TokenRequestParametersConverter<>();
7880

81+
private Consumer<MultiValueMap<String, String>> parametersCustomizer = (parameters) -> {
82+
};
83+
7984
AbstractRestClientOAuth2AccessTokenResponseClient() {
8085
}
8186

@@ -127,6 +132,7 @@ private RequestHeadersSpec<?> populateRequest(T grantRequest) {
127132
if (parameters == null) {
128133
parameters = new LinkedMultiValueMap<>();
129134
}
135+
this.parametersCustomizer.accept(parameters);
130136

131137
return this.restClient.post()
132138
.uri(grantRequest.getClientRegistration().getProviderDetails().getTokenUri())
@@ -243,4 +249,14 @@ public final void addParametersConverter(Converter<T, MultiValueMap<String, Stri
243249
this.requestEntityConverter = this::populateRequest;
244250
}
245251

252+
/**
253+
* Sets the {@link Consumer} used for customizing the OAuth 2.0 Access Token
254+
* parameters, which allows for parameters to be added, overwritten or removed.
255+
* @param parametersCustomizer the {@link Consumer} to customize the parameters
256+
*/
257+
public void setParametersCustomizer(Consumer<MultiValueMap<String, String>> parametersCustomizer) {
258+
Assert.notNull(parametersCustomizer, "parametersCustomizer cannot be null");
259+
this.parametersCustomizer = parametersCustomizer;
260+
}
261+
246262
}

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/endpoint/AbstractWebClientReactiveOAuth2AccessTokenResponseClient.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.security.oauth2.client.endpoint;
1818

19+
import java.util.function.Consumer;
20+
1921
import reactor.core.publisher.Mono;
2022

2123
import org.springframework.core.convert.converter.Converter;
@@ -68,6 +70,9 @@ public abstract class AbstractWebClientReactiveOAuth2AccessTokenResponseClient<T
6870

6971
private Converter<T, MultiValueMap<String, String>> parametersConverter = new DefaultOAuth2TokenRequestParametersConverter<>();
7072

73+
private Consumer<MultiValueMap<String, String>> parametersCustomizer = (parameters) -> {
74+
};
75+
7176
private BodyExtractor<Mono<OAuth2AccessTokenResponse>, ReactiveHttpInputMessage> bodyExtractor = OAuth2BodyExtractors
7277
.oauth2AccessTokenResponse();
7378

@@ -108,6 +113,7 @@ private RequestHeadersSpec<?> populateRequest(T grantRequest) {
108113
if (parameters == null) {
109114
parameters = new LinkedMultiValueMap<>();
110115
}
116+
this.parametersCustomizer.accept(parameters);
111117

112118
return this.webClient.post()
113119
.uri(grantRequest.getClientRegistration().getProviderDetails().getTokenUri())
@@ -228,6 +234,16 @@ public final void addParametersConverter(Converter<T, MultiValueMap<String, Stri
228234
this.requestEntityConverter = this::populateRequest;
229235
}
230236

237+
/**
238+
* Sets the {@link Consumer} used for customizing the OAuth 2.0 Access Token
239+
* parameters, which allows for parameters to be added, overwritten or removed.
240+
* @param parametersCustomizer the {@link Consumer} to customize the parameters
241+
*/
242+
public void setParametersCustomizer(Consumer<MultiValueMap<String, String>> parametersCustomizer) {
243+
Assert.notNull(parametersCustomizer, "parametersCustomizer cannot be null");
244+
this.parametersCustomizer = parametersCustomizer;
245+
}
246+
231247
/**
232248
* Sets the {@link BodyExtractor} that will be used to decode the
233249
* {@link OAuth2AccessTokenResponse}

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/endpoint/DefaultOAuth2TokenRequestParametersConverter.java

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,10 @@
1616

1717
package org.springframework.security.oauth2.client.endpoint;
1818

19-
import java.util.function.Consumer;
20-
2119
import org.springframework.core.convert.converter.Converter;
2220
import org.springframework.security.oauth2.client.registration.ClientRegistration;
2321
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
2422
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
25-
import org.springframework.util.Assert;
2623
import org.springframework.util.LinkedMultiValueMap;
2724
import org.springframework.util.MultiValueMap;
2825

@@ -64,19 +61,6 @@ public final class DefaultOAuth2TokenRequestParametersConverter<T extends Abstra
6461

6562
private final Converter<T, MultiValueMap<String, String>> defaultParametersConverter = createDefaultParametersConverter();
6663

67-
private Consumer<MultiValueMap<String, String>> parametersCustomizer = (parameters) -> {
68-
};
69-
70-
/**
71-
* Sets the {@link Consumer} used for customizing the OAuth 2.0 Access Token
72-
* parameters, which allows for parameters to be added, overwritten or removed.
73-
* @param parametersCustomizer the {@link Consumer} to customize the parameters
74-
*/
75-
public void setParametersCustomizer(Consumer<MultiValueMap<String, String>> parametersCustomizer) {
76-
Assert.notNull(parametersCustomizer, "parametersCustomizer cannot be null");
77-
this.parametersCustomizer = parametersCustomizer;
78-
}
79-
8064
@Override
8165
public MultiValueMap<String, String> convert(T grantRequest) {
8266
ClientRegistration clientRegistration = grantRequest.getClientRegistration();
@@ -95,7 +79,6 @@ public MultiValueMap<String, String> convert(T grantRequest) {
9579
parameters.addAll(defaultParameters);
9680
}
9781

98-
this.parametersCustomizer.accept(parameters);
9982
return parameters;
10083
}
10184

oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/endpoint/RestClientAuthorizationCodeTokenResponseClientTests.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,15 @@ public void addParametersConverterWhenNullThenThrowIllegalArgumentException() {
154154
// @formatter:on
155155
}
156156

157+
@Test
158+
public void setParametersCustomizerWhenNullThenThrowIllegalArgumentException() {
159+
// @formatter:off
160+
assertThatIllegalArgumentException()
161+
.isThrownBy(() -> this.tokenResponseClient.setParametersCustomizer(null))
162+
.withMessage("parametersCustomizer cannot be null");
163+
// @formatter:on
164+
}
165+
157166
@Test
158167
public void getTokenResponseWhenGrantRequestIsNullThenThrowIllegalArgumentException() {
159168
// @formatter:off
@@ -439,12 +448,7 @@ public void getTokenResponseWhenParametersCustomizerSetThenCalled() throws Excep
439448
OAuth2AuthorizationCodeGrantRequest grantRequest = new OAuth2AuthorizationCodeGrantRequest(clientRegistration,
440449
this.authorizationExchange);
441450
Consumer<MultiValueMap<String, String>> parametersCustomizer = mock();
442-
// @formatter:off
443-
DefaultOAuth2TokenRequestParametersConverter<OAuth2AuthorizationCodeGrantRequest> parametersConverter =
444-
new DefaultOAuth2TokenRequestParametersConverter<>();
445-
// @formatter:on
446-
parametersConverter.setParametersCustomizer(parametersCustomizer);
447-
this.tokenResponseClient.setParametersConverter(parametersConverter);
451+
this.tokenResponseClient.setParametersCustomizer(parametersCustomizer);
448452
this.tokenResponseClient.getTokenResponse(grantRequest);
449453
verify(parametersCustomizer).accept(any());
450454
}

oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/endpoint/RestClientClientCredentialsTokenResponseClientTests.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,15 @@ public void addParametersConverterWhenNullThenThrowIllegalArgumentException() {
138138
// @formatter:on
139139
}
140140

141+
@Test
142+
public void setParametersCustomizerWhenNullThenThrowIllegalArgumentException() {
143+
// @formatter:off
144+
assertThatIllegalArgumentException()
145+
.isThrownBy(() -> this.tokenResponseClient.setParametersCustomizer(null))
146+
.withMessage("parametersCustomizer cannot be null");
147+
// @formatter:on
148+
}
149+
141150
@Test
142151
public void getTokenResponseWhenGrantRequestIsNullThenThrowIllegalArgumentException() {
143152
// @formatter:off
@@ -438,12 +447,7 @@ public void getTokenResponseWhenParametersCustomizerSetThenCalled() throws Excep
438447
ClientRegistration clientRegistration = this.clientRegistration.build();
439448
OAuth2ClientCredentialsGrantRequest grantRequest = new OAuth2ClientCredentialsGrantRequest(clientRegistration);
440449
Consumer<MultiValueMap<String, String>> parametersCustomizer = mock();
441-
// @formatter:off
442-
DefaultOAuth2TokenRequestParametersConverter<OAuth2ClientCredentialsGrantRequest> parametersConverter =
443-
new DefaultOAuth2TokenRequestParametersConverter<>();
444-
// @formatter:on
445-
parametersConverter.setParametersCustomizer(parametersCustomizer);
446-
this.tokenResponseClient.setParametersConverter(parametersConverter);
450+
this.tokenResponseClient.setParametersCustomizer(parametersCustomizer);
447451
this.tokenResponseClient.getTokenResponse(grantRequest);
448452
verify(parametersCustomizer).accept(any());
449453
}

oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/endpoint/RestClientJwtBearerTokenResponseClientTests.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,15 @@ public void addParametersConverterWhenNullThenThrowIllegalArgumentException() {
140140
// @formatter:on
141141
}
142142

143+
@Test
144+
public void setParametersCustomizerWhenNullThenThrowIllegalArgumentException() {
145+
// @formatter:off
146+
assertThatIllegalArgumentException()
147+
.isThrownBy(() -> this.tokenResponseClient.setParametersCustomizer(null))
148+
.withMessage("parametersCustomizer cannot be null");
149+
// @formatter:on
150+
}
151+
143152
@Test
144153
public void getTokenResponseWhenGrantRequestIsNullThenThrowIllegalArgumentException() {
145154
// @formatter:off
@@ -414,12 +423,7 @@ public void getTokenResponseWhenParametersCustomizerSetThenCalled() throws Excep
414423
ClientRegistration clientRegistration = this.clientRegistration.build();
415424
JwtBearerGrantRequest grantRequest = new JwtBearerGrantRequest(clientRegistration, this.jwtAssertion);
416425
Consumer<MultiValueMap<String, String>> parametersCustomizer = mock();
417-
// @formatter:off
418-
DefaultOAuth2TokenRequestParametersConverter<JwtBearerGrantRequest> parametersConverter =
419-
new DefaultOAuth2TokenRequestParametersConverter<>();
420-
// @formatter:on
421-
parametersConverter.setParametersCustomizer(parametersCustomizer);
422-
this.tokenResponseClient.setParametersConverter(parametersConverter);
426+
this.tokenResponseClient.setParametersCustomizer(parametersCustomizer);
423427
this.tokenResponseClient.getTokenResponse(grantRequest);
424428
verify(parametersCustomizer).accept(any());
425429
}

oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/endpoint/RestClientRefreshTokenTokenResponseClientTests.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,15 @@ public void addParametersConverterWhenNullThenThrowIllegalArgumentException() {
147147
// @formatter:on
148148
}
149149

150+
@Test
151+
public void setParametersCustomizerWhenNullThenThrowIllegalArgumentException() {
152+
// @formatter:off
153+
assertThatIllegalArgumentException()
154+
.isThrownBy(() -> this.tokenResponseClient.setParametersCustomizer(null))
155+
.withMessage("parametersCustomizer cannot be null");
156+
// @formatter:on
157+
}
158+
150159
@Test
151160
public void getTokenResponseWhenGrantRequestIsNullThenThrowIllegalArgumentException() {
152161
// @formatter:off
@@ -461,12 +470,7 @@ public void getTokenResponseWhenParametersCustomizerSetThenCalled() throws Excep
461470
OAuth2RefreshTokenGrantRequest grantRequest = new OAuth2RefreshTokenGrantRequest(clientRegistration,
462471
this.accessToken, this.refreshToken);
463472
Consumer<MultiValueMap<String, String>> parametersCustomizer = mock();
464-
// @formatter:off
465-
DefaultOAuth2TokenRequestParametersConverter<OAuth2RefreshTokenGrantRequest> parametersConverter =
466-
new DefaultOAuth2TokenRequestParametersConverter<>();
467-
// @formatter:on
468-
parametersConverter.setParametersCustomizer(parametersCustomizer);
469-
this.tokenResponseClient.setParametersConverter(parametersConverter);
473+
this.tokenResponseClient.setParametersCustomizer(parametersCustomizer);
470474
this.tokenResponseClient.getTokenResponse(grantRequest);
471475
verify(parametersCustomizer).accept(any());
472476
}

oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/endpoint/RestClientTokenExchangeTokenResponseClientTests.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,15 @@ public void addParametersConverterWhenNullThenThrowIllegalArgumentException() {
148148
// @formatter:on
149149
}
150150

151+
@Test
152+
public void setParametersCustomizerWhenNullThenThrowIllegalArgumentException() {
153+
// @formatter:off
154+
assertThatIllegalArgumentException()
155+
.isThrownBy(() -> this.tokenResponseClient.setParametersCustomizer(null))
156+
.withMessage("parametersCustomizer cannot be null");
157+
// @formatter:on
158+
}
159+
151160
@Test
152161
public void getTokenResponseWhenGrantRequestIsNullThenThrowIllegalArgumentException() {
153162
// @formatter:off
@@ -545,12 +554,7 @@ public void getTokenResponseWhenParametersCustomizerSetThenCalled() throws Excep
545554
TokenExchangeGrantRequest grantRequest = new TokenExchangeGrantRequest(clientRegistration, this.subjectToken,
546555
this.actorToken);
547556
Consumer<MultiValueMap<String, String>> parametersCustomizer = mock();
548-
// @formatter:off
549-
DefaultOAuth2TokenRequestParametersConverter<TokenExchangeGrantRequest> parametersConverter =
550-
new DefaultOAuth2TokenRequestParametersConverter<>();
551-
// @formatter:on
552-
parametersConverter.setParametersCustomizer(parametersCustomizer);
553-
this.tokenResponseClient.setParametersConverter(parametersConverter);
557+
this.tokenResponseClient.setParametersCustomizer(parametersCustomizer);
554558
this.tokenResponseClient.getTokenResponse(grantRequest);
555559
verify(parametersCustomizer).accept(any());
556560
}

oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/endpoint/WebClientReactiveAuthorizationCodeTokenResponseClientTests.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.Collections;
2323
import java.util.HashMap;
2424
import java.util.Map;
25+
import java.util.function.Consumer;
2526
import java.util.function.Function;
2627

2728
import javax.crypto.spec.SecretKeySpec;
@@ -406,6 +407,16 @@ public void getTokenResponseWhenParametersConverterSetThenAbleToOverrideDefaultP
406407
// @formatter:on
407408
}
408409

410+
@Test
411+
public void getTokenResponseWhenParametersCustomizerSetThenCalled() throws Exception {
412+
this.server.enqueue(MockResponses.json("access-token-response.json"));
413+
OAuth2AuthorizationCodeGrantRequest request = authorizationCodeGrantRequest();
414+
Consumer<MultiValueMap<String, String>> parametersCustomizer = mock();
415+
this.tokenResponseClient.setParametersCustomizer(parametersCustomizer);
416+
this.tokenResponseClient.getTokenResponse(request).block();
417+
verify(parametersCustomizer).accept(any());
418+
}
419+
409420
// gh-10260
410421
@Test
411422
public void getTokenResponseWhenSuccessCustomResponseThenReturnAccessTokenResponse() {

oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/endpoint/WebClientReactiveClientCredentialsTokenResponseClientTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.nio.charset.StandardCharsets;
2121
import java.util.Base64;
2222
import java.util.Collections;
23+
import java.util.function.Consumer;
2324
import java.util.function.Function;
2425

2526
import javax.crypto.spec.SecretKeySpec;
@@ -365,6 +366,17 @@ public void getTokenResponseWhenParametersConverterSetThenAbleToOverrideDefaultP
365366
// @formatter:on
366367
}
367368

369+
@Test
370+
public void getTokenResponseWhenParametersCustomizerSetThenCalled() throws Exception {
371+
this.server.enqueue(MockResponses.json("access-token-response.json"));
372+
OAuth2ClientCredentialsGrantRequest request = new OAuth2ClientCredentialsGrantRequest(
373+
this.clientRegistration.build());
374+
Consumer<MultiValueMap<String, String>> parametersCustomizer = mock();
375+
this.client.setParametersCustomizer(parametersCustomizer);
376+
this.client.getTokenResponse(request).block();
377+
verify(parametersCustomizer).accept(any());
378+
}
379+
368380
// gh-10260
369381
@Test
370382
public void getTokenResponseWhenSuccessCustomResponseThenReturnAccessTokenResponse() {

oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/endpoint/WebClientReactiveJwtBearerTokenResponseClientTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.net.URLEncoder;
2020
import java.nio.charset.StandardCharsets;
2121
import java.util.Collections;
22+
import java.util.function.Consumer;
2223

2324
import okhttp3.mockwebserver.MockResponse;
2425
import okhttp3.mockwebserver.MockWebServer;
@@ -289,6 +290,17 @@ public void getTokenResponseWhenParametersConverterSetThenAbleToOverrideDefaultP
289290
// @formatter:on
290291
}
291292

293+
@Test
294+
public void getTokenResponseWhenParametersCustomizerSetThenCalled() throws Exception {
295+
this.server.enqueue(MockResponses.json("access-token-response.json"));
296+
ClientRegistration clientRegistration = this.clientRegistration.build();
297+
JwtBearerGrantRequest request = new JwtBearerGrantRequest(clientRegistration, this.jwtAssertion);
298+
Consumer<MultiValueMap<String, String>> parametersCustomizer = mock();
299+
this.client.setParametersCustomizer(parametersCustomizer);
300+
this.client.getTokenResponse(request).block();
301+
verify(parametersCustomizer).accept(any());
302+
}
303+
292304
@Test
293305
public void getTokenResponseWhenBodyExtractorSetThenCalled() {
294306
BodyExtractor<Mono<OAuth2AccessTokenResponse>, ReactiveHttpInputMessage> bodyExtractor = mock();

oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/endpoint/WebClientReactivePasswordTokenResponseClientTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.nio.charset.StandardCharsets;
2121
import java.time.Instant;
2222
import java.util.Collections;
23+
import java.util.function.Consumer;
2324
import java.util.function.Function;
2425

2526
import javax.crypto.spec.SecretKeySpec;
@@ -408,6 +409,17 @@ public void getTokenResponseWhenParametersConverterSetThenAbleToOverrideDefaultP
408409
// @formatter:on
409410
}
410411

412+
@Test
413+
public void getTokenResponseWhenParametersCustomizerSetThenCalled() throws Exception {
414+
this.server.enqueue(MockResponses.json("access-token-response.json"));
415+
OAuth2PasswordGrantRequest request = new OAuth2PasswordGrantRequest(this.clientRegistrationBuilder.build(),
416+
this.username, this.password);
417+
Consumer<MultiValueMap<String, String>> parametersCustomizer = mock();
418+
this.tokenResponseClient.setParametersCustomizer(parametersCustomizer);
419+
this.tokenResponseClient.getTokenResponse(request).block();
420+
verify(parametersCustomizer).accept(any());
421+
}
422+
411423
// gh-10260
412424
@Test
413425
public void getTokenResponseWhenSuccessCustomResponseThenReturnAccessTokenResponse() {

0 commit comments

Comments
 (0)