Skip to content

Commit 9970ab8

Browse files
author
Steve Riesenberg
committed
Add ability to disable URL encoding of client credentials
Closes gh-10018 Note: This commit can be reverted in 5.6 once it has been backported.
1 parent f5266c7 commit 9970ab8

File tree

3 files changed

+41
-6
lines changed

3 files changed

+41
-6
lines changed

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,12 @@
4242
abstract class AbstractOAuth2AuthorizationGrantRequestEntityConverter<T extends AbstractOAuth2AuthorizationGrantRequest>
4343
implements Converter<T, RequestEntity<?>> {
4444

45+
private boolean encodeClientCredentials = true;
46+
4547
// @formatter:off
4648
private Converter<T, HttpHeaders> headersConverter =
4749
(authorizationGrantRequest) -> OAuth2AuthorizationGrantRequestEntityUtils
48-
.getTokenRequestHeaders(authorizationGrantRequest.getClientRegistration());
50+
.getTokenRequestHeaders(authorizationGrantRequest.getClientRegistration(), this.encodeClientCredentials);
4951
// @formatter:on
5052

5153
private Converter<T, MultiValueMap<String, String>> parametersConverter = this::createParameters;
@@ -170,4 +172,17 @@ public final void addParametersConverter(Converter<T, MultiValueMap<String, Stri
170172
};
171173
}
172174

175+
/**
176+
* Sets the flag that controls whether client credentials are encoded using the
177+
* application/x-www-form-urlencoded algorithm in the headers converter.
178+
* @deprecated Support for non-compliant providers will be removed in Spring Security
179+
* 5.6
180+
* @param encodeClientCredentials {@code false} to disable encoding client credentials
181+
* (default is true)
182+
*/
183+
@Deprecated
184+
public void setEncodeClientCredentials(boolean encodeClientCredentials) {
185+
this.encodeClientCredentials = encodeClientCredentials;
186+
}
187+
173188
}

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

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@
6363
public abstract class AbstractWebClientReactiveOAuth2AccessTokenResponseClient<T extends AbstractOAuth2AuthorizationGrantRequest>
6464
implements ReactiveOAuth2AccessTokenResponseClient<T> {
6565

66+
private boolean encodeClientCredentials = true;
67+
6668
private WebClient webClient = WebClient.builder().build();
6769

6870
AbstractWebClientReactiveOAuth2AccessTokenResponseClient() {
@@ -100,8 +102,11 @@ private void populateTokenRequestHeaders(T grantRequest, HttpHeaders headers) {
100102
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
101103
if (ClientAuthenticationMethod.CLIENT_SECRET_BASIC.equals(clientRegistration.getClientAuthenticationMethod())
102104
|| ClientAuthenticationMethod.BASIC.equals(clientRegistration.getClientAuthenticationMethod())) {
103-
String clientId = encodeClientCredential(clientRegistration.getClientId());
104-
String clientSecret = encodeClientCredential(clientRegistration.getClientSecret());
105+
String clientId = this.encodeClientCredentials ? encodeClientCredential(clientRegistration.getClientId())
106+
: clientRegistration.getClientId();
107+
String clientSecret = this.encodeClientCredentials
108+
? encodeClientCredential(clientRegistration.getClientSecret())
109+
: clientRegistration.getClientSecret();
105110
headers.setBasicAuth(clientId, clientSecret);
106111
}
107112
}
@@ -230,4 +235,17 @@ public void setWebClient(WebClient webClient) {
230235
this.webClient = webClient;
231236
}
232237

238+
/**
239+
* Sets the flag that controls whether client credentials are encoded using the
240+
* application/x-www-form-urlencoded algorithm while populating token request headers.
241+
* @deprecated Support for non-compliant providers will be removed in Spring Security
242+
* 5.6
243+
* @param encodeClientCredentials {@code false} to disable encoding client credentials
244+
* (default is true)
245+
*/
246+
@Deprecated
247+
public void setEncodeClientCredentials(boolean encodeClientCredentials) {
248+
this.encodeClientCredentials = encodeClientCredentials;
249+
}
250+
233251
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,15 @@ final class OAuth2AuthorizationGrantRequestEntityUtils {
4646
private OAuth2AuthorizationGrantRequestEntityUtils() {
4747
}
4848

49-
static HttpHeaders getTokenRequestHeaders(ClientRegistration clientRegistration) {
49+
static HttpHeaders getTokenRequestHeaders(ClientRegistration clientRegistration, boolean encodeClientCredentials) {
5050
HttpHeaders headers = new HttpHeaders();
5151
headers.addAll(DEFAULT_TOKEN_REQUEST_HEADERS);
5252
if (ClientAuthenticationMethod.CLIENT_SECRET_BASIC.equals(clientRegistration.getClientAuthenticationMethod())
5353
|| ClientAuthenticationMethod.BASIC.equals(clientRegistration.getClientAuthenticationMethod())) {
54-
String clientId = encodeClientCredential(clientRegistration.getClientId());
55-
String clientSecret = encodeClientCredential(clientRegistration.getClientSecret());
54+
String clientId = encodeClientCredentials ? encodeClientCredential(clientRegistration.getClientId())
55+
: clientRegistration.getClientId();
56+
String clientSecret = encodeClientCredentials ? encodeClientCredential(clientRegistration.getClientSecret())
57+
: clientRegistration.getClientSecret();
5658
headers.setBasicAuth(clientId, clientSecret);
5759
}
5860
return headers;

0 commit comments

Comments
 (0)