Skip to content

Commit d77b12d

Browse files
committed
authorization_uri Uses UriComponentsBuilder
Because of this, authorization_uri can now be a fully-qualified url. Fixes: gh-5760
1 parent 9c0d78d commit d77b12d

File tree

7 files changed

+134
-49
lines changed

7 files changed

+134
-49
lines changed

config/src/test/java/org/springframework/security/config/annotation/web/configurers/oauth2/client/OAuth2ClientConfigurerTests.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,10 @@ public void configureWhenAuthorizationCodeRequestThenRedirectForAuthorization()
135135
MvcResult mvcResult = this.mockMvc.perform(get("/oauth2/authorization/registration-1"))
136136
.andExpect(status().is3xxRedirection())
137137
.andReturn();
138-
assertThat(mvcResult.getResponse().getRedirectedUrl()).matches("https://provider.com/oauth2/authorize\\?response_type=code&client_id=client-1&scope=user&state=.{15,}&redirect_uri=http%3A%2F%2Flocalhost%2Fclient-1");
138+
assertThat(mvcResult.getResponse().getRedirectedUrl()).matches("https://provider.com/oauth2/authorize\\?" +
139+
"response_type=code&client_id=client-1&" +
140+
"scope=user&state=.{15,}&" +
141+
"redirect_uri=http://localhost/client-1");
139142
}
140143

141144
@Test
@@ -184,7 +187,10 @@ public void configureWhenRequestCacheProvidedAndClientAuthorizationRequiredExcep
184187
MvcResult mvcResult = this.mockMvc.perform(get("/resource1").with(user("user1")))
185188
.andExpect(status().is3xxRedirection())
186189
.andReturn();
187-
assertThat(mvcResult.getResponse().getRedirectedUrl()).matches("https://provider.com/oauth2/authorize\\?response_type=code&client_id=client-1&scope=user&state=.{15,}&redirect_uri=http%3A%2F%2Flocalhost%2Fclient-1");
190+
assertThat(mvcResult.getResponse().getRedirectedUrl()).matches("https://provider.com/oauth2/authorize\\?" +
191+
"response_type=code&client_id=client-1&" +
192+
"scope=user&state=.{15,}&" +
193+
"redirect_uri=http://localhost/client-1");
188194

189195
verify(requestCache).saveRequest(any(HttpServletRequest.class), any(HttpServletResponse.class));
190196
}

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

+35-7
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,11 @@ public void resolveWhenAuthorizationRequestWithValidClientThenResolves() {
107107
assertThat(authorizationRequest.getState()).isNotNull();
108108
assertThat(authorizationRequest.getAdditionalParameters())
109109
.containsExactly(entry(OAuth2ParameterNames.REGISTRATION_ID, clientRegistration.getRegistrationId()));
110-
assertThat(authorizationRequest.getAuthorizationRequestUri()).matches("https://example.com/login/oauth/authorize\\?response_type=code&client_id=client-id&scope=read%3Auser&state=.{15,}&redirect_uri=http%3A%2F%2Flocalhost%2Flogin%2Foauth2%2Fcode%2Fregistration-id");
110+
assertThat(authorizationRequest.getAuthorizationRequestUri())
111+
.matches("https://example.com/login/oauth/authorize\\?" +
112+
"response_type=code&client_id=client-id&" +
113+
"scope=read:user&state=.{15,}&" +
114+
"redirect_uri=http://localhost/login/oauth2/code/registration-id");
111115
}
112116

113117
@Test
@@ -164,7 +168,11 @@ public void resolveWhenAuthorizationRequestIncludesPort80ThenExpandedRedirectUri
164168
request.setServletPath(requestUri);
165169

166170
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
167-
assertThat(authorizationRequest.getAuthorizationRequestUri()).matches("https://example.com/login/oauth/authorize\\?response_type=code&client_id=client-id&scope=read%3Auser&state=.{15,}&redirect_uri=http%3A%2F%2Fexample.com%2Flogin%2Foauth2%2Fcode%2Fregistration-id");
171+
assertThat(authorizationRequest.getAuthorizationRequestUri())
172+
.matches("https://example.com/login/oauth/authorize\\?" +
173+
"response_type=code&client_id=client-id&" +
174+
"scope=read:user&state=.{15,}&" +
175+
"redirect_uri=http://example.com/login/oauth2/code/registration-id");
168176
}
169177

