|
@@ -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");
|
|
* 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.
|
|
@@ -59,6 +59,7 @@ import org.springframework.security.crypto.password.PasswordEncoder;
|
|
import org.springframework.security.oauth2.core.AuthorizationGrantType;
|
|
import org.springframework.security.oauth2.core.AuthorizationGrantType;
|
|
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
|
|
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
|
|
import org.springframework.security.oauth2.core.OAuth2AccessToken;
|
|
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.core.endpoint.OAuth2ParameterNames;
|
|
import org.springframework.security.oauth2.jose.TestJwks;
|
|
import org.springframework.security.oauth2.jose.TestJwks;
|
|
import org.springframework.security.oauth2.server.authorization.JdbcOAuth2AuthorizationService;
|
|
import org.springframework.security.oauth2.server.authorization.JdbcOAuth2AuthorizationService;
|
|
@@ -97,6 +98,7 @@ import org.springframework.security.web.authentication.AuthenticationSuccessHand
|
|
import org.springframework.security.web.util.matcher.RequestMatcher;
|
|
import org.springframework.security.web.util.matcher.RequestMatcher;
|
|
import org.springframework.test.web.servlet.MockMvc;
|
|
import org.springframework.test.web.servlet.MockMvc;
|
|
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
|
|
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.assertj.core.api.Assertions.assertThat;
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
@@ -230,6 +232,37 @@ public class OAuth2ClientCredentialsGrantTests {
|
|
verify(jwtCustomizer).customize(any());
|
|
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
|
|
@Test
|
|
public void requestWhenTokenEndpointCustomizedThenUsed() throws Exception {
|
|
public void requestWhenTokenEndpointCustomizedThenUsed() throws Exception {
|
|
this.spring.register(AuthorizationServerConfigurationCustomTokenEndpoint.class).autowire();
|
|
this.spring.register(AuthorizationServerConfigurationCustomTokenEndpoint.class).autowire();
|