Skip to content

Commit d6adc5c

Browse files
committed
- Check for query parameters in the authorization uri and pass them as additional parameters to the Oauth2Authorization request builder
1 parent 057587e commit d6adc5c

File tree

2 files changed

+44
-3
lines changed

2 files changed

+44
-3
lines changed

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/web/DefaultOAuth2AuthorizationRequestResolver.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ private OAuth2AuthorizationRequest resolve(HttpServletRequest request, String re
9696
if (registrationId == null) {
9797
return null;
9898
}
99+
String[] params = new String[0];
100+
if (registrationId.contains("?")) {
101+
String[] explodedURI = registrationId.split("\\?");
102+
registrationId = registrationId.split("\\?")[0];
103+
params = explodedURI[1].split("&");
104+
}
99105

100106
ClientRegistration clientRegistration = this.clientRegistrationRepository.findByRegistrationId(registrationId);
101107
if (clientRegistration == null) {
@@ -117,6 +123,10 @@ private OAuth2AuthorizationRequest resolve(HttpServletRequest request, String re
117123

118124
Map<String, Object> additionalParameters = new HashMap<>();
119125
additionalParameters.put(OAuth2ParameterNames.REGISTRATION_ID, clientRegistration.getRegistrationId());
126+
for(String param : params){
127+
int idx = param.indexOf("=");
128+
additionalParameters.put(param.substring(0, idx),param.substring(idx + 1));
129+
}
120130

121131
OAuth2AuthorizationRequest authorizationRequest = builder
122132
.clientId(clientRegistration.getClientId())

oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/web/DefaultOAuth2AuthorizationRequestResolverTests.java

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,7 @@
2727
import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationResponseType;
2828
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
2929

30-
import static org.assertj.core.api.Assertions.assertThat;
31-
import static org.assertj.core.api.Assertions.assertThatThrownBy;
32-
import static org.assertj.core.api.Assertions.entry;
30+
import static org.assertj.core.api.Assertions.*;
3331

3432
/**
3533
* Tests for {@link DefaultOAuth2AuthorizationRequestResolver}.
@@ -226,4 +224,37 @@ public void resolveWhenAuthorizationRequestHasActionParameterLoginThenRedirectUr
226224
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
227225
assertThat(authorizationRequest.getAuthorizationRequestUri()).matches("https://example.com/login/oauth/authorize\\?response_type=code&client_id=client-id-2&scope=read%3Auser&state=.{15,}&redirect_uri=http%3A%2F%2Flocalhost%2Flogin%2Foauth2%2Fcode%2Fregistration-id-2");
228226
}
227+
228+
//gh-5760
229+
@Test
230+
public void resolveWhenAuthorizationUriHasQueryParametersThenAuthorizationURIIncludesAdditionalQueryParameters() {
231+
String queryParams = "queryparam=test&queryparam2=test&queryparam3=a test with spaces";
232+
ClientRegistration clientRegistration = this.registration2;
233+
String requestUri = this.authorizationRequestBaseUri + "/" + clientRegistration.getRegistrationId()+"?"+queryParams;
234+
235+
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
236+
request.setServletPath(requestUri);
237+
238+
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
239+
240+
assertThat(authorizationRequest.getAdditionalParameters()).isNotEmpty();
241+
assertThat(authorizationRequest.getAdditionalParameters().size()).isEqualTo(4);
242+
assertThat(authorizationRequest.getAuthorizationRequestUri()).matches("https://example.com/login/oauth/authorize\\?response_type=code&client_id=client-id-2&scope=read%3Auser&state=.{15,}&redirect_uri=http%3A%2F%2Flocalhost%2Flogin%2Foauth2%2Fcode%2Fregistration-id-2&queryparam=test&queryparam3=a\\+test\\+with\\+spaces&queryparam2=test");
243+
}
244+
245+
@Test
246+
public void resolveWhenAuthorizationUriIsMalformedWithMultipleQueryParametersThenIgnoresBadInput() {
247+
String queryParams = "queryparam=test&queryparam2=test?badparam=param";
248+
ClientRegistration clientRegistration = this.registration2;
249+
String requestUri = this.authorizationRequestBaseUri + "/" + clientRegistration.getRegistrationId()+"?"+queryParams;
250+
251+
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
252+
request.setServletPath(requestUri);
253+
254+
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
255+
256+
assertThat(authorizationRequest.getAdditionalParameters()).isNotEmpty();
257+
assertThat(authorizationRequest.getAdditionalParameters().size()).isEqualTo(3);
258+
assertThat(authorizationRequest.getAuthorizationRequestUri()).matches("https://example.com/login/oauth/authorize\\?response_type=code&client_id=client-id-2&scope=read%3Auser&state=.{15,}&redirect_uri=http%3A%2F%2Flocalhost%2Flogin%2Foauth2%2Fcode%2Fregistration-id-2&queryparam=test&queryparam2=test");
259+
}
229260
}

0 commit comments

Comments
 (0)