170178
@Test
@@ -178,7 +186,11 @@ public void resolveWhenAuthorizationRequestIncludesPort443ThenExpandedRedirectUr
178186
request.setServletPath(requestUri);
179187

180188
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
181-
assertThat(authorizationRequest.getAuthorizationRequestUri()).matches("https://example.com/login/oauth/authorize\\?response_type=code&client_id=client-id&scope=read%3Auser&state=.{15,}&redirect_uri=https%3A%2F%2Fexample.com%2Flogin%2Foauth2%2Fcode%2Fregistration-id");
189+
assertThat(authorizationRequest.getAuthorizationRequestUri())
190+
.matches("https://example.com/login/oauth/authorize\\?" +
191+
"response_type=code&client_id=client-id&" +
192+
"scope=read:user&state=.{15,}&" +
193+
"redirect_uri=https://example.com/login/oauth2/code/registration-id");
182194
}
183195

184196
@Test
@@ -189,7 +201,11 @@ public void resolveWhenClientAuthorizationRequiredExceptionAvailableThenRedirect
189201
request.setServletPath(requestUri);
190202

191203
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request, clientRegistration.getRegistrationId());
192-
assertThat(authorizationRequest.getAuthorizationRequestUri()).matches("https://example.com/login/oauth/authorize\\?response_type=code&client_id=client-id&scope=read%3Auser&state=.{15,}&redirect_uri=http%3A%2F%2Flocalhost%2Fauthorize%2Foauth2%2Fcode%2Fregistration-id");
204+
assertThat(authorizationRequest.getAuthorizationRequestUri())
205+
.matches("https://example.com/login/oauth/authorize\\?" +
206+
"response_type=code&client_id=client-id&" +
207+
"scope=read:user&state=.{15,}&" +
208+
"redirect_uri=http://localhost/authorize/oauth2/code/registration-id");
193209
}
194210

195211
@Test
@@ -200,7 +216,11 @@ public void resolveWhenAuthorizationRequestOAuth2LoginThenRedirectUriIsLogin() {
200216
request.setServletPath(requestUri);
201217

202218
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
203-
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");
219+
assertThat(authorizationRequest.getAuthorizationRequestUri())
220+
.matches("https://example.com/login/oauth/authorize\\?" +
221+
"response_type=code&client_id=client-id-2&" +
222+
"scope=read:user&state=.{15,}&" +
223+
"redirect_uri=http://localhost/login/oauth2/code/registration-id-2");
204224
}
205225

206226
@Test
@@ -212,7 +232,11 @@ public void resolveWhenAuthorizationRequestHasActionParameterAuthorizeThenRedire
212232
request.setServletPath(requestUri);
213233

214234
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
215-
assertThat(authorizationRequest.getAuthorizationRequestUri()).matches("https://example.com/login/oauth/authorize\\?response_type=code&client_id=client-id&scope=read%3Auser&state=.{15,}&redirect_uri=http%3A%2F%2Flocalhost%2Fauthorize%2Foauth2%2Fcode%2Fregistration-id");
235+
assertThat(authorizationRequest.getAuthorizationRequestUri())
236+
.matches("https://example.com/login/oauth/authorize\\?" +
237+
"response_type=code&client_id=client-id&" +
238+
"scope=read:user&state=.{15,}&" +
239+
"redirect_uri=http://localhost/authorize/oauth2/code/registration-id");
216240
}
217241

218242
@Test
@@ -224,6 +248,10 @@ public void resolveWhenAuthorizationRequestHasActionParameterLoginThenRedirectUr
224248
request.setServletPath(requestUri);
225249

226250
OAuth2AuthorizationRequest authorizationRequest = this.resolver.resolve(request);
227-
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");
251+
assertThat(authorizationRequest.getAuthorizationRequestUri())
252+
.matches("https://example.com/login/oauth/authorize\\?" +
253+
"response_type=code&client_id=client-id-2&" +
254+
"scope=read:user&state=.{15,}&" +
255+
"redirect_uri=http://localhost/login/oauth2/code/registration-id-2");
228256
}
229257
}

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

