41
41
public class DefaultOAuth2AuthorizationRequestResolverTests {
42
42
private ClientRegistration registration1 ;
43
43
private ClientRegistration registration2 ;
44
+ private ClientRegistration fineRedirectUriTemplateRegistration ;
44
45
private ClientRegistration pkceRegistration ;
45
46
private ClientRegistrationRepository clientRegistrationRepository ;
46
- private String authorizationRequestBaseUri = "/oauth2/authorization" ;
47
+ private final String authorizationRequestBaseUri = "/oauth2/authorization" ;
47
48
private DefaultOAuth2AuthorizationRequestResolver resolver ;
48
49
49
50
@ Before
50
51
public void setUp () {
51
52
this .registration1 = TestClientRegistrations .clientRegistration ().build ();
52
53
this .registration2 = TestClientRegistrations .clientRegistration2 ().build ();
54
+ this .fineRedirectUriTemplateRegistration = fineRedirectUriTemplateClientRegistration ().build ();
53
55
this .pkceRegistration = TestClientRegistrations .clientRegistration ()
54
56
.registrationId ("pkce-client-registration-id" )
55
57
.clientId ("pkce-client-id" )
@@ -58,7 +60,7 @@ public void setUp() {
58
60
.build ();
59
61
60
62
this .clientRegistrationRepository = new InMemoryClientRegistrationRepository (
61
- this .registration1 , this .registration2 , this .pkceRegistration );
63
+ this .registration1 , this .registration2 , this .fineRedirectUriTemplateRegistration , this . pkceRegistration );
62
64
this .resolver = new DefaultOAuth2AuthorizationRequestResolver (
63
65
this .clientRegistrationRepository , this .authorizationRequestBaseUri );
64
66
}
@@ -152,6 +154,80 @@ public void resolveWhenAuthorizationRequestRedirectUriTemplatedThenRedirectUriEx
152
154
"http://localhost/login/oauth2/code/" + clientRegistration .getRegistrationId ());
153
155
}
154
156
157
+ @ Test
158
+ public void resolveWhenAuthorizationRequestRedirectUriTemplatedThenHttpRedirectUriWithExtraVarsExpanded () {
159
+ ClientRegistration clientRegistration = this .fineRedirectUriTemplateRegistration ;
160
+ String requestUri = this .authorizationRequestBaseUri + "/" + clientRegistration .getRegistrationId ();
161
+ MockHttpServletRequest request = new MockHttpServletRequest ("GET" , requestUri );
162
+ request .setServerPort (8080 );
163
+ request .setServletPath (requestUri );
164
+
165
+ OAuth2AuthorizationRequest authorizationRequest = this .resolver .resolve (request );
166
+ assertThat (authorizationRequest .getRedirectUri ()).isNotEqualTo (clientRegistration .getRedirectUriTemplate ());
167
+ assertThat (authorizationRequest .getRedirectUri ()).isEqualTo (
168
+ "http://localhost:8080/login/oauth2/code/" + clientRegistration .getRegistrationId ());
169
+ }
170
+
171
+ @ Test
172
+ public void resolveWhenAuthorizationRequestRedirectUriTemplatedThenHttpsRedirectUriWithExtraVarsExpanded () {
173
+ ClientRegistration clientRegistration = this .fineRedirectUriTemplateRegistration ;
174
+ String requestUri = this .authorizationRequestBaseUri + "/" + clientRegistration .getRegistrationId ();
175
+ MockHttpServletRequest request = new MockHttpServletRequest ("GET" , requestUri );
176
+ request .setScheme ("https" );
177
+ request .setServerPort (8081 );
178
+ request .setServletPath (requestUri );
179
+
180
+ OAuth2AuthorizationRequest authorizationRequest = this .resolver .resolve (request );
181
+ assertThat (authorizationRequest .getRedirectUri ()).isNotEqualTo (clientRegistration .getRedirectUriTemplate ());
182
+ assertThat (authorizationRequest .getRedirectUri ()).isEqualTo (
183
+ "https://localhost:8081/login/oauth2/code/" + clientRegistration .getRegistrationId ());
184
+ }
185
+
186
+ @ Test
187
+ public void resolveWhenAuthorizationRequestIncludesPort80ThenExpandedRedirectUriWithExtraVarsExcludesPort () {
188
+ ClientRegistration clientRegistration = this .fineRedirectUriTemplateRegistration ;
189
+ String requestUri = this .authorizationRequestBaseUri + "/" + clientRegistration .getRegistrationId ();
190
+ MockHttpServletRequest request = new MockHttpServletRequest ("GET" , requestUri );
191
+ request .setScheme ("http" );
192
+ request .setServerPort (80 );
193
+ request .setServletPath (requestUri );
194
+
195
+ OAuth2AuthorizationRequest authorizationRequest = this .resolver .resolve (request );
196
+ assertThat (authorizationRequest .getRedirectUri ()).isNotEqualTo (clientRegistration .getRedirectUriTemplate ());
197
+ assertThat (authorizationRequest .getRedirectUri ()).isEqualTo (
198
+ "http://localhost/login/oauth2/code/" + clientRegistration .getRegistrationId ());
199
+ }
200
+
201
+ @ Test
202
+ public void resolveWhenAuthorizationRequestIncludesPort443ThenExpandedRedirectUriWithExtraVarsExcludesPort () {
203
+ ClientRegistration clientRegistration = this .fineRedirectUriTemplateRegistration ;
204
+ String requestUri = this .authorizationRequestBaseUri + "/" + clientRegistration .getRegistrationId ();
205
+ MockHttpServletRequest request = new MockHttpServletRequest ("GET" , requestUri );
206
+ request .setScheme ("https" );
207
+ request .setServerPort (443 );
208
+ request .setServletPath (requestUri );
209
+
210
+ OAuth2AuthorizationRequest authorizationRequest = this .resolver .resolve (request );
211
+ assertThat (authorizationRequest .getRedirectUri ()).isNotEqualTo (clientRegistration .getRedirectUriTemplate ());
212
+ assertThat (authorizationRequest .getRedirectUri ()).isEqualTo (
213
+ "https://localhost/login/oauth2/code/" + clientRegistration .getRegistrationId ());
214
+ }
215
+
216
+ @ Test
217
+ public void resolveWhenAuthorizationRequestHasNoPortThenExpandedRedirectUriWithExtraVarsExcludesPort () {
218
+ ClientRegistration clientRegistration = this .fineRedirectUriTemplateRegistration ;
219
+ String requestUri = this .authorizationRequestBaseUri + "/" + clientRegistration .getRegistrationId ();
220
+ MockHttpServletRequest request = new MockHttpServletRequest ("GET" , requestUri );
221
+ request .setScheme ("https" );
222
+ request .setServerPort (-1 );
223
+ request .setServletPath (requestUri );
224
+
225
+ OAuth2AuthorizationRequest authorizationRequest = this .resolver .resolve (request );
226
+ assertThat (authorizationRequest .getRedirectUri ()).isNotEqualTo (clientRegistration .getRedirectUriTemplate ());
227
+ assertThat (authorizationRequest .getRedirectUri ()).isEqualTo (
228
+ "https://localhost/login/oauth2/code/" + clientRegistration .getRegistrationId ());
229
+ }
230
+
155
231
// gh-5520
156
232
@ Test
157
233
public void resolveWhenAuthorizationRequestRedirectUriTemplatedThenRedirectUriExpandedExcludesQueryString () {
@@ -301,4 +377,19 @@ public void resolveWhenAuthorizationRequestWithValidPkceClientThenResolves() {
301
377
"code_challenge_method=S256&" +
302
378
"code_challenge=([a-zA-Z0-9\\ -\\ .\\ _\\ ~]){43}" );
303
379
}
380
+
381
+ private static ClientRegistration .Builder fineRedirectUriTemplateClientRegistration () {
382
+ return ClientRegistration .withRegistrationId ("fine-redirect-uri-template-client-registration" )
383
+ .redirectUriTemplate ("{baseScheme}://{baseHost}{basePort}{basePath}/{action}/oauth2/code/{registrationId}" )
384
+ .clientAuthenticationMethod (ClientAuthenticationMethod .BASIC )
385
+ .authorizationGrantType (AuthorizationGrantType .AUTHORIZATION_CODE )
386
+ .scope ("read:user" )
387
+ .authorizationUri ("https://example.com/login/oauth/authorize" )
388
+ .tokenUri ("https://example.com/login/oauth/access_token" )
389
+ .userInfoUri ("https://api.example.com/user" )
390
+ .userNameAttributeName ("id" )
391
+ .clientName ("Fine Redirect Uri Template Client" )
392
+ .clientId ("fine-redirect-uri-template-client" )
393
+ .clientSecret ("client-secret" );
394
+ }
304
395
}
0 commit comments