41
41
import com .nimbusds .openid .connect .sdk .validators .IDTokenValidator ;
42
42
import com .nimbusds .openid .connect .sdk .validators .InvalidHashException ;
43
43
import net .minidev .json .JSONArray ;
44
- import net .minidev .json .JSONObject ;
45
44
import org .elasticsearch .ElasticsearchSecurityException ;
46
45
import org .elasticsearch .action .ActionListener ;
47
46
import org .elasticsearch .action .support .PlainActionFuture ;
74
73
import java .util .Base64 ;
75
74
import java .util .Collections ;
76
75
import java .util .Date ;
76
+ import java .util .Map ;
77
77
import java .util .UUID ;
78
78
79
79
import static java .time .Instant .now ;
@@ -698,14 +698,14 @@ public void testJsonObjectMerging() throws Exception {
698
698
final JWK jwk = keyMaterial .v2 ().getKeys ().get (0 );
699
699
RelyingPartyConfiguration rpConfig = getRpConfig (jwk .getAlgorithm ().getName ());
700
700
OpenIdConnectProviderConfiguration opConfig = getOpConfig ();
701
- JSONObject address = new JWTClaimsSet .Builder ()
701
+ Map < String , Object > address = new JWTClaimsSet .Builder ()
702
702
.claim ("street_name" , "12, Test St." )
703
703
.claim ("locality" , "New York" )
704
704
.claim ("region" , "NY" )
705
705
.claim ("country" , "USA" )
706
706
.build ()
707
707
.toJSONObject ();
708
- JSONObject idTokenObject = new JWTClaimsSet .Builder ()
708
+ Map < String , Object > idTokenObject = new JWTClaimsSet .Builder ()
709
709
.jwtID (randomAlphaOfLength (8 ))
710
710
.audience (rpConfig .getClientId ().getValue ())
711
711
.expirationTime (Date .from (now ().plusSeconds (3600 )))
@@ -724,7 +724,7 @@ public void testJsonObjectMerging() throws Exception {
724
724
.build ()
725
725
.toJSONObject ();
726
726
727
- JSONObject userinfoObject = new JWTClaimsSet .Builder ()
727
+ Map < String , Object > userinfoObject = new JWTClaimsSet .Builder ()
728
728
.claim ("given_name" , "Jane Doe" )
729
729
.claim ("family_name" , "Doe" )
730
730
.claim ("profile" , "https://test-profiles.com/jane.doe" )
@@ -752,7 +752,7 @@ public void testJsonObjectMerging() throws Exception {
752
752
assertTrue (idTokenObject .containsKey ("email" ));
753
753
754
754
// Claims with different types throw an error
755
- JSONObject wrongTypeInfo = new JWTClaimsSet .Builder ()
755
+ Map < String , Object > wrongTypeInfo = new JWTClaimsSet .Builder ()
756
756
.claim ("given_name" , "Jane Doe" )
757
757
.claim ("family_name" , 123334434 )
758
758
.claim ("profile" , "https://test-profiles.com/jane.doe" )
@@ -767,7 +767,7 @@ public void testJsonObjectMerging() throws Exception {
767
767
});
768
768
769
769
// Userinfo Claims overwrite ID Token claims
770
- JSONObject overwriteUserInfo = new JWTClaimsSet .Builder ()
770
+ Map < String , Object > overwriteUserInfo = new JWTClaimsSet .Builder ()
771
771
.claim ("given_name" , "Jane Doe" )
772
772
.claim ("family_name" , "Doe" )
773
773
.claim ("profile" , "https://test-profiles.com/jane.doe2" )
@@ -778,11 +778,11 @@ public void testJsonObjectMerging() throws Exception {
778
778
.toJSONObject ();
779
779
780
780
OpenIdConnectAuthenticator .mergeObjects (idTokenObject , overwriteUserInfo );
781
- assertThat (
idTokenObject .
getAsString (
"email" ),
equalTo (
"[email protected] " ));
782
- assertThat (idTokenObject .getAsString ("profile" ), equalTo ("https://test-profiles.com/jane.doe" ));
781
+ assertThat (
idTokenObject .
get (
"email" ),
equalTo (
"[email protected] " ));
782
+ assertThat (idTokenObject .get ("profile" ), equalTo ("https://test-profiles.com/jane.doe" ));
783
783
784
784
// Merging Arrays
785
- JSONObject userInfoWithRoles = new JWTClaimsSet .Builder ()
785
+ Map < String , Object > userInfoWithRoles = new JWTClaimsSet .Builder ()
786
786
.claim ("given_name" , "Jane Doe" )
787
787
.claim ("family_name" , "Doe" )
788
788
.claim ("profile" , "https://test-profiles.com/jane.doe" )
@@ -797,13 +797,13 @@ public void testJsonObjectMerging() throws Exception {
797
797
assertThat ((JSONArray ) idTokenObject .get ("roles" ), containsInAnyOrder ("role1" , "role2" , "role3" , "role4" , "role5" ));
798
798
799
799
// Merging nested objects
800
- JSONObject addressUserInfo = new JWTClaimsSet .Builder ()
800
+ Map < String , Object > addressUserInfo = new JWTClaimsSet .Builder ()
801
801
.claim ("street_name" , "12, Test St." )
802
802
.claim ("locality" , "New York" )
803
803
.claim ("postal_code" , "10024" )
804
804
.build ()
805
805
.toJSONObject ();
806
- JSONObject userInfoWithAddress = new JWTClaimsSet .Builder ()
806
+ Map < String , Object > userInfoWithAddress = new JWTClaimsSet .Builder ()
807
807
.claim ("given_name" , "Jane Doe" )
808
808
.claim ("family_name" , "Doe" )
809
809
.claim ("profile" , "https://test-profiles.com/jane.doe" )
@@ -816,7 +816,7 @@ public void testJsonObjectMerging() throws Exception {
816
816
.toJSONObject ();
817
817
OpenIdConnectAuthenticator .mergeObjects (idTokenObject , userInfoWithAddress );
818
818
assertTrue (idTokenObject .containsKey ("address" ));
819
- JSONObject combinedAddress = (JSONObject ) idTokenObject .get ("address" );
819
+ Map < String , Object > combinedAddress = (Map < String , Object > ) idTokenObject .get ("address" );
820
820
assertTrue (combinedAddress .containsKey ("street_name" ));
821
821
assertTrue (combinedAddress .containsKey ("locality" ));
822
822
assertTrue (combinedAddress .containsKey ("street_name" ));
@@ -826,14 +826,14 @@ public void testJsonObjectMerging() throws Exception {
826
826
}
827
827
828
828
public void testJsonObjectMergingWithBooleanLeniency () {
829
- final JSONObject idTokenObject = new JWTClaimsSet .Builder ()
829
+ final Map < String , Object > idTokenObject = new JWTClaimsSet .Builder ()
830
830
.claim ("email_verified" , true )
831
831
.claim ("email_verified_1" , "true" )
832
832
.claim ("email_verified_2" , false )
833
833
.claim ("email_verified_3" , "false" )
834
834
.build ()
835
835
.toJSONObject ();
836
- final JSONObject userInfoObject = new JWTClaimsSet .Builder ()
836
+ final Map < String , Object > userInfoObject = new JWTClaimsSet .Builder ()
837
837
.claim ("email_verified" , "true" )
838
838
.claim ("email_verified_1" , true )
839
839
.claim ("email_verified_2" , "false" )
@@ -846,23 +846,23 @@ public void testJsonObjectMergingWithBooleanLeniency() {
846
846
assertSame (Boolean .FALSE , idTokenObject .get ("email_verified_2" ));
847
847
assertSame (Boolean .FALSE , idTokenObject .get ("email_verified_3" ));
848
848
849
- final JSONObject idTokenObject1 = new JWTClaimsSet .Builder ()
849
+ final Map < String , Object > idTokenObject1 = new JWTClaimsSet .Builder ()
850
850
.claim ("email_verified" , true )
851
851
.build ()
852
852
.toJSONObject ();
853
- final JSONObject userInfoObject1 = new JWTClaimsSet .Builder ()
853
+ final Map < String , Object > userInfoObject1 = new JWTClaimsSet .Builder ()
854
854
.claim ("email_verified" , "false" )
855
855
.build ()
856
856
.toJSONObject ();
857
857
IllegalStateException e =
858
858
expectThrows (IllegalStateException .class , () -> OpenIdConnectAuthenticator .mergeObjects (idTokenObject1 , userInfoObject1 ));
859
859
assertThat (e .getMessage (), containsString ("Cannot merge [java.lang.Boolean] with [java.lang.String]" ));
860
860
861
- final JSONObject idTokenObject2 = new JWTClaimsSet .Builder ()
861
+ final Map < String , Object > idTokenObject2 = new JWTClaimsSet .Builder ()
862
862
.claim ("email_verified" , true )
863
863
.build ()
864
864
.toJSONObject ();
865
- final JSONObject userInfoObject2 = new JWTClaimsSet .Builder ()
865
+ final Map < String , Object > userInfoObject2 = new JWTClaimsSet .Builder ()
866
866
.claim ("email_verified" , "yes" )
867
867
.build ()
868
868
.toJSONObject ();
@@ -951,7 +951,11 @@ private Tuple<AccessToken, JWT> buildTokens(JWTClaimsSet idToken, Key key, Strin
951
951
if (withAccessToken ) {
952
952
accessToken = new BearerAccessToken (Base64 .getUrlEncoder ().encodeToString (randomByteArrayOfLength (32 )));
953
953
AccessTokenHash expectedHash = AccessTokenHash .compute (accessToken , JWSAlgorithm .parse (alg ));
954
- idToken = JWTClaimsSet .parse (idToken .toJSONObject ().appendField ("at_hash" , expectedHash .getValue ()));
954
+ Map <String , Object > idTokenMap = idToken .toJSONObject ();
955
+ idTokenMap .put ("at_hash" , expectedHash .getValue ());
956
+ // This is necessary as if nonce claim is of type Nonce, the library won't take it into consideration when serializing the JWT
957
+ idTokenMap .put ("nonce" , idTokenMap .get ("nonce" ).toString ());
958
+ idToken = JWTClaimsSet .parse (idTokenMap );
955
959
}
956
960
SignedJWT jwt = new SignedJWT (
957
961
new JWSHeader .Builder (JWSAlgorithm .parse (alg )).keyID (keyId ).build (),
0 commit comments