+26-6
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,10 @@ public void doFilterWhenAuthorizationRequestOAuth2LoginThenRedirectForAuthorizat
151151

152152
verifyZeroInteractions(filterChain);
153153

154-
assertThat(response.getRedirectedUrl()).matches("https://example.com/login/oauth/authorize\\?response_type=code&client_id=client-id&scope=read%3Auser&state=.{15,}&redirect_uri=http%3A%2F%2Flocalhost%2Flogin%2Foauth2%2Fcode%2Fregistration-id");
154+
assertThat(response.getRedirectedUrl()).matches("https://example.com/login/oauth/authorize\\?" +
155+
"response_type=code&client_id=client-id&" +
156+
"scope=read:user&state=.{15,}&" +
157+
"redirect_uri=http://localhost/login/oauth2/code/registration-id");
155158
}
156159

157160
@Test
@@ -187,7 +190,10 @@ public void doFilterWhenAuthorizationRequestImplicitGrantThenRedirectForAuthoriz
187190

188191
verifyZeroInteractions(filterChain);
189192

190-
assertThat(response.getRedirectedUrl()).matches("https://example.com/login/oauth/authorize\\?response_type=token&client_id=client-id&scope=read%3Auser&state=.{15,}&redirect_uri=http%3A%2F%2Flocalhost%2Fauthorize%2Foauth2%2Fimplicit%2Fregistration-3");
193+
assertThat(response.getRedirectedUrl()).matches("https://example.com/login/oauth/authorize\\?" +
194+
"response_type=token&client_id=client-id&" +
195+
"scope=read:user&state=.{15,}&" +
196+
"redirect_uri=http://localhost/authorize/oauth2/implicit/registration-3");
191197
}
192198

193199
@Test
@@ -225,7 +231,10 @@ public void doFilterWhenCustomAuthorizationRequestBaseUriThenRedirectForAuthoriz
225231

226232
verifyZeroInteractions(filterChain);
227233

228-
assertThat(response.getRedirectedUrl()).matches("https://example.com/login/oauth/authorize\\?response_type=code&client_id=client-id&scope=read%3Auser&state=.{15,}&redirect_uri=http%3A%2F%2Flocalhost%2Flogin%2Foauth2%2Fcode%2Fregistration-id");
234+
assertThat(response.getRedirectedUrl()).matches("https://example.com/login/oauth/authorize\\?" +
235+
"response_type=code&client_id=client-id&" +
236+
"scope=read:user&state=.{15,}&" +
237+
"redirect_uri=http://localhost/login/oauth2/code/registration-id");
229238
}
230239

231240
@Test
@@ -243,7 +252,10 @@ public void doFilterWhenNotAuthorizationRequestAndClientAuthorizationRequiredExc
243252

244253
verify(filterChain).doFilter(any(HttpServletRequest.class), any(HttpServletResponse.class));
245254

246-
assertThat(response.getRedirectedUrl()).matches("https://example.com/login/oauth/authorize\\?response_type=code&client_id=client-id&scope=read%3Auser&state=.{15,}&redirect_uri=http%3A%2F%2Flocalhost%2Fauthorize%2Foauth2%2Fcode%2Fregistration-id");
255+
assertThat(response.getRedirectedUrl()).matches("https://example.com/login/oauth/authorize\\?" +
256+
"response_type=code&client_id=client-id&" +
257+
"scope=read:user&state=.{15,}&" +
258+
"redirect_uri=http://localhost/authorize/oauth2/code/registration-id");
247259
verify(this.requestCache).saveRequest(any(HttpServletRequest.class), any(HttpServletResponse.class));
248260
}
249261

@@ -298,7 +310,11 @@ public void doFilterWhenAuthorizationRequestAndAdditionalParametersProvidedThenA
298310

299311
verifyZeroInteractions(filterChain);
300312

