160160static NSString *const kGrantedScope = @" grantedScope" ;
161161static NSString *const kNewScope = @" newScope" ;
162162
163- static NSString *const kEssentialAuthTimeClaimsJsonString =
163+ static NSString *const kEssentialAuthTimeClaimJsonString =
164164 @" {\" id_token\" :{\" auth_time\" :{\" essential\" :true}}}" ;
165- static NSString *const kNonEssentialAuthTimeClaimsJsonString =
165+ static NSString *const kNonEssentialAuthTimeClaimJsonString =
166166 @" {\" id_token\" :{\" auth_time\" :{\" essential\" :false}}}" ;
167167
168+ static NSString *const kEssentialAMRClaimJsonString =
169+ @" {\" id_token\" :{\" amr\" :{\" essential\" :true}}}" ;
170+ static NSString *const kNonEssentialAMRClaimJsonString =
171+ @" {\" id_token\" :{\" amr\" :{\" essential\" :false}}}" ;
172+
173+ static NSString *const kMultipleClaimsJsonString =
174+ @" {\" id_token\" :{\" amr\" :{\" essential\" :false},\" auth_time\" :{\" essential\" :false}}}" ;
168175
169176#if TARGET_OS_IOS || TARGET_OS_MACCATALYST
170177// This category is used to allow the test to swizzle a private method.
@@ -751,7 +758,7 @@ - (void)testOAuthLogin_AdditionalScopes {
751758 XCTAssertEqualObjects (_savedAuthorizationRequest.scope , expectedScopeString);
752759}
753760
754- - (void )testOAuthLogin_WithClaims_FormatsParametersCorrectly {
761+ - (void )testOAuthLogin_WithAuthTimeClaim_FormatsParametersCorrectly {
755762 GIDClaim *authTimeClaim = [GIDClaim authTimeClaim ];
756763 GIDClaim *essentialAuthTimeClaim = [GIDClaim essentialAuthTimeClaim ];
757764
@@ -776,7 +783,7 @@ - (void)testOAuthLogin_WithClaims_FormatsParametersCorrectly {
776783 claims: [NSSet setWithObject: essentialAuthTimeClaim]];
777784
778785 XCTAssertEqualObjects (_savedAuthorizationRequest.additionalParameters [@" claims" ],
779- kEssentialAuthTimeClaimsJsonString ,
786+ kEssentialAuthTimeClaimJsonString ,
780787 @" Claims JSON should be correctly formatted" );
781788
782789 [self OAuthLoginWithAddScopesFlow: NO
@@ -795,12 +802,92 @@ - (void)testOAuthLogin_WithClaims_FormatsParametersCorrectly {
795802 claims: [NSSet setWithObject: authTimeClaim]];
796803
797804 XCTAssertEqualObjects (_savedAuthorizationRequest.additionalParameters [@" claims" ],
798- kNonEssentialAuthTimeClaimsJsonString ,
805+ kNonEssentialAuthTimeClaimJsonString ,
806+ @" Claims JSON should be correctly formatted" );
807+ }
808+
809+ - (void )testOAuthLogin_WithAMRClaim_FormatsParametersCorrectly {
810+ GIDClaim *AMRClaim = [GIDClaim AMRClaim ];
811+ GIDClaim *essentialAMRClaim = [GIDClaim essentialAMRClaim ];
812+
813+ OCMStub ([_keychainStore saveAuthSession: OCMOCK_ANY error: OCMArg.anyObjectRef]
814+ ).andDo (^(NSInvocation *invocation){
815+ self->_keychainSaved = self->_saveAuthorizationReturnValue ;
816+ });
817+
818+ [self OAuthLoginWithAddScopesFlow: NO
819+ authError: nil
820+ tokenError: nil
821+ emmPasscodeInfoRequired: NO
822+ claimsAsJSONRequired: NO
823+ keychainError: NO
824+ claimsError: NO
825+ restoredSignIn: NO
826+ oldAccessToken: NO
827+ modalCancel: NO
828+ useAdditionalScopes: NO
829+ additionalScopes: nil
830+ manualNonce: nil
831+ claims: [NSSet setWithObject: essentialAMRClaim]];
832+
833+ XCTAssertEqualObjects (_savedAuthorizationRequest.additionalParameters [@" claims" ],
834+ kEssentialAMRClaimJsonString ,
835+ @" Claims JSON should be correctly formatted" );
836+
837+ [self OAuthLoginWithAddScopesFlow: NO
838+ authError: nil
839+ tokenError: nil
840+ emmPasscodeInfoRequired: NO
841+ claimsAsJSONRequired: NO
842+ keychainError: NO
843+ claimsError: NO
844+ restoredSignIn: NO
845+ oldAccessToken: NO
846+ modalCancel: NO
847+ useAdditionalScopes: NO
848+ additionalScopes: nil
849+ manualNonce: nil
850+ claims: [NSSet setWithObject: AMRClaim]];
851+
852+ XCTAssertEqualObjects (_savedAuthorizationRequest.additionalParameters [@" claims" ],
853+ kNonEssentialAMRClaimJsonString ,
854+ @" Claims JSON should be correctly formatted" );
855+ }
856+
857+ - (void )testOAuthLogin_WithClaims_FormatsParametersCorrectly {
858+ GIDClaim *authTimeClaim = [GIDClaim authTimeClaim ];
859+ GIDClaim *AMRClaim = [GIDClaim AMRClaim ];
860+ NSSet *claims = [NSSet setWithArray: @[authTimeClaim, AMRClaim]];
861+
862+ OCMStub ([_keychainStore saveAuthSession: OCMOCK_ANY error: OCMArg.anyObjectRef]
863+ ).andDo (^(NSInvocation *invocation){
864+ self->_keychainSaved = self->_saveAuthorizationReturnValue ;
865+ });
866+
867+ [self OAuthLoginWithAddScopesFlow: NO
868+ authError: nil
869+ tokenError: nil
870+ emmPasscodeInfoRequired: NO
871+ claimsAsJSONRequired: NO
872+ keychainError: NO
873+ claimsError: NO
874+ restoredSignIn: NO
875+ oldAccessToken: NO
876+ modalCancel: NO
877+ useAdditionalScopes: NO
878+ additionalScopes: nil
879+ manualNonce: nil
880+ claims: claims];
881+
882+ XCTAssertEqualObjects (_savedAuthorizationRequest.additionalParameters [@" claims" ],
883+ kMultipleClaimsJsonString ,
799884 @" Claims JSON should be correctly formatted" );
800885}
801886
802887- (void )testOAuthLogin_WithClaims_ReturnsIdTokenWithCorrectClaims {
803888 GIDClaim *authTimeClaim = [GIDClaim authTimeClaim ];
889+ GIDClaim *AMRClaim = [GIDClaim AMRClaim ];
890+ NSSet *claims = [NSSet setWithArray: @[authTimeClaim, AMRClaim]];
804891
805892 OCMStub ([_keychainStore saveAuthSession: OCMOCK_ANY error: OCMArg.anyObjectRef]
806893 ).andDo (^(NSInvocation *invocation){
@@ -820,7 +907,7 @@ - (void)testOAuthLogin_WithClaims_ReturnsIdTokenWithCorrectClaims {
820907 useAdditionalScopes: NO
821908 additionalScopes: nil
822909 manualNonce: nil
823- claims: [ NSSet setWithObject: authTimeClaim] ];
910+ claims: claims ];
824911
825912 XCTAssertNotNil (_signIn.currentUser , @" The currentUser should not be nil after a successful sign-in." );
826913 NSString *idTokenString = _signIn.currentUser .idToken .tokenString ;
@@ -830,10 +917,13 @@ - (void)testOAuthLogin_WithClaims_ReturnsIdTokenWithCorrectClaims {
830917 NSData *payloadData = [[NSData alloc ]
831918 initWithBase64EncodedString: components[1 ]
832919 options: NSDataBase64DecodingIgnoreUnknownCharacters ];
833- NSDictionary *claims = [NSJSONSerialization JSONObjectWithData: payloadData options: 0 error: nil ];
834- XCTAssertEqualObjects (claims [@" auth_time" ],
920+ NSDictionary *receivedClaims = [NSJSONSerialization JSONObjectWithData: payloadData options: 0 error: nil ];
921+ XCTAssertEqualObjects (receivedClaims [@" auth_time" ],
835922 kAuthTime ,
836923 @" The 'auth_time' claim should be present and correct." );
924+ XCTAssertEqualObjects (receivedClaims[@" amr" ],
925+ [OIDTokenResponse testAMRValues ],
926+ @" The 'amr' claim should be present and correct." );
837927}
838928
839929- (void )testAddScopes {
@@ -963,7 +1053,7 @@ - (void)testAddScopes_WithPreviouslyRequestedClaims {
9631053 NSArray <NSString *> *expectedScopes = @[kNewScope , kGrantedScope ];
9641054 XCTAssertEqualObjects (grantedScopes, expectedScopes);
9651055 XCTAssertEqualObjects (_savedAuthorizationRequest.additionalParameters [@" claims" ],
966- kNonEssentialAuthTimeClaimsJsonString ,
1056+ kNonEssentialAuthTimeClaimJsonString ,
9671057 @" Claims JSON should be correctly formatted" );
9681058
9691059 [_user verify ];
@@ -1688,7 +1778,7 @@ - (void)OAuthLoginWithAddScopesFlow:(BOOL)addScopesFlow
16881778 nonce: nonce
16891779 errorString: authError];
16901780
1691- NSString *idToken = claims ? [OIDTokenResponse fatIDTokenWithAuthTime ] : [OIDTokenResponse fatIDToken ];
1781+ NSString *idToken = claims ? [OIDTokenResponse fatIDTokenWithClaims ] : [OIDTokenResponse fatIDToken ];
16921782 OIDTokenResponse *tokenResponse =
16931783 [OIDTokenResponse testInstanceWithIDToken: idToken
16941784 accessToken: restoredSignIn ? kAccessToken : nil
@@ -1958,7 +2048,7 @@ - (void)OAuthLoginWithAddScopesFlow:(BOOL)addScopesFlow
19582048 additionalParameters[@" emm_passcode_info_required" ] = @" 1" ;
19592049 }
19602050 if (claimsAsJSONRequired) {
1961- additionalParameters[@" claims" ] = kNonEssentialAuthTimeClaimsJsonString ;
2051+ additionalParameters[@" claims" ] = kNonEssentialAuthTimeClaimJsonString ;
19622052 }
19632053
19642054 return [additionalParameters copy ];
0 commit comments