|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
- * Copyright 2002-2020 the original author or authors.
|
|
|
+ * Copyright 2002-2021 the original author or authors.
|
|
|
*
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
* you may not use this file except in compliance with the License.
|
|
@@ -16,6 +16,10 @@
|
|
|
|
|
|
package org.springframework.security.oauth2.client.endpoint;
|
|
|
|
|
|
+import java.net.URLEncoder;
|
|
|
+import java.nio.charset.StandardCharsets;
|
|
|
+import java.util.Base64;
|
|
|
+
|
|
|
import okhttp3.mockwebserver.MockResponse;
|
|
|
import okhttp3.mockwebserver.MockWebServer;
|
|
|
import okhttp3.mockwebserver.RecordedRequest;
|
|
@@ -89,6 +93,35 @@ public class WebClientReactiveClientCredentialsTokenResponseClientTests {
|
|
|
assertThat(body).isEqualTo("grant_type=client_credentials&scope=read%3Auser");
|
|
|
}
|
|
|
|
|
|
+ // gh-9610
|
|
|
+ @Test
|
|
|
+ public void getTokenResponseWhenSpecialCharactersThenSuccessWithEncodedClientCredentials() throws Exception {
|
|
|
+ // @formatter:off
|
|
|
+ enqueueJson("{\n"
|
|
|
+ + " \"access_token\":\"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3\",\n"
|
|
|
+ + " \"token_type\":\"bearer\",\n"
|
|
|
+ + " \"expires_in\":3600,\n"
|
|
|
+ + " \"refresh_token\":\"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk\",\n"
|
|
|
+ + " \"scope\":\"create\"\n"
|
|
|
+ + "}");
|
|
|
+ // @formatter:on
|
|
|
+ String clientCredentialWithAnsiKeyboardSpecialCharacters = "~!@#$%^&*()_+{}|:\"<>?`-=[]\\;',./ ";
|
|
|
+ OAuth2ClientCredentialsGrantRequest request = new OAuth2ClientCredentialsGrantRequest(
|
|
|
+ this.clientRegistration.clientId(clientCredentialWithAnsiKeyboardSpecialCharacters)
|
|
|
+ .clientSecret(clientCredentialWithAnsiKeyboardSpecialCharacters).build());
|
|
|
+ OAuth2AccessTokenResponse response = this.client.getTokenResponse(request).block();
|
|
|
+ RecordedRequest actualRequest = this.server.takeRequest();
|
|
|
+ String body = actualRequest.getBody().readUtf8();
|
|
|
+ assertThat(response.getAccessToken()).isNotNull();
|
|
|
+ String urlEncodedClientCredentialecret = URLEncoder.encode(clientCredentialWithAnsiKeyboardSpecialCharacters,
|
|
|
+ StandardCharsets.UTF_8.toString());
|
|
|
+ String clientCredentials = Base64.getEncoder()
|
|
|
+ .encodeToString((urlEncodedClientCredentialecret + ":" + urlEncodedClientCredentialecret)
|
|
|
+ .getBytes(StandardCharsets.UTF_8));
|
|
|
+ assertThat(actualRequest.getHeader(HttpHeaders.AUTHORIZATION)).isEqualTo("Basic " + clientCredentials);
|
|
|
+ assertThat(body).isEqualTo("grant_type=client_credentials&scope=read%3Auser");
|
|
|
+ }
|
|
|
+
|
|
|
@Test
|
|
|
public void getTokenResponseWhenPostThenSuccess() throws Exception {
|
|
|
ClientRegistration registration = this.clientRegistration
|