Skip to content

Commit 26205a2

Browse files
andreasfjgrandja
authored andcommitted
Preserve encoding for authorization request redirect_uri parameter
Closes gh-1011
1 parent 743dba7 commit 26205a2

File tree

2 files changed

+20
-6
lines changed

2 files changed

+20
-6
lines changed

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

Lines changed: 13 additions & 4 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.
@@ -66,6 +66,9 @@
6666
import org.springframework.util.Assert;
6767
import org.springframework.util.StringUtils;
6868
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;
6972
import org.springframework.web.util.UriComponentsBuilder;
7073

7174
/**
@@ -296,8 +299,8 @@ private void sendAuthorizationResponse(HttpServletRequest request, HttpServletRe
296299

297300
OAuth2AuthorizationCodeRequestAuthenticationToken authorizationCodeRequestAuthentication =
298301
(OAuth2AuthorizationCodeRequestAuthenticationToken) authentication;
299-
UriComponentsBuilder uriBuilder = UriComponentsBuilder
300-
.fromUriString(authorizationCodeRequestAuthentication.getRedirectUri())
302+
UriBuilder uriBuilder = valuesOnlyEncodingUriBuilderFactory()
303+
.uriString(authorizationCodeRequestAuthentication.getRedirectUri())
301304
.queryParam(OAuth2ParameterNames.CODE, authorizationCodeRequestAuthentication.getAuthorizationCode().getTokenValue());
302305
String redirectUri;
303306
if (StringUtils.hasText(authorizationCodeRequestAuthentication.getState())) {
@@ -306,7 +309,7 @@ private void sendAuthorizationResponse(HttpServletRequest request, HttpServletRe
306309
queryParams.put(OAuth2ParameterNames.STATE, authorizationCodeRequestAuthentication.getState());
307310
redirectUri = uriBuilder.build(queryParams).toString();
308311
} else {
309-
redirectUri = uriBuilder.toUriString();
312+
redirectUri = uriBuilder.build().toString();
310313
}
311314
this.redirectStrategy.sendRedirect(request, response, redirectUri);
312315
}
@@ -351,6 +354,12 @@ private void sendErrorResponse(HttpServletRequest request, HttpServletResponse r
351354
this.redirectStrategy.sendRedirect(request, response, redirectUri);
352355
}
353356

357+
private UriBuilderFactory valuesOnlyEncodingUriBuilderFactory() {
358+
DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory();
359+
uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY);
360+
return uriBuilderFactory;
361+
}
362+
354363
/**
355364
* For internal use only.
356365
*/

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)