Skip to content

Commit 56918b9

Browse files
committed
Merge branch '0.4.x'
Closes gh-1074
2 parents 32022c1 + 30927ad commit 56918b9

File tree

3 files changed

+26
-20
lines changed

3 files changed

+26
-20
lines changed

oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/web/OAuth2AuthorizationEndpointFilter.java

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2020-2022 the original author or authors.
2+
* Copyright 2020-2023 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -18,9 +18,7 @@
1818
import java.io.IOException;
1919
import java.nio.charset.StandardCharsets;
2020
import java.util.Arrays;
21-
import java.util.HashMap;
2221
import java.util.HashSet;
23-
import java.util.Map;
2422
import java.util.Set;
2523

2624
import jakarta.servlet.FilterChain;
@@ -67,6 +65,7 @@
6765
import org.springframework.util.StringUtils;
6866
import org.springframework.web.filter.OncePerRequestFilter;
6967
import org.springframework.web.util.UriComponentsBuilder;
68+
import org.springframework.web.util.UriUtils;
7069

7170
/**
7271
* A {@code Filter} for the OAuth 2.0 Authorization Code Grant,
@@ -301,13 +300,11 @@ private void sendAuthorizationResponse(HttpServletRequest request, HttpServletRe
301300
.queryParam(OAuth2ParameterNames.CODE, authorizationCodeRequestAuthentication.getAuthorizationCode().getTokenValue());
302301
String redirectUri;
303302
if (StringUtils.hasText(authorizationCodeRequestAuthentication.getState())) {
304-
uriBuilder.queryParam(OAuth2ParameterNames.STATE, "{state}");
305-
Map<String, String> queryParams = new HashMap<>();
306-
queryParams.put(OAuth2ParameterNames.STATE, authorizationCodeRequestAuthentication.getState());
307-
redirectUri = uriBuilder.build(queryParams).toString();
308-
} else {
309-
redirectUri = uriBuilder.toUriString();
303+
uriBuilder.queryParam(
304+
OAuth2ParameterNames.STATE,
305+
UriUtils.encode(authorizationCodeRequestAuthentication.getState(), StandardCharsets.UTF_8));
310306
}
307+
redirectUri = uriBuilder.build(true).toUriString(); // build(true) -> Components are explicitly encoded
311308
this.redirectStrategy.sendRedirect(request, response, redirectUri);
312309
}
313310

@@ -341,13 +338,11 @@ private void sendErrorResponse(HttpServletRequest request, HttpServletResponse r
341338
}
342339
String redirectUri;
343340
if (StringUtils.hasText(authorizationCodeRequestAuthentication.getState())) {
344-
uriBuilder.queryParam(OAuth2ParameterNames.STATE, "{state}");
345-
Map<String, String> queryParams = new HashMap<>();
346-
queryParams.put(OAuth2ParameterNames.STATE, authorizationCodeRequestAuthentication.getState());
347-
redirectUri = uriBuilder.build(queryParams).toString();
348-
} else {
349-
redirectUri = uriBuilder.toUriString();
341+
uriBuilder.queryParam(
342+
OAuth2ParameterNames.STATE,
343+
UriUtils.encode(authorizationCodeRequestAuthentication.getState(), StandardCharsets.UTF_8));
350344
}
345+
redirectUri = uriBuilder.build(true).toUriString(); // build(true) -> Components are explicitly encoded
351346
this.redirectStrategy.sendRedirect(request, response, redirectUri);
352347
}
353348

oauth2-authorization-server/src/test/java/org/springframework/security/oauth2/server/authorization/config/annotation/web/configurers/OAuth2AuthorizationCodeGrantTests.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,12 @@ public void requestWhenAuthorizationRequestCustomEndpointThenRedirectToClient()
287287
}
288288

289289
private void assertAuthorizationRequestRedirectsToClient(String authorizationEndpointUri) throws Exception {
290-
RegisteredClient registeredClient = TestRegisteredClients.registeredClient().build();
290+
RegisteredClient registeredClient = TestRegisteredClients.registeredClient()
291+
.redirectUris(redirectUris -> {
292+
redirectUris.clear();
293+
redirectUris.add("https://example.com/callback-1?param=encoded%20parameter%20value"); // gh-1011
294+
})
295+
.build();
291296
this.registeredClientRepository.save(registeredClient);
292297

293298
MultiValueMap<String, String> authorizationRequestParameters = getAuthorizationRequestParameters(registeredClient);
@@ -297,8 +302,9 @@ private void assertAuthorizationRequestRedirectsToClient(String authorizationEnd
297302
.andExpect(status().is3xxRedirection())
298303
.andReturn();
299304
String redirectedUrl = mvcResult.getResponse().getRedirectedUrl();
300-
String expectedRedirectUri = authorizationRequestParameters.getFirst(OAuth2ParameterNames.REDIRECT_URI);
301-
assertThat(redirectedUrl).matches(expectedRedirectUri + "\\?code=.{15,}&state=" + STATE_URL_ENCODED);
305+
String redirectUri = authorizationRequestParameters.getFirst(OAuth2ParameterNames.REDIRECT_URI);
306+
String code = extractParameterFromRedirectUri(redirectedUrl, "code");
307+
assertThat(redirectedUrl).isEqualTo(redirectUri + "&code=" + code + "&state=" + STATE_URL_ENCODED);
302308

303309
String authorizationCode = extractParameterFromRedirectUri(redirectedUrl, "code");
304310
OAuth2Authorization authorization = this.authorizationService.findByToken(authorizationCode, AUTHORIZATION_CODE_TOKEN_TYPE);

oauth2-authorization-server/src/test/java/org/springframework/security/oauth2/server/authorization/web/OAuth2AuthorizationEndpointFilterTests.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,12 @@ public void doFilterWhenAuthorizationRequestConsentRequiredWithPreviouslyApprove
537537

538538
@Test
539539
public void doFilterWhenAuthorizationRequestAuthenticatedThenAuthorizationResponse() throws Exception {
540-
RegisteredClient registeredClient = TestRegisteredClients.registeredClient().build();
540+
RegisteredClient registeredClient = TestRegisteredClients.registeredClient()
541+
.redirectUris(redirectUris -> {
542+
redirectUris.clear();
543+
redirectUris.add("https://example.com?param=encoded%20parameter%20value");
544+
})
545+
.build();
541546
OAuth2AuthorizationCodeRequestAuthenticationToken authorizationCodeRequestAuthenticationResult =
542547
new OAuth2AuthorizationCodeRequestAuthenticationToken(
543548
AUTHORIZATION_URI, registeredClient.getClientId(), principal, this.authorizationCode,
@@ -563,7 +568,7 @@ public void doFilterWhenAuthorizationRequestAuthenticatedThenAuthorizationRespon
563568
.isEqualTo(REMOTE_ADDRESS);
564569
assertThat(response.getStatus()).isEqualTo(HttpStatus.FOUND.value());
565570
assertThat(response.getRedirectedUrl()).isEqualTo(
566-
request.getParameter(OAuth2ParameterNames.REDIRECT_URI) + "?code=code&state=state");
571+
"https://example.com?param=encoded%20parameter%20value&code=code&state=state");
567572
}
568573

569574
@Test

0 commit comments

Comments
 (0)