|
18 | 18 | import java.io.IOException;
|
19 | 19 | import java.nio.charset.StandardCharsets;
|
20 | 20 | import java.util.Arrays;
|
21 |
| -import java.util.HashMap; |
22 | 21 | import java.util.HashSet;
|
23 |
| -import java.util.Map; |
24 | 22 | import java.util.Set;
|
25 | 23 |
|
26 | 24 | import javax.servlet.FilterChain;
|
|
66 | 64 | import org.springframework.util.Assert;
|
67 | 65 | import org.springframework.util.StringUtils;
|
68 | 66 | import org.springframework.web.filter.OncePerRequestFilter;
|
69 |
| -import org.springframework.web.util.DefaultUriBuilderFactory; |
70 |
| -import org.springframework.web.util.UriBuilder; |
71 |
| -import org.springframework.web.util.UriBuilderFactory; |
72 | 67 | import org.springframework.web.util.UriComponentsBuilder;
|
| 68 | +import org.springframework.web.util.UriUtils; |
73 | 69 |
|
74 | 70 | /**
|
75 | 71 | * A {@code Filter} for the OAuth 2.0 Authorization Code Grant,
|
@@ -299,18 +295,16 @@ private void sendAuthorizationResponse(HttpServletRequest request, HttpServletRe
|
299 | 295 |
|
300 | 296 | OAuth2AuthorizationCodeRequestAuthenticationToken authorizationCodeRequestAuthentication =
|
301 | 297 | (OAuth2AuthorizationCodeRequestAuthenticationToken) authentication;
|
302 |
| - UriBuilder uriBuilder = valuesOnlyEncodingUriBuilderFactory() |
303 |
| - .uriString(authorizationCodeRequestAuthentication.getRedirectUri()) |
| 298 | + UriComponentsBuilder uriBuilder = UriComponentsBuilder |
| 299 | + .fromUriString(authorizationCodeRequestAuthentication.getRedirectUri()) |
304 | 300 | .queryParam(OAuth2ParameterNames.CODE, authorizationCodeRequestAuthentication.getAuthorizationCode().getTokenValue());
|
305 | 301 | String redirectUri;
|
306 | 302 | if (StringUtils.hasText(authorizationCodeRequestAuthentication.getState())) {
|
307 |
| - uriBuilder.queryParam(OAuth2ParameterNames.STATE, "{state}"); |
308 |
| - Map<String, String> queryParams = new HashMap<>(); |
309 |
| - queryParams.put(OAuth2ParameterNames.STATE, authorizationCodeRequestAuthentication.getState()); |
310 |
| - redirectUri = uriBuilder.build(queryParams).toString(); |
311 |
| - } else { |
312 |
| - redirectUri = uriBuilder.build().toString(); |
| 303 | + uriBuilder.queryParam( |
| 304 | + OAuth2ParameterNames.STATE, |
| 305 | + UriUtils.encode(authorizationCodeRequestAuthentication.getState(), StandardCharsets.UTF_8)); |
313 | 306 | }
|
| 307 | + redirectUri = uriBuilder.build(true).toUriString(); // build(true) -> Components are explicitly encoded |
314 | 308 | this.redirectStrategy.sendRedirect(request, response, redirectUri);
|
315 | 309 | }
|
316 | 310 |
|
@@ -344,22 +338,14 @@ private void sendErrorResponse(HttpServletRequest request, HttpServletResponse r
|
344 | 338 | }
|
345 | 339 | String redirectUri;
|
346 | 340 | if (StringUtils.hasText(authorizationCodeRequestAuthentication.getState())) {
|
347 |
| - uriBuilder.queryParam(OAuth2ParameterNames.STATE, "{state}"); |
348 |
| - Map<String, String> queryParams = new HashMap<>(); |
349 |
| - queryParams.put(OAuth2ParameterNames.STATE, authorizationCodeRequestAuthentication.getState()); |
350 |
| - redirectUri = uriBuilder.build(queryParams).toString(); |
351 |
| - } else { |
352 |
| - redirectUri = uriBuilder.toUriString(); |
| 341 | + uriBuilder.queryParam( |
| 342 | + OAuth2ParameterNames.STATE, |
| 343 | + UriUtils.encode(authorizationCodeRequestAuthentication.getState(), StandardCharsets.UTF_8)); |
353 | 344 | }
|
| 345 | + redirectUri = uriBuilder.build(true).toUriString(); // build(true) -> Components are explicitly encoded |
354 | 346 | this.redirectStrategy.sendRedirect(request, response, redirectUri);
|
355 | 347 | }
|
356 | 348 |
|
357 |
| - private UriBuilderFactory valuesOnlyEncodingUriBuilderFactory() { |
358 |
| - DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(); |
359 |
| - uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY); |
360 |
| - return uriBuilderFactory; |
361 |
| - } |
362 |
| - |
363 | 349 | /**
|
364 | 350 | * For internal use only.
|
365 | 351 | */
|
|
0 commit comments