|
|
|
@ -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"); |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* you may not use this file except in compliance with 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; |
|
|
|
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.MockResponse; |
|
|
|
import okhttp3.mockwebserver.MockWebServer; |
|
|
|
import okhttp3.mockwebserver.MockWebServer; |
|
|
|
import okhttp3.mockwebserver.RecordedRequest; |
|
|
|
import okhttp3.mockwebserver.RecordedRequest; |
|
|
|
@ -89,6 +93,35 @@ public class WebClientReactiveClientCredentialsTokenResponseClientTests { |
|
|
|
assertThat(body).isEqualTo("grant_type=client_credentials&scope=read%3Auser"); |
|
|
|
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 |
|
|
|
@Test |
|
|
|
public void getTokenResponseWhenPostThenSuccess() throws Exception { |
|
|
|
public void getTokenResponseWhenPostThenSuccess() throws Exception { |
|
|
|
ClientRegistration registration = this.clientRegistration |
|
|
|
ClientRegistration registration = this.clientRegistration |
|
|
|
|