26
26
import java .time .temporal .ChronoUnit ;
27
27
import java .util .Arrays ;
28
28
import java .util .Base64 ;
29
+ import java .util .HashMap ;
29
30
import java .util .HashSet ;
30
31
import java .util .List ;
31
32
import java .util .Map ;
@@ -359,7 +360,7 @@ public void requestWhenTokenRequestValidThenReturnAccessTokenResponse() throws E
359
360
RegisteredClient registeredClient = TestRegisteredClients .registeredClient ().build ();
360
361
this .registeredClientRepository .save (registeredClient );
361
362
362
- OAuth2Authorization authorization = TestOAuth2Authorizations . authorization (registeredClient ). build ( );
363
+ OAuth2Authorization authorization = createAuthorization (registeredClient );
363
364
this .authorizationService .save (authorization );
364
365
365
366
OAuth2AccessTokenResponse accessTokenResponse = assertTokenRequestReturnsAccessTokenResponse (registeredClient ,
@@ -384,7 +385,7 @@ public void requestWhenTokenRequestCustomEndpointThenReturnAccessTokenResponse()
384
385
RegisteredClient registeredClient = TestRegisteredClients .registeredClient ().build ();
385
386
this .registeredClientRepository .save (registeredClient );
386
387
387
- OAuth2Authorization authorization = TestOAuth2Authorizations . authorization (registeredClient ). build ( );
388
+ OAuth2Authorization authorization = createAuthorization (registeredClient );
388
389
this .authorizationService .save (authorization );
389
390
390
391
assertTokenRequestReturnsAccessTokenResponse (registeredClient , authorization ,
@@ -433,8 +434,6 @@ public void requestWhenPublicClientWithPkceThenReturnAccessTokenResponse() throw
433
434
MvcResult mvcResult = this .mvc
434
435
.perform (get (DEFAULT_AUTHORIZATION_ENDPOINT_URI )
435
436
.queryParams (getAuthorizationRequestParameters (registeredClient ))
436
- .queryParam (PkceParameterNames .CODE_CHALLENGE , S256_CODE_CHALLENGE )
437
- .queryParam (PkceParameterNames .CODE_CHALLENGE_METHOD , "S256" )
438
437
.with (user ("user" )))
439
438
.andExpect (status ().is3xxRedirection ())
440
439
.andReturn ();
@@ -451,8 +450,7 @@ public void requestWhenPublicClientWithPkceThenReturnAccessTokenResponse() throw
451
450
this .mvc
452
451
.perform (post (DEFAULT_TOKEN_ENDPOINT_URI )
453
452
.params (getTokenRequestParameters (registeredClient , authorizationCodeAuthorization ))
454
- .param (OAuth2ParameterNames .CLIENT_ID , registeredClient .getClientId ())
455
- .param (PkceParameterNames .CODE_VERIFIER , S256_CODE_VERIFIER ))
453
+ .param (OAuth2ParameterNames .CLIENT_ID , registeredClient .getClientId ()))
456
454
.andExpect (header ().string (HttpHeaders .CACHE_CONTROL , containsString ("no-store" )))
457
455
.andExpect (header ().string (HttpHeaders .PRAGMA , containsString ("no-cache" )))
458
456
.andExpect (status ().isOk ())
@@ -487,8 +485,6 @@ public void requestWhenPublicClientWithPkceAndCustomRefreshTokenGeneratorThenRet
487
485
MvcResult mvcResult = this .mvc
488
486
.perform (get (DEFAULT_AUTHORIZATION_ENDPOINT_URI )
489
487
.queryParams (getAuthorizationRequestParameters (registeredClient ))
490
- .queryParam (PkceParameterNames .CODE_CHALLENGE , S256_CODE_CHALLENGE )
491
- .queryParam (PkceParameterNames .CODE_CHALLENGE_METHOD , "S256" )
492
488
.with (user ("user" )))
493
489
.andExpect (status ().is3xxRedirection ())
494
490
.andReturn ();
@@ -505,8 +501,7 @@ public void requestWhenPublicClientWithPkceAndCustomRefreshTokenGeneratorThenRet
505
501
this .mvc
506
502
.perform (post (DEFAULT_TOKEN_ENDPOINT_URI )
507
503
.params (getTokenRequestParameters (registeredClient , authorizationCodeAuthorization ))
508
- .param (OAuth2ParameterNames .CLIENT_ID , registeredClient .getClientId ())
509
- .param (PkceParameterNames .CODE_VERIFIER , S256_CODE_VERIFIER ))
504
+ .param (OAuth2ParameterNames .CLIENT_ID , registeredClient .getClientId ()))
510
505
.andExpect (header ().string (HttpHeaders .CACHE_CONTROL , containsString ("no-store" )))
511
506
.andExpect (header ().string (HttpHeaders .PRAGMA , containsString ("no-cache" )))
512
507
.andExpect (status ().isOk ())
@@ -542,11 +537,11 @@ public void requestWhenPublicClientWithPkceAndEmptyCodeThenBadRequest() throws E
542
537
tokenRequestParameters .set (OAuth2ParameterNames .CODE , "" );
543
538
tokenRequestParameters .set (OAuth2ParameterNames .REDIRECT_URI ,
544
539
registeredClient .getRedirectUris ().iterator ().next ());
540
+ tokenRequestParameters .set (PkceParameterNames .CODE_VERIFIER , S256_CODE_VERIFIER );
545
541
546
542
this .mvc
547
543
.perform (post (DEFAULT_TOKEN_ENDPOINT_URI ).params (tokenRequestParameters )
548
- .param (OAuth2ParameterNames .CLIENT_ID , registeredClient .getClientId ())
549
- .param (PkceParameterNames .CODE_VERIFIER , S256_CODE_VERIFIER ))
544
+ .param (OAuth2ParameterNames .CLIENT_ID , registeredClient .getClientId ()))
550
545
.andExpect (status ().isBadRequest ());
551
546
}
552
547
@@ -561,8 +556,6 @@ public void requestWhenConfidentialClientWithPkceAndMissingCodeVerifierThenBadRe
561
556
registeredClient );
562
557
MvcResult mvcResult = this .mvc
563
558
.perform (get (DEFAULT_AUTHORIZATION_ENDPOINT_URI ).queryParams (authorizationRequestParameters )
564
- .queryParam (PkceParameterNames .CODE_CHALLENGE , S256_CODE_CHALLENGE )
565
- .queryParam (PkceParameterNames .CODE_CHALLENGE_METHOD , "S256" )
566
559
.with (user ("user" )))
567
560
.andExpect (status ().is3xxRedirection ())
568
561
.andReturn ();
@@ -577,9 +570,12 @@ public void requestWhenConfidentialClientWithPkceAndMissingCodeVerifierThenBadRe
577
570
assertThat (authorizationCodeAuthorization .getAuthorizationGrantType ())
578
571
.isEqualTo (AuthorizationGrantType .AUTHORIZATION_CODE );
579
572
573
+ MultiValueMap <String , String > tokenRequestParameters = getTokenRequestParameters (registeredClient ,
574
+ authorizationCodeAuthorization );
575
+ tokenRequestParameters .remove (PkceParameterNames .CODE_VERIFIER );
576
+
580
577
this .mvc
581
- .perform (post (DEFAULT_TOKEN_ENDPOINT_URI )
582
- .params (getTokenRequestParameters (registeredClient , authorizationCodeAuthorization ))
578
+ .perform (post (DEFAULT_TOKEN_ENDPOINT_URI ).params (tokenRequestParameters )
583
579
.param (OAuth2ParameterNames .CLIENT_ID , registeredClient .getClientId ())
584
580
.header (HttpHeaders .AUTHORIZATION , getAuthorizationHeader (registeredClient )))
585
581
.andExpect (status ().isBadRequest ());
@@ -595,11 +591,12 @@ public void requestWhenConfidentialClientWithPkceAndMissingCodeChallengeThenErro
595
591
RegisteredClient registeredClient = TestRegisteredClients .registeredClient ().redirectUris ((redirectUris ) -> {
596
592
redirectUris .clear ();
597
593
redirectUris .add (redirectUri );
598
- }).clientSettings ( ClientSettings . builder (). requireProofKey ( true ). build ()). build ();
594
+ }).build ();
599
595
this .registeredClientRepository .save (registeredClient );
600
596
601
597
MultiValueMap <String , String > authorizationRequestParameters = getAuthorizationRequestParameters (
602
598
registeredClient );
599
+ authorizationRequestParameters .remove (PkceParameterNames .CODE_CHALLENGE );
603
600
MvcResult mvcResult = this .mvc
604
601
.perform (get (DEFAULT_AUTHORIZATION_ENDPOINT_URI ).queryParams (authorizationRequestParameters )
605
602
.with (user ("user" )))
@@ -618,11 +615,14 @@ public void requestWhenConfidentialClientWithPkceAndMissingCodeChallengeButCodeV
618
615
throws Exception {
619
616
this .spring .register (AuthorizationServerConfiguration .class ).autowire ();
620
617
621
- RegisteredClient registeredClient = TestRegisteredClients .registeredClient ().build ();
618
+ RegisteredClient registeredClient = TestRegisteredClients .registeredClient ()
619
+ .clientSettings (ClientSettings .builder ().requireProofKey (false ).build ())
620
+ .build ();
622
621
this .registeredClientRepository .save (registeredClient );
623
622
624
623
MultiValueMap <String , String > authorizationRequestParameters = getAuthorizationRequestParameters (
625
624
registeredClient );
625
+ authorizationRequestParameters .remove (PkceParameterNames .CODE_CHALLENGE );
626
626
MvcResult mvcResult = this .mvc
627
627
.perform (get (DEFAULT_AUTHORIZATION_ENDPOINT_URI ).queryParams (authorizationRequestParameters )
628
628
.with (user ("user" )))
@@ -642,7 +642,6 @@ public void requestWhenConfidentialClientWithPkceAndMissingCodeChallengeButCodeV
642
642
this .mvc
643
643
.perform (post (DEFAULT_TOKEN_ENDPOINT_URI )
644
644
.params (getTokenRequestParameters (registeredClient , authorizationCodeAuthorization ))
645
- .param (PkceParameterNames .CODE_VERIFIER , S256_CODE_VERIFIER )
646
645
.header (HttpHeaders .AUTHORIZATION , getAuthorizationHeader (registeredClient )))
647
646
.andExpect (status ().isBadRequest ());
648
647
}
@@ -654,7 +653,7 @@ public void requestWhenCustomTokenGeneratorThenUsed() throws Exception {
654
653
RegisteredClient registeredClient = TestRegisteredClients .registeredClient ().build ();
655
654
this .registeredClientRepository .save (registeredClient );
656
655
657
- OAuth2Authorization authorization = TestOAuth2Authorizations . authorization (registeredClient ). build ( );
656
+ OAuth2Authorization authorization = createAuthorization (registeredClient );
658
657
this .authorizationService .save (authorization );
659
658
660
659
this .mvc
@@ -704,10 +703,14 @@ public void requestWhenConsentRequestThenReturnAccessTokenResponse() throws Exce
704
703
OAuth2Authorization authorization = TestOAuth2Authorizations .authorization (registeredClient )
705
704
.principalName ("user" )
706
705
.build ();
706
+ Map <String , Object > additionalParameters = new HashMap <>();
707
+ additionalParameters .put (PkceParameterNames .CODE_CHALLENGE , S256_CODE_CHALLENGE );
708
+ additionalParameters .put (PkceParameterNames .CODE_CHALLENGE_METHOD , "S256" );
707
709
OAuth2AuthorizationRequest authorizationRequest = authorization
708
710
.getAttribute (OAuth2AuthorizationRequest .class .getName ());
709
711
OAuth2AuthorizationRequest updatedAuthorizationRequest = OAuth2AuthorizationRequest .from (authorizationRequest )
710
712
.state (STATE_URL_UNENCODED )
713
+ .additionalParameters (additionalParameters )
711
714
.build ();
712
715
authorization = OAuth2Authorization .from (authorization )
713
716
.attribute (OAuth2AuthorizationRequest .class .getName (), updatedAuthorizationRequest )
@@ -793,7 +796,7 @@ public void requestWhenCustomConsentCustomizerConfiguredThenUsed() throws Except
793
796
.build ();
794
797
this .registeredClientRepository .save (registeredClient );
795
798
796
- OAuth2Authorization authorization = TestOAuth2Authorizations . authorization (registeredClient ). build ( );
799
+ OAuth2Authorization authorization = createAuthorization (registeredClient );
797
800
OAuth2AuthorizationRequest authorizationRequest = authorization
798
801
.getAttribute (OAuth2AuthorizationRequest .class .getName ());
799
802
OAuth2AuthorizationRequest updatedAuthorizationRequest = OAuth2AuthorizationRequest .from (authorizationRequest )
@@ -906,8 +909,6 @@ public void requestWhenClientObtainsAccessTokenThenClientAuthenticationNotPersis
906
909
MvcResult mvcResult = this .mvc
907
910
.perform (get (DEFAULT_AUTHORIZATION_ENDPOINT_URI )
908
911
.queryParams (getAuthorizationRequestParameters (registeredClient ))
909
- .queryParam (PkceParameterNames .CODE_CHALLENGE , S256_CODE_CHALLENGE )
910
- .queryParam (PkceParameterNames .CODE_CHALLENGE_METHOD , "S256" )
911
912
.with (user ("user" )))
912
913
.andExpect (status ().is3xxRedirection ())
913
914
.andReturn ();
@@ -926,8 +927,7 @@ public void requestWhenClientObtainsAccessTokenThenClientAuthenticationNotPersis
926
927
mvcResult = this .mvc
927
928
.perform (post (DEFAULT_TOKEN_ENDPOINT_URI )
928
929
.params (getTokenRequestParameters (registeredClient , authorizationCodeAuthorization ))
929
- .param (OAuth2ParameterNames .CLIENT_ID , registeredClient .getClientId ())
930
- .param (PkceParameterNames .CODE_VERIFIER , S256_CODE_VERIFIER ))
930
+ .param (OAuth2ParameterNames .CLIENT_ID , registeredClient .getClientId ()))
931
931
.andExpect (header ().string (HttpHeaders .CACHE_CONTROL , containsString ("no-store" )))
932
932
.andExpect (header ().string (HttpHeaders .PRAGMA , containsString ("no-cache" )))
933
933
.andExpect (status ().isOk ())
@@ -956,8 +956,6 @@ public void requestWhenAuthorizationAndTokenRequestIncludesIssuerPathThenIssuerR
956
956
MvcResult mvcResult = this .mvc
957
957
.perform (get (issuer .concat (DEFAULT_AUTHORIZATION_ENDPOINT_URI ))
958
958
.queryParams (getAuthorizationRequestParameters (registeredClient ))
959
- .queryParam (PkceParameterNames .CODE_CHALLENGE , S256_CODE_CHALLENGE )
960
- .queryParam (PkceParameterNames .CODE_CHALLENGE_METHOD , "S256" )
961
959
.with (user ("user" )))
962
960
.andExpect (status ().is3xxRedirection ())
963
961
.andReturn ();
@@ -969,8 +967,7 @@ public void requestWhenAuthorizationAndTokenRequestIncludesIssuerPathThenIssuerR
969
967
this .mvc
970
968
.perform (post (issuer .concat (DEFAULT_TOKEN_ENDPOINT_URI ))
971
969
.params (getTokenRequestParameters (registeredClient , authorizationCodeAuthorization ))
972
- .param (OAuth2ParameterNames .CLIENT_ID , registeredClient .getClientId ())
973
- .param (PkceParameterNames .CODE_VERIFIER , S256_CODE_VERIFIER ))
970
+ .param (OAuth2ParameterNames .CLIENT_ID , registeredClient .getClientId ()))
974
971
.andExpect (header ().string (HttpHeaders .CACHE_CONTROL , containsString ("no-store" )))
975
972
.andExpect (header ().string (HttpHeaders .PRAGMA , containsString ("no-cache" )))
976
973
.andExpect (status ().isOk ())
@@ -994,7 +991,7 @@ public void requestWhenTokenRequestWithDPoPProofThenReturnDPoPBoundAccessToken()
994
991
RegisteredClient registeredClient = TestRegisteredClients .registeredClient ().build ();
995
992
this .registeredClientRepository .save (registeredClient );
996
993
997
- OAuth2Authorization authorization = TestOAuth2Authorizations . authorization (registeredClient ). build ( );
994
+ OAuth2Authorization authorization = createAuthorization (registeredClient );
998
995
this .authorizationService .save (authorization );
999
996
1000
997
String tokenEndpointUri = "http://localhost" + DEFAULT_TOKEN_ENDPOINT_URI ;
@@ -1025,8 +1022,6 @@ public void requestWhenPushedAuthorizationRequestThenReturnAccessTokenResponse()
1025
1022
1026
1023
MvcResult mvcResult = this .mvc
1027
1024
.perform (post ("/oauth2/par" ).params (getAuthorizationRequestParameters (registeredClient ))
1028
- .param (PkceParameterNames .CODE_CHALLENGE , S256_CODE_CHALLENGE )
1029
- .param (PkceParameterNames .CODE_CHALLENGE_METHOD , "S256" )
1030
1025
.header (HttpHeaders .AUTHORIZATION , getAuthorizationHeader (registeredClient )))
1031
1026
.andExpect (header ().string (HttpHeaders .CACHE_CONTROL , containsString ("no-store" )))
1032
1027
.andExpect (header ().string (HttpHeaders .PRAGMA , containsString ("no-cache" )))
@@ -1053,7 +1048,6 @@ public void requestWhenPushedAuthorizationRequestThenReturnAccessTokenResponse()
1053
1048
.perform (post (DEFAULT_TOKEN_ENDPOINT_URI )
1054
1049
.params (getTokenRequestParameters (registeredClient , authorizationCodeAuthorization ))
1055
1050
.param (OAuth2ParameterNames .CLIENT_ID , registeredClient .getClientId ())
1056
- .param (PkceParameterNames .CODE_VERIFIER , S256_CODE_VERIFIER )
1057
1051
.header (HttpHeaders .AUTHORIZATION , getAuthorizationHeader (registeredClient )))
1058
1052
.andExpect (header ().string (HttpHeaders .CACHE_CONTROL , containsString ("no-store" )))
1059
1053
.andExpect (header ().string (HttpHeaders .PRAGMA , containsString ("no-cache" )))
@@ -1077,6 +1071,13 @@ public void requestWhenPushedAuthorizationRequestThenReturnAccessTokenResponse()
1077
1071
.isEqualTo (true );
1078
1072
}
1079
1073
1074
+ private static OAuth2Authorization createAuthorization (RegisteredClient registeredClient ) {
1075
+ Map <String , Object > additionalParameters = new HashMap <>();
1076
+ additionalParameters .put (PkceParameterNames .CODE_CHALLENGE , S256_CODE_CHALLENGE );
1077
+ additionalParameters .put (PkceParameterNames .CODE_CHALLENGE_METHOD , "S256" );
1078
+ return TestOAuth2Authorizations .authorization (registeredClient , additionalParameters ).build ();
1079
+ }
1080
+
1080
1081
private static String generateDPoPProof (String tokenEndpointUri ) {
1081
1082
// @formatter:off
1082
1083
Map <String , Object > publicJwk = TestJwks .DEFAULT_EC_JWK
@@ -1105,6 +1106,8 @@ private static MultiValueMap<String, String> getAuthorizationRequestParameters(R
1105
1106
parameters .set (OAuth2ParameterNames .SCOPE ,
1106
1107
StringUtils .collectionToDelimitedString (registeredClient .getScopes (), " " ));
1107
1108
parameters .set (OAuth2ParameterNames .STATE , STATE_URL_UNENCODED );
1109
+ parameters .set (PkceParameterNames .CODE_CHALLENGE , S256_CODE_CHALLENGE );
1110
+ parameters .set (PkceParameterNames .CODE_CHALLENGE_METHOD , "S256" );
1108
1111
return parameters ;
1109
1112
}
1110
1113
@@ -1115,6 +1118,7 @@ private static MultiValueMap<String, String> getTokenRequestParameters(Registere
1115
1118
parameters .set (OAuth2ParameterNames .CODE ,
1116
1119
authorization .getToken (OAuth2AuthorizationCode .class ).getToken ().getTokenValue ());
1117
1120
parameters .set (OAuth2ParameterNames .REDIRECT_URI , registeredClient .getRedirectUris ().iterator ().next ());
1121
+ parameters .set (PkceParameterNames .CODE_VERIFIER , S256_CODE_VERIFIER );
1118
1122
return parameters ;
1119
1123
}
1120
1124
0 commit comments