@@ -78,7 +78,7 @@ public void setUp() {
78
78
this .registration2 = TestClientRegistrations .clientRegistration2 ().build ();
79
79
80
80
this .pkceClientRegistration = pkceClientRegistration ().build ();
81
-
81
+ this . nonProofKeyPublicClientRegistration = TestClientRegistrations . publicClientRegistrationWithNoPkce (). build ();
82
82
this .fineRedirectUriTemplateRegistration = fineRedirectUriTemplateClientRegistration ().build ();
83
83
// @formatter:off
84
84
this .publicClientRegistration = TestClientRegistrations .clientRegistration ()
@@ -94,7 +94,7 @@ public void setUp() {
94
94
// @formatter:on
95
95
this .clientRegistrationRepository = new InMemoryClientRegistrationRepository (this .registration1 ,
96
96
this .registration2 , this .pkceClientRegistration , this .fineRedirectUriTemplateRegistration ,
97
- this .publicClientRegistration , this .oidcRegistration );
97
+ this .publicClientRegistration , this .oidcRegistration , nonProofKeyPublicClientRegistration );
98
98
this .resolver = new DefaultOAuth2AuthorizationRequestResolver (this .clientRegistrationRepository ,
99
99
this .authorizationRequestBaseUri );
100
100
}
@@ -176,11 +176,14 @@ public void resolveWhenAuthorizationRequestWithValidClientThenResolves() {
176
176
assertThat (authorizationRequest .getAdditionalParameters ())
177
177
.doesNotContainKey (OAuth2ParameterNames .REGISTRATION_ID );
178
178
assertThat (authorizationRequest .getAttributes ())
179
- .containsExactly (entry (OAuth2ParameterNames .REGISTRATION_ID , clientRegistration .getRegistrationId ()));
179
+ .containsExactly (
180
+ entry (OAuth2ParameterNames .REGISTRATION_ID , clientRegistration .getRegistrationId ()),
181
+ entry (PkceParameterNames .CODE_VERIFIER , authorizationRequest .getAttributes ().get (PkceParameterNames .CODE_VERIFIER ))
182
+ );
180
183
assertThat (authorizationRequest .getAuthorizationRequestUri ())
181
184
.matches ("https://example.com/login/oauth/authorize\\ ?" + "response_type=code&client_id=client-id&"
182
185
+ "scope=read:user&state=.{15,}&"
183
- + "redirect_uri=http://localhost/login/oauth2/code/registration-id" );
186
+ + "redirect_uri=http://localhost/login/oauth2/code/registration-id&code_challenge=.{15,}&code_challenge_method=S256 " );
184
187
}
185
188
186
189
@ Test
@@ -193,7 +196,10 @@ public void resolveWhenClientAuthorizationRequiredExceptionAvailableThenResolves
193
196
clientRegistration .getRegistrationId ());
194
197
assertThat (authorizationRequest ).isNotNull ();
195
198
assertThat (authorizationRequest .getAttributes ())
196
- .containsExactly (entry (OAuth2ParameterNames .REGISTRATION_ID , clientRegistration .getRegistrationId ()));
199
+ .containsExactly (
200
+ entry (OAuth2ParameterNames .REGISTRATION_ID , clientRegistration .getRegistrationId ()),
201
+ entry (PkceParameterNames .CODE_VERIFIER , authorizationRequest .getAttributes ().get (PkceParameterNames .CODE_VERIFIER ))
202
+ );
197
203
}
198
204
199
205
@ Test
@@ -301,7 +307,7 @@ public void resolveWhenAuthorizationRequestIncludesPort80ThenExpandedRedirectUri
301
307
assertThat (authorizationRequest .getAuthorizationRequestUri ())
302
308
.matches ("https://example.com/login/oauth/authorize\\ ?" + "response_type=code&client_id=client-id&"
303
309
+ "scope=read:user&state=.{15,}&"
304
- + "redirect_uri=http://localhost/login/oauth2/code/registration-id" );
310
+ + "redirect_uri=http://localhost/login/oauth2/code/registration-id" + "&code_challenge=.{15,}&code_challenge_method=S256" );
305
311
}
306
312
307
313
@ Test
@@ -317,7 +323,7 @@ public void resolveWhenAuthorizationRequestIncludesPort443ThenExpandedRedirectUr
317
323
assertThat (authorizationRequest .getAuthorizationRequestUri ())
318
324
.matches ("https://example.com/login/oauth/authorize\\ ?" + "response_type=code&client_id=client-id&"
319
325
+ "scope=read:user&state=.{15,}&"
320
- + "redirect_uri=https://example.com/login/oauth2/code/registration-id" );
326
+ + "redirect_uri=https://example.com/login/oauth2/code/registration-id" + "&code_challenge=.{15,}&code_challenge_method=S256" );
321
327
}
322
328
323
329
@ Test
@@ -331,7 +337,7 @@ public void resolveWhenClientAuthorizationRequiredExceptionAvailableThenRedirect
331
337
assertThat (authorizationRequest .getAuthorizationRequestUri ())
332
338
.matches ("https://example.com/login/oauth/authorize\\ ?" + "response_type=code&client_id=client-id&"
333
339
+ "scope=read:user&state=.{15,}&"
334
- + "redirect_uri=http://localhost/authorize/oauth2/code/registration-id" );
340
+ + "redirect_uri=http://localhost/authorize/oauth2/code/registration-id&code_challenge=.{15,}&code_challenge_method=S256 " );
335
341
}
336
342
337
343
@ Test
@@ -344,7 +350,7 @@ public void resolveWhenAuthorizationRequestOAuth2LoginThenRedirectUriIsLogin() {
344
350
assertThat (authorizationRequest .getAuthorizationRequestUri ())
345
351
.matches ("https://example.com/login/oauth/authorize\\ ?" + "response_type=code&client_id=client-id-2&"
346
352
+ "scope=read:user&state=.{15,}&"
347
- + "redirect_uri=http://localhost/login/oauth2/code/registration-id-2" );
353
+ + "redirect_uri=http://localhost/login/oauth2/code/registration-id-2" + "&code_challenge=.{15,}&code_challenge_method=S256" );
348
354
}
349
355
350
356
@ Test
@@ -358,7 +364,7 @@ public void resolveWhenAuthorizationRequestHasActionParameterAuthorizeThenRedire
358
364
assertThat (authorizationRequest .getAuthorizationRequestUri ())
359
365
.matches ("https://example.com/login/oauth/authorize\\ ?" + "response_type=code&client_id=client-id&"
360
366
+ "scope=read:user&state=.{15,}&"
361
- + "redirect_uri=http://localhost/authorize/oauth2/code/registration-id" );
367
+ + "redirect_uri=http://localhost/authorize/oauth2/code/registration-id&code_challenge=.{15,}&code_challenge_method=S256 " );
362
368
}
363
369
364
370
@ Test
@@ -372,7 +378,7 @@ public void resolveWhenAuthorizationRequestHasActionParameterLoginThenRedirectUr
372
378
assertThat (authorizationRequest .getAuthorizationRequestUri ())
373
379
.matches ("https://example.com/login/oauth/authorize\\ ?" + "response_type=code&client_id=client-id-2&"
374
380
+ "scope=read:user&state=.{15,}&"
375
- + "redirect_uri=http://localhost/login/oauth2/code/registration-id-2" );
381
+ + "redirect_uri=http://localhost/login/oauth2/code/registration-id-2&code_challenge=.{15,}&code_challenge_method=S256 " );
376
382
}
377
383
378
384
@ Test
@@ -449,32 +455,6 @@ public void resolveWhenAuthorizationRequestApplyPkceToPublicClientWithRequirePro
449
455
}
450
456
451
457
// gh-6548
452
- @ Test
453
- public void resolveWhenAuthorizationRequestApplyPkceToSpecificConfidentialClientThenApplied () {
454
- this .resolver .setAuthorizationRequestCustomizer ((builder ) -> {
455
- builder .attributes ((attrs ) -> {
456
- String registrationId = (String ) attrs .get (OAuth2ParameterNames .REGISTRATION_ID );
457
- if (this .registration1 .getRegistrationId ().equals (registrationId )) {
458
- OAuth2AuthorizationRequestCustomizers .withPkce ().accept (builder );
459
- }
460
- });
461
- });
462
-
463
- ClientRegistration clientRegistration = this .registration1 ;
464
- String requestUri = this .authorizationRequestBaseUri + "/" + clientRegistration .getRegistrationId ();
465
- MockHttpServletRequest request = new MockHttpServletRequest ("GET" , requestUri );
466
- request .setServletPath (requestUri );
467
- OAuth2AuthorizationRequest authorizationRequest = this .resolver .resolve (request );
468
- assertPkceApplied (authorizationRequest , clientRegistration );
469
-
470
- clientRegistration = this .registration2 ;
471
- requestUri = this .authorizationRequestBaseUri + "/" + clientRegistration .getRegistrationId ();
472
- request = new MockHttpServletRequest ("GET" , requestUri );
473
- request .setServletPath (requestUri );
474
- authorizationRequest = this .resolver .resolve (request );
475
- assertPkceNotApplied (authorizationRequest , clientRegistration );
476
- }
477
-
478
458
private void assertPkceApplied (OAuth2AuthorizationRequest authorizationRequest ,
479
459
ClientRegistration clientRegistration ) {
480
460
assertThat (authorizationRequest .getAdditionalParameters ()).containsKey (PkceParameterNames .CODE_CHALLENGE );
@@ -531,7 +511,7 @@ public void resolveWhenAuthenticationRequestWithValidOidcClientThenResolves() {
531
511
.matches ("https://example.com/login/oauth/authorize\\ ?" + "response_type=code&client_id=client-id&"
532
512
+ "scope=openid&state=.{15,}&"
533
513
+ "redirect_uri=http://localhost/login/oauth2/code/oidc-registration-id&"
534
- + "nonce=([a-zA-Z0-9\\ -\\ .\\ _\\ ~]){43}" );
514
+ + "nonce=([a-zA-Z0-9\\ -\\ .\\ _\\ ~]){43}&code_challenge=.{15,}&code_challenge_method=S256 " );
535
515
}
536
516
537
517
// gh-7696
@@ -551,7 +531,8 @@ public void resolveWhenAuthorizationRequestCustomizerRemovesNonceThenQueryExclud
551
531
assertThat (authorizationRequest .getAuthorizationRequestUri ())
552
532
.matches ("https://example.com/login/oauth/authorize\\ ?" + "response_type=code&client_id=client-id&"
553
533
+ "scope=openid&state=.{15,}&"
554
- + "redirect_uri=http://localhost/login/oauth2/code/oidc-registration-id" );
534
+ + "redirect_uri=http://localhost/login/oauth2/code/oidc-registration-id&" +
535
+ "code_challenge=.{15,}&code_challenge_method=S256" );
555
536
}
556
537
557
538
@ Test
@@ -569,7 +550,7 @@ public void resolveWhenAuthorizationRequestCustomizerAddsParameterThenQueryInclu
569
550
.matches ("https://example.com/login/oauth/authorize\\ ?" + "response_type=code&client_id=client-id&"
570
551
+ "scope=openid&state=.{15,}&"
571
552
+ "redirect_uri=http://localhost/login/oauth2/code/oidc-registration-id&"
572
- + "nonce=([a-zA-Z0-9\\ -\\ .\\ _\\ ~]){43}& " + "param1=value1" );
553
+ + "nonce=([a-zA-Z0-9\\ -\\ .\\ _\\ ~]){43}" + "&code_challenge=.{15,}&code_challenge_method=S256& param1=value1" );
573
554
}
574
555
575
556
@ Test
@@ -586,7 +567,7 @@ public void resolveWhenAuthorizationRequestCustomizerOverridesParameterThenQuery
586
567
assertThat (authorizationRequest .getAuthorizationRequestUri ()).matches (
587
568
"https://example.com/login/oauth/authorize\\ ?" + "response_type=code&" + "scope=openid&state=.{15,}&"
588
569
+ "redirect_uri=http://localhost/login/oauth2/code/oidc-registration-id&"
589
- + "nonce=([a-zA-Z0-9\\ -\\ .\\ _\\ ~]){43}& " + "appid=client-id" );
570
+ + "nonce=([a-zA-Z0-9\\ -\\ .\\ _\\ ~]){43}" + "&code_challenge=.{15,}&code_challenge_method=S256& appid=client-id" );
590
571
}
591
572
592
573
@ Test
0 commit comments