@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
/ *
* Copyright 2020 - 2022 the original author or authors .
* Copyright 2020 - 2023 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 .
@ -60,6 +60,7 @@ import org.springframework.security.crypto.password.PasswordEncoder;
@@ -60,6 +60,7 @@ import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.oauth2.core.AuthorizationGrantType ;
import org.springframework.security.oauth2.core.ClientAuthenticationMethod ;
import org.springframework.security.oauth2.core.OAuth2AccessToken ;
import org.springframework.security.oauth2.core.OAuth2ErrorCodes ;
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames ;
import org.springframework.security.oauth2.jose.TestJwks ;
import org.springframework.security.oauth2.server.authorization.JdbcOAuth2AuthorizationService ;
@ -98,6 +99,7 @@ import org.springframework.security.web.authentication.AuthenticationSuccessHand
@@ -98,6 +99,7 @@ import org.springframework.security.web.authentication.AuthenticationSuccessHand
import org.springframework.security.web.util.matcher.RequestMatcher ;
import org.springframework.test.web.servlet.MockMvc ;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders ;
import org.springframework.web.util.UriComponentsBuilder ;
import static org.assertj.core.api.Assertions.assertThat ;
import static org.mockito.ArgumentMatchers.any ;
@ -231,6 +233,37 @@ public class OAuth2ClientCredentialsGrantTests {
@@ -231,6 +233,37 @@ public class OAuth2ClientCredentialsGrantTests {
verify ( jwtCustomizer ) . customize ( any ( ) ) ;
}
// gh-1378
@Test
public void requestWhenTokenRequestWithClientCredentialsInQueryParamThenInvalidRequest ( ) throws Exception {
this . spring . register ( AuthorizationServerConfiguration . class ) . autowire ( ) ;
RegisteredClient registeredClient = TestRegisteredClients . registeredClient2 ( ) . build ( ) ;
this . registeredClientRepository . save ( registeredClient ) ;
String tokenEndpointUri = UriComponentsBuilder . fromUriString ( DEFAULT_TOKEN_ENDPOINT_URI )
. queryParam ( OAuth2ParameterNames . CLIENT_ID , registeredClient . getClientId ( ) )
. toUriString ( ) ;
this . mvc . perform ( post ( tokenEndpointUri )
. param ( OAuth2ParameterNames . CLIENT_SECRET , registeredClient . getClientSecret ( ) )
. param ( OAuth2ParameterNames . GRANT_TYPE , AuthorizationGrantType . CLIENT_CREDENTIALS . getValue ( ) )
. param ( OAuth2ParameterNames . SCOPE , "scope1 scope2" ) )
. andExpect ( status ( ) . isBadRequest ( ) )
. andExpect ( jsonPath ( "$.error" ) . value ( OAuth2ErrorCodes . INVALID_REQUEST ) ) ;
tokenEndpointUri = UriComponentsBuilder . fromUriString ( DEFAULT_TOKEN_ENDPOINT_URI )
. queryParam ( OAuth2ParameterNames . CLIENT_SECRET , registeredClient . getClientSecret ( ) )
. toUriString ( ) ;
this . mvc . perform ( post ( tokenEndpointUri )
. param ( OAuth2ParameterNames . CLIENT_ID , registeredClient . getClientId ( ) )
. param ( OAuth2ParameterNames . GRANT_TYPE , AuthorizationGrantType . CLIENT_CREDENTIALS . getValue ( ) )
. param ( OAuth2ParameterNames . SCOPE , "scope1 scope2" ) )
. andExpect ( status ( ) . isBadRequest ( ) )
. andExpect ( jsonPath ( "$.error" ) . value ( OAuth2ErrorCodes . INVALID_REQUEST ) ) ;
}
@Test
public void requestWhenTokenEndpointCustomizedThenUsed ( ) throws Exception {
this . spring . register ( AuthorizationServerConfigurationCustomTokenEndpoint . class ) . autowire ( ) ;