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 ;
75
74
import java .util .Base64 ;
76
75
import java .util .Collections ;
77
76
import java .util .Date ;
77
+ import java .util .Map ;
78
78
import java .util .UUID ;
79
79
80
80
import static java .time .Instant .now ;
@@ -704,14 +704,14 @@ public void testJsonObjectMerging() throws Exception {
704
704
final JWK jwk = keyMaterial .v2 ().getKeys ().get (0 );
705
705
RelyingPartyConfiguration rpConfig = getRpConfig (jwk .getAlgorithm ().getName ());
706
706
OpenIdConnectProviderConfiguration opConfig = getOpConfig ();
707
- JSONObject address = new JWTClaimsSet .Builder ()
707
+ Map < String , Object > address = new JWTClaimsSet .Builder ()
708
708
.claim ("street_name" , "12, Test St." )
709
709
.claim ("locality" , "New York" )
710
710
.claim ("region" , "NY" )
711
711
.claim ("country" , "USA" )
712
712
.build ()
713
713
.toJSONObject ();
714
- JSONObject idTokenObject = new JWTClaimsSet .Builder ()
714
+ Map < String , Object > idTokenObject = new JWTClaimsSet .Builder ()
715
715
.jwtID (randomAlphaOfLength (8 ))
716
716
.audience (rpConfig .getClientId ().getValue ())
717
717
.expirationTime (Date .from (now ().plusSeconds (3600 )))
@@ -730,7 +730,7 @@ public void testJsonObjectMerging() throws Exception {
730
730
.build ()
731
731
.toJSONObject ();
732
732
733
- JSONObject userinfoObject = new JWTClaimsSet .Builder ()
733
+ Map < String , Object > userinfoObject = new JWTClaimsSet .Builder ()
734
734
.claim ("given_name" , "Jane Doe" )
735
735
.claim ("family_name" , "Doe" )
736
736
.claim ("profile" , "https://test-profiles.com/jane.doe" )
@@ -758,7 +758,7 @@ public void testJsonObjectMerging() throws Exception {
758
758
assertTrue (idTokenObject .containsKey ("email" ));
759
759
760
760
// Claims with different types throw an error
761
- JSONObject wrongTypeInfo = new JWTClaimsSet .Builder ()
761
+ Map < String , Object > wrongTypeInfo = new JWTClaimsSet .Builder ()
762
762
.claim ("given_name" , "Jane Doe" )
763
763
.claim ("family_name" , 123334434 )
764
764
.claim ("profile" , "https://test-profiles.com/jane.doe" )
@@ -773,7 +773,7 @@ public void testJsonObjectMerging() throws Exception {
773
773
});
774
774
775
775
// Userinfo Claims overwrite ID Token claims
776
- JSONObject overwriteUserInfo = new JWTClaimsSet .Builder ()
776
+ Map < String , Object > overwriteUserInfo = new JWTClaimsSet .Builder ()
777
777
.claim ("given_name" , "Jane Doe" )
778
778
.claim ("family_name" , "Doe" )
779
779
.claim ("profile" , "https://test-profiles.com/jane.doe2" )
@@ -784,11 +784,11 @@ public void testJsonObjectMerging() throws Exception {
784
784
.toJSONObject ();
785
785
786
786
OpenIdConnectAuthenticator .mergeObjects (idTokenObject , overwriteUserInfo );
787
- assertThat (
idTokenObject .
getAsString (
"email" ),
equalTo (
"[email protected] " ));
788
- assertThat (idTokenObject .getAsString ("profile" ), equalTo ("https://test-profiles.com/jane.doe" ));
787
+ assertThat (
idTokenObject .
get (
"email" ),
equalTo (
"[email protected] " ));
788
+ assertThat (idTokenObject .get ("profile" ), equalTo ("https://test-profiles.com/jane.doe" ));
789
789
790
790
// Merging Arrays
791
- JSONObject userInfoWithRoles = new JWTClaimsSet .Builder ()
791
+ Map < String , Object > userInfoWithRoles = new JWTClaimsSet .Builder ()
792
792
.claim ("given_name" , "Jane Doe" )
793
793
.claim ("family_name" , "Doe" )
794
794
.claim ("profile" , "https://test-profiles.com/jane.doe" )
@@ -803,13 +803,13 @@ public void testJsonObjectMerging() throws Exception {
803
803
assertThat ((JSONArray ) idTokenObject .get ("roles" ), containsInAnyOrder ("role1" , "role2" , "role3" , "role4" , "role5" ));
804
804
805
805
// Merging nested objects
806
- JSONObject addressUserInfo = new JWTClaimsSet .Builder ()
806
+ Map < String , Object > addressUserInfo = new JWTClaimsSet .Builder ()
807
807
.claim ("street_name" , "12, Test St." )
808
808
.claim ("locality" , "New York" )
809
809
.claim ("postal_code" , "10024" )
810
810
.build ()
811
811
.toJSONObject ();
812
- JSONObject userInfoWithAddress = new JWTClaimsSet .Builder ()
812
+ Map < String , Object > userInfoWithAddress = new JWTClaimsSet .Builder ()
813
813
.claim ("given_name" , "Jane Doe" )
814
814
.claim ("family_name" , "Doe" )
815
815
.claim ("profile" , "https://test-profiles.com/jane.doe" )
@@ -822,7 +822,7 @@ public void testJsonObjectMerging() throws Exception {
822
822
.toJSONObject ();
823
823
OpenIdConnectAuthenticator .mergeObjects (idTokenObject , userInfoWithAddress );
824
824
assertTrue (idTokenObject .containsKey ("address" ));
825
- JSONObject combinedAddress = (JSONObject ) idTokenObject .get ("address" );
825
+ Map < String , Object > combinedAddress = (Map < String , Object > ) idTokenObject .get ("address" );
826
826
assertTrue (combinedAddress .containsKey ("street_name" ));
827
827
assertTrue (combinedAddress .containsKey ("locality" ));
828
828
assertTrue (combinedAddress .containsKey ("street_name" ));
@@ -832,14 +832,14 @@ public void testJsonObjectMerging() throws Exception {
832
832
}
833
833
834
834
public void testJsonObjectMergingWithBooleanLeniency () {
835
- final JSONObject idTokenObject = new JWTClaimsSet .Builder ()
835
+ final Map < String , Object > idTokenObject = new JWTClaimsSet .Builder ()
836
836
.claim ("email_verified" , true )
837
837
.claim ("email_verified_1" , "true" )
838
838
.claim ("email_verified_2" , false )
839
839
.claim ("email_verified_3" , "false" )
840
840
.build ()
841
841
.toJSONObject ();
842
- final JSONObject userInfoObject = new JWTClaimsSet .Builder ()
842
+ final Map < String , Object > userInfoObject = new JWTClaimsSet .Builder ()
843
843
.claim ("email_verified" , "true" )
844
844
.claim ("email_verified_1" , true )
845
845
.claim ("email_verified_2" , "false" )
@@ -852,23 +852,23 @@ public void testJsonObjectMergingWithBooleanLeniency() {
852
852
assertSame (Boolean .FALSE , idTokenObject .get ("email_verified_2" ));
853
853
assertSame (Boolean .FALSE , idTokenObject .get ("email_verified_3" ));
854
854
855
- final JSONObject idTokenObject1 = new JWTClaimsSet .Builder ()
855
+ final Map < String , Object > idTokenObject1 = new JWTClaimsSet .Builder ()
856
856
.claim ("email_verified" , true )
857
857
.build ()
858
858
.toJSONObject ();
859
- final JSONObject userInfoObject1 = new JWTClaimsSet .Builder ()
859
+ final Map < String , Object > userInfoObject1 = new JWTClaimsSet .Builder ()
860
860
.claim ("email_verified" , "false" )
861
861
.build ()
862
862
.toJSONObject ();
863
863
IllegalStateException e =
864
864
expectThrows (IllegalStateException .class , () -> OpenIdConnectAuthenticator .mergeObjects (idTokenObject1 , userInfoObject1 ));
865
865
assertThat (e .getMessage (), containsString ("Cannot merge [java.lang.Boolean] with [java.lang.String]" ));
866
866
867
- final JSONObject idTokenObject2 = new JWTClaimsSet .Builder ()
867
+ final Map < String , Object > idTokenObject2 = new JWTClaimsSet .Builder ()
868
868
.claim ("email_verified" , true )
869
869
.build ()
870
870
.toJSONObject ();
871
- final JSONObject userInfoObject2 = new JWTClaimsSet .Builder ()
871
+ final Map < String , Object > userInfoObject2 = new JWTClaimsSet .Builder ()
872
872
.claim ("email_verified" , "yes" )
873
873
.build ()
874
874
.toJSONObject ();
@@ -957,7 +957,11 @@ private Tuple<AccessToken, JWT> buildTokens(JWTClaimsSet idToken, Key key, Strin
957
957
if (withAccessToken ) {
958
958
accessToken = new BearerAccessToken (Base64 .getUrlEncoder ().encodeToString (randomByteArrayOfLength (32 )));
959
959
AccessTokenHash expectedHash = AccessTokenHash .compute (accessToken , JWSAlgorithm .parse (alg ));
960
- idToken = JWTClaimsSet .parse (idToken .toJSONObject ().appendField ("at_hash" , expectedHash .getValue ()));
960
+ Map <String , Object > idTokenMap = idToken .toJSONObject ();
961
+ idTokenMap .put ("at_hash" , expectedHash .getValue ());
962
+ // This is necessary as if nonce claim is of type Nonce, the library won't take it into consideration when serializing the JWT
963
+ idTokenMap .put ("nonce" , idTokenMap .get ("nonce" ).toString ());
964
+ idToken = JWTClaimsSet .parse (idTokenMap );
961
965
}
962
966
SignedJWT jwt = new SignedJWT (
963
967
new JWSHeader .Builder (JWSAlgorithm .parse (alg )).keyID (keyId ).build (),
0 commit comments