|
25 | 25 | import java.time.temporal.ChronoUnit; |
26 | 26 | import java.util.Arrays; |
27 | 27 | import java.util.Base64; |
| 28 | +import java.util.Collections; |
28 | 29 | import java.util.HashSet; |
29 | 30 | import java.util.List; |
30 | 31 | import java.util.Map; |
|
71 | 72 | import org.springframework.security.crypto.password.NoOpPasswordEncoder; |
72 | 73 | import org.springframework.security.crypto.password.PasswordEncoder; |
73 | 74 | import org.springframework.security.oauth2.core.AuthorizationGrantType; |
| 75 | +import org.springframework.security.oauth2.core.ClientAuthenticationMethod; |
74 | 76 | import org.springframework.security.oauth2.core.OAuth2RefreshToken; |
75 | 77 | import org.springframework.security.oauth2.core.OAuth2Token; |
76 | 78 | import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse; |
|
98 | 100 | import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationConsentAuthenticationContext; |
99 | 101 | import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationConsentAuthenticationProvider; |
100 | 102 | import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationConsentAuthenticationToken; |
| 103 | +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken; |
101 | 104 | import org.springframework.security.oauth2.server.authorization.client.JdbcRegisteredClientRepository; |
102 | 105 | import org.springframework.security.oauth2.server.authorization.client.JdbcRegisteredClientRepository.RegisteredClientParametersMapper; |
103 | 106 | import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; |
@@ -515,6 +518,28 @@ public void requestWhenPublicClientWithPkceAndCustomRefreshTokenGeneratorThenRet |
515 | 518 | .isEqualTo(true); |
516 | 519 | } |
517 | 520 |
|
| 521 | + @Test |
| 522 | + public void requestWhenPublicClientWithPkceAndEmptyCodeThenBadRequest() throws Exception { |
| 523 | + this.spring.register(AuthorizationServerConfiguration.class).autowire(); |
| 524 | + |
| 525 | + RegisteredClient registeredClient = TestRegisteredClients.registeredPublicClient().build(); |
| 526 | + this.registeredClientRepository.save(registeredClient); |
| 527 | + |
| 528 | + MultiValueMap<String, String> tokenRequestParameters = new LinkedMultiValueMap<>(); |
| 529 | + tokenRequestParameters.set(OAuth2ParameterNames.GRANT_TYPE, AuthorizationGrantType.AUTHORIZATION_CODE.getValue()); |
| 530 | + tokenRequestParameters.set(OAuth2ParameterNames.CODE, ""); |
| 531 | + tokenRequestParameters.set(OAuth2ParameterNames.REDIRECT_URI, registeredClient.getRedirectUris().iterator().next()); |
| 532 | + |
| 533 | + this.mvc |
| 534 | + .perform(post(DEFAULT_TOKEN_ENDPOINT_URI) |
| 535 | + .params(tokenRequestParameters) |
| 536 | + .param(OAuth2ParameterNames.CLIENT_ID, registeredClient.getClientId()) |
| 537 | + .param(PkceParameterNames.CODE_VERIFIER, S256_CODE_VERIFIER)) |
| 538 | + .andExpect(header().string(HttpHeaders.CACHE_CONTROL, containsString("no-store"))) |
| 539 | + .andExpect(header().string(HttpHeaders.PRAGMA, containsString("no-cache"))) |
| 540 | + .andExpect(status().isBadRequest()); |
| 541 | + } |
| 542 | + |
518 | 543 | @Test |
519 | 544 | public void requestWhenConfidentialClientWithPkceAndMissingCodeVerifierThenBadRequest() throws Exception { |
520 | 545 | this.spring.register(AuthorizationServerConfiguration.class).autowire(); |
|
0 commit comments