301-
assertThat(response.getRedirectedUrl()).matches("https://example.com/login/oauth/authorize\\?response_type=code&client_id=client-id&scope=read%3Auser&state=.{15,}&redirect_uri=http%3A%2F%2Flocalhost%2Flogin%2Foauth2%2Fcode%2Fregistration-id&idp=https%3A%2F%2Fother.provider.com");
313+
assertThat(response.getRedirectedUrl()).matches("https://example.com/login/oauth/authorize\\?" +
314+
"response_type=code&client_id=client-id&" +
315+
"scope=read:user&state=.{15,}&" +
316+
"redirect_uri=http://localhost/login/oauth2/code/registration-id&" +
317+
"idp=https://other.provider.com");
302318
}
303319

304320
// gh-4911, gh-5244
@@ -339,6 +355,10 @@ public void doFilterWhenAuthorizationRequestAndCustomAuthorizationRequestUriSetT
339355

340356
verifyZeroInteractions(filterChain);
341357

342-
assertThat(response.getRedirectedUrl()).matches("https://example.com/login/oauth/authorize\\?response_type=code&client_id=client-id&scope=read%3Auser&state=.{15,}&redirect_uri=http%3A%2F%2Flocalhost%2Flogin%2Foauth2%2Fcode%2Fregistration-id&login_hint=user@provider\\.com");
358+
assertThat(response.getRedirectedUrl()).matches("https://example.com/login/oauth/authorize\\?" +
359+
"response_type=code&client_id=client-id&" +
360+
"scope=read:user&state=.{15,}&" +
361+
"redirect_uri=http://localhost/login/oauth2/code/registration-id&" +
362+
"login_hint=user@provider\\.com");
343363
}
344364
}

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,10 @@ public void resolveWhenClientRegistrationFoundThenWorks() {
7777

7878
OAuth2AuthorizationRequest request = resolve("/oauth2/authorization/not-found-id");
7979

80-
assertThat(request.getAuthorizationRequestUri()).matches("https://example.com/login/oauth/authorize\\?response_type=code&client_id=client-id&scope=read%3Auser&state=.*?&redirect_uri=%2Flogin%2Foauth2%2Fcode%2Fregistration-id");
80+
assertThat(request.getAuthorizationRequestUri()).matches("https://example.com/login/oauth/authorize\\?" +
81+
"response_type=code&client_id=client-id&" +
82+
"scope=read:user&state=.*?&" +
83+
"redirect_uri=/login/oauth2/code/registration-id");
8184
}
8285

8386
private OAuth2AuthorizationRequest resolve(String path) {

oauth2/oauth2-core/spring-security-oauth2-core.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ apply plugin: 'io.spring.convention.spring-module'
33
dependencies {
44
compile project(':spring-security-core')
55
compile springCoreDependency
6+
compile 'org.springframework:spring-web'
67

78
optional 'com.fasterxml.jackson.core:jackson-databind'
89
optional 'com.nimbusds:oauth2-oidc-sdk'

oauth2/oauth2-core/src/main/java/org/springframework/security/oauth2/core/endpoint/OAuth2AuthorizationRequest.java

+22-25
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,25 @@
1515
*/
1616
package org.springframework.security.oauth2.core.endpoint;
1717

18-
import org.springframework.security.core.SpringSecurityCoreVersion;
19-
import org.springframework.security.oauth2.core.AuthorizationGrantType;
20-
import org.springframework.util.Assert;
21-
import org.springframework.util.CollectionUtils;
22-
import org.springframework.util.StringUtils;
23-
2418
import java.io.Serializable;
25-
import java.io.UnsupportedEncodingException;
26-
import java.net.URLEncoder;
19+
import java.nio.charset.StandardCharsets;
2720
import java.util.Arrays;
2821
import java.util.Collections;
2922
import java.util.LinkedHashMap;
3023
import java.util.LinkedHashSet;
3124
import java.util.Map;
3225
import java.util.Set;
33-
import java.util.StringJoiner;
3426
import java.util.stream.Collectors;
3527

28+
import org.springframework.security.core.SpringSecurityCoreVersion;
29+
import org.springframework.security.oauth2.core.AuthorizationGrantType;
30+
import org.springframework.util.Assert;
31+
import org.springframework.util.CollectionUtils;
32+
import org.springframework.util.LinkedMultiValueMap;
33+
import org.springframework.util.MultiValueMap;
34+
import org.springframework.util.StringUtils;
35+
import org.springframework.web.util.UriComponentsBuilder;
36+
3637
/**
3738
* A representation of an OAuth 2.0 Authorization Request
3839
* for the authorization code grant type or implicit grant type.
@@ -336,34 +337,30 @@ public OAuth2AuthorizationRequest build() {
336337
}
337338

338339
private String buildAuthorizationRequestUri() {
339-
Map<String, String> parameters = new LinkedHashMap<>();
340-
parameters.put(OAuth2ParameterNames.RESPONSE_TYPE, this.responseType.getValue());
341-
parameters.put(OAuth2ParameterNames.CLIENT_ID, this.clientId);
340+
MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
341+
parameters.set(OAuth2ParameterNames.RESPONSE_TYPE, this.responseType.getValue());
342+
parameters.set(OAuth2ParameterNames.CLIENT_ID, this.clientId);
342343
if (!CollectionUtils.isEmpty(this.scopes)) {
343-
parameters.put(OAuth2ParameterNames.SCOPE,
344+
parameters.set(OAuth2ParameterNames.SCOPE,
344345
StringUtils.collectionToDelimitedString(this.scopes, " "));
345346
}
346347
if (this.state != null) {
347-
parameters.put(OAuth2ParameterNames.STATE, this.state);
348+
parameters.set(OAuth2ParameterNames.STATE, this.state);
348349
}
349350
if (this.redirectUri != null) {
350-
parameters.put(OAuth2ParameterNames.REDIRECT_URI, this.redirectUri);
351+
parameters.set(OAuth2ParameterNames.REDIRECT_URI, this.redirectUri);
351352
}
352353
if (!CollectionUtils.isEmpty(this.additionalParameters)) {
353354
this.additionalParameters.entrySet().stream()
354355
.filter(e -> !e.getKey().equals(OAuth2ParameterNames.REGISTRATION_ID))
355-
.forEach(e -> parameters.put(e.getKey(), e.getValue().toString()));
356+
.forEach(e -> parameters.set(e.getKey(), e.getValue().toString()));
356357
}
357358

358-
try {
359-
StringJoiner queryParams = new StringJoiner("&");
360-
for (String paramName : parameters.keySet()) {
361-
queryParams.add(paramName + "=" + URLEncoder.encode(parameters.get(paramName), "UTF-8"));
362-
}
363-
return this.authorizationUri + "?" + queryParams.toString();
364-
} catch (UnsupportedEncodingException ex) {
365-
throw new IllegalArgumentException("Unable to build authorization request uri: " + ex.getMessage(), ex);
366-
}
359+
return UriComponentsBuilder.fromHttpUrl(this.authorizationUri)
360+
.queryParams(parameters)
361+
.encode(StandardCharsets.UTF_8)
362+
.build()
363+
.toUriString();
367364
}
368365
}
369366
}

oauth2/oauth2-core/src/test/java/org/springframework/security/oauth2/core/endpoint/OAuth2AuthorizationRequestTests.java

+38-8
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,19 @@
1515
*/
1616
package org.springframework.security.oauth2.core.endpoint;
1717

18-
import org.junit.Test;
19-
import org.springframework.security.oauth2.core.AuthorizationGrantType;
20-
2118
import java.util.Arrays;
2219
import java.util.HashMap;
2320
import java.util.LinkedHashSet;
2421
import java.util.Map;
2522
import java.util.Set;
2623

27-
import static org.assertj.core.api.Assertions.*;
24+
import org.junit.Test;
25+
26+
import org.springframework.security.oauth2.core.AuthorizationGrantType;
27+
28+
import static org.assertj.core.api.Assertions.assertThat;
29+
import static org.assertj.core.api.Assertions.assertThatCode;
30+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
2831

2932
/**
3033
* Tests for {@link OAuth2AuthorizationRequest}.
@@ -194,7 +197,11 @@ public void buildWhenScopesMultiThenSeparatedByEncodedSpace() {
194197
.state(STATE)
195198
.build();
196199

197-
assertThat(authorizationRequest.getAuthorizationRequestUri()).isEqualTo("https://provider.com/oauth2/authorize?response_type=token&client_id=client-id&scope=scope1+scope2&state=state&redirect_uri=http%3A%2F%2Fexample.com");
200+
assertThat(authorizationRequest.getAuthorizationRequestUri())
201+
.isEqualTo("https://provider.com/oauth2/authorize?" +
202+
"response_type=token&client_id=client-id&" +
203+
"scope=scope1%20scope2&state=state&" +
204+
"redirect_uri=http://example.com");
198205
}
199206

200207
@Test
@@ -226,7 +233,11 @@ public void buildWhenAuthorizationRequestUriNotSetThenDefaultSet() {
226233
.build();
227234

228235
assertThat(authorizationRequest.getAuthorizationRequestUri()).isNotNull();
229-
assertThat(authorizationRequest.getAuthorizationRequestUri()).isEqualTo("https://provider.com/oauth2/authorize?response_type=code&client_id=client-id&scope=scope1+scope2&state=state&redirect_uri=http%3A%2F%2Fexample.com&param1=value1&param2=value2");
236+
assertThat(authorizationRequest.getAuthorizationRequestUri())
237+
.isEqualTo("https://provider.com/oauth2/authorize?" +
238+
"response_type=code&client_id=client-id&" +
239+
"scope=scope1%20scope2&state=state&" +
240+
"redirect_uri=http://example.com&param1=value1&param2=value2");
230241
}
231242

232243
@Test
@@ -248,13 +259,17 @@ public void buildWhenAuthorizationRequestIncludesRegistrationIdParameterThenAuth
248259
OAuth2AuthorizationRequest authorizationRequest = OAuth2AuthorizationRequest.authorizationCode()
249260
.authorizationUri(AUTHORIZATION_URI)
250261
.clientId(CLIENT_ID)
251-
.redirectUri(REDIRECT_URI)
262+
.redirectUri(REDIRECT_URI + "?rparam1=rvalue1&rparam2=rvalue2")
252263
.scopes(SCOPES)
253264
.state(STATE)
254265
.additionalParameters(additionalParameters)
255266
.build();
256267

257-
assertThat(authorizationRequest.getAuthorizationRequestUri()).isEqualTo("https://provider.com/oauth2/authorize?response_type=code&client_id=client-id&scope=scope1+scope2&state=state&redirect_uri=http%3A%2F%2Fexample.com&param1=value1");
268+
assertThat(authorizationRequest.getAuthorizationRequestUri())
269+
.isEqualTo("https://provider.com/oauth2/authorize?" +
270+
"response_type=code&client_id=client-id&" +
271+
"scope=scope1%20scope2&state=state&" +
272+
"redirect_uri=http://example.com?rparam1%3Drvalue1%26rparam2%3Drvalue2&param1=value1");
258273
}
259274

260275
@Test
@@ -290,4 +305,19 @@ public void fromWhenAuthorizationRequestProvidedThenValuesAreCopied() {
290305
assertThat(authorizationRequestCopy.getAdditionalParameters()).isEqualTo(authorizationRequest.getAdditionalParameters());
291306
assertThat(authorizationRequestCopy.getAuthorizationRequestUri()).isEqualTo(authorizationRequest.getAuthorizationRequestUri());
292307
}
308+
309+
@Test
310+
public void buildWhenAuthorizationUriIncludesQueryParameterThenAuthorizationRequestUrlIncludesIt() {
311+
OAuth2AuthorizationRequest authorizationRequest =
312+
TestOAuth2AuthorizationRequests.request()
313+
.authorizationUri(AUTHORIZATION_URI +
314+
"?param1=value1&param2=value2").build();
315+
316+
assertThat(authorizationRequest.getAuthorizationRequestUri()).isNotNull();
317+
assertThat(authorizationRequest.getAuthorizationRequestUri())
318+
.isEqualTo("https://provider.com/oauth2/authorize?" +
319+
"param1=value1&param2=value2&" +
320+
"response_type=code&client_id=client-id&state=state&" +
321+
"redirect_uri=https://example.com/authorize/oauth2/code/registration-id");
322+
}
293323
}

0 commit comments

Comments
 (0)