@@ -644,6 +644,7 @@ - (void)testOAuthLogin {
644644 authError: nil
645645 tokenError: nil
646646 emmPasscodeInfoRequired: NO
647+ tokenClaimsAsJSONRequired: NO
647648 keychainError: NO
648649 restoredSignIn: NO
649650 oldAccessToken: NO
@@ -661,6 +662,7 @@ - (void)testOAuthLogin_RestoredSignIn {
661662 authError: nil
662663 tokenError: nil
663664 emmPasscodeInfoRequired: NO
665+ tokenClaimsAsJSONRequired: NO
664666 keychainError: NO
665667 restoredSignIn: YES
666668 oldAccessToken: NO
@@ -678,6 +680,7 @@ - (void)testOAuthLogin_RestoredSignInOldAccessToken {
678680 authError: nil
679681 tokenError: nil
680682 emmPasscodeInfoRequired: NO
683+ tokenClaimsAsJSONRequired: NO
681684 keychainError: NO
682685 restoredSignIn: YES
683686 oldAccessToken: YES
@@ -697,6 +700,7 @@ - (void)testOAuthLogin_AdditionalScopes {
697700 authError: nil
698701 tokenError: nil
699702 emmPasscodeInfoRequired: NO
703+ tokenClaimsAsJSONRequired: NO
700704 keychainError: NO
701705 tokenClaimsError: NO
702706 restoredSignIn: NO
@@ -714,6 +718,7 @@ - (void)testOAuthLogin_AdditionalScopes {
714718 authError: nil
715719 tokenError: nil
716720 emmPasscodeInfoRequired: NO
721+ tokenClaimsAsJSONRequired: NO
717722 keychainError: NO
718723 tokenClaimsError: NO
719724 restoredSignIn: NO
@@ -731,6 +736,7 @@ - (void)testOAuthLogin_AdditionalScopes {
731736 authError: nil
732737 tokenError: nil
733738 emmPasscodeInfoRequired: NO
739+ tokenClaimsAsJSONRequired: NO
734740 keychainError: NO
735741 tokenClaimsError: NO
736742 restoredSignIn: NO
@@ -758,6 +764,7 @@ - (void)testOAuthLogin_WithTokenClaims_FormatsParametersCorrectly {
758764 authError: nil
759765 tokenError: nil
760766 emmPasscodeInfoRequired: NO
767+ tokenClaimsAsJSONRequired: NO
761768 keychainError: NO
762769 tokenClaimsError: NO
763770 restoredSignIn: NO
@@ -776,6 +783,7 @@ - (void)testOAuthLogin_WithTokenClaims_FormatsParametersCorrectly {
776783 authError: nil
777784 tokenError: nil
778785 emmPasscodeInfoRequired: NO
786+ tokenClaimsAsJSONRequired: NO
779787 keychainError: NO
780788 tokenClaimsError: NO
781789 restoredSignIn: NO
@@ -803,6 +811,7 @@ - (void)testOAuthLogin_WithTokenClaims_ReturnsIdTokenWithCorrectClaims {
803811 authError: nil
804812 tokenError: nil
805813 emmPasscodeInfoRequired: NO
814+ tokenClaimsAsJSONRequired: NO
806815 keychainError: NO
807816 tokenClaimsError: NO
808817 restoredSignIn: NO
@@ -838,6 +847,7 @@ - (void)testAddScopes {
838847 authError: nil
839848 tokenError: nil
840849 emmPasscodeInfoRequired: NO
850+ tokenClaimsAsJSONRequired: NO
841851 keychainError: NO
842852 restoredSignIn: YES
843853 oldAccessToken: NO
@@ -856,11 +866,13 @@ - (void)testAddScopes {
856866 OCMStub ([_user configuration ]).andReturn (configuration);
857867 OCMStub ([_user profile ]).andReturn (profile);
858868 OCMStub ([_user grantedScopes ]).andReturn (@[kGrantedScope ]);
869+ OCMStub ([_user authState ]).andReturn (_authState);
859870
860871 [self OAuthLoginWithAddScopesFlow: YES
861872 authError: nil
862873 tokenError: nil
863874 emmPasscodeInfoRequired: NO
875+ tokenClaimsAsJSONRequired: NO
864876 keychainError: NO
865877 restoredSignIn: NO
866878 oldAccessToken: NO
@@ -888,6 +900,80 @@ - (void)testAddScopes {
888900 [profile stopMocking ];
889901}
890902
903+ - (void )testAddScopes_WithPreviouslyRequestedClaims {
904+ GIDTokenClaim *authTimeClaim = [GIDTokenClaim authTimeClaim ];
905+ // Restore the previous sign-in account. This is the preparation for adding scopes.
906+ OCMStub (
907+ [_keychainStore saveAuthSession: OCMOCK_ANY error: OCMArg.anyObjectRef]
908+ ).andDo (^(NSInvocation *invocation) {
909+ self->_keychainSaved = self->_saveAuthorizationReturnValue ;
910+ });
911+ [self OAuthLoginWithAddScopesFlow: NO
912+ authError: nil
913+ tokenError: nil
914+ emmPasscodeInfoRequired: NO
915+ tokenClaimsAsJSONRequired: NO
916+ keychainError: NO
917+ tokenClaimsError: NO
918+ restoredSignIn: NO
919+ oldAccessToken: NO
920+ modalCancel: NO
921+ useAdditionalScopes: NO
922+ additionalScopes: nil
923+ manualNonce: nil
924+ tokenClaims: [NSSet setWithObject: authTimeClaim]];
925+
926+ XCTAssertNotNil (_signIn.currentUser );
927+
928+ id profile = OCMStrictClassMock ([GIDProfileData class ]);
929+ OCMStub ([profile email ]).andReturn (kUserEmail );
930+
931+ // Mock for the method `addScopes`.
932+ GIDConfiguration *configuration = [[GIDConfiguration alloc ] initWithClientID: kClientId
933+ serverClientID: nil
934+ hostedDomain: nil
935+ openIDRealm: kOpenIDRealm ];
936+ OCMStub ([_user configuration ]).andReturn (configuration);
937+ OCMStub ([_user profile ]).andReturn (profile);
938+ OCMStub ([_user grantedScopes ]).andReturn (@[kGrantedScope ]);
939+ OCMStub ([_user authState ]).andReturn (_authState);
940+
941+ [self OAuthLoginWithAddScopesFlow: YES
942+ authError: nil
943+ tokenError: nil
944+ emmPasscodeInfoRequired: NO
945+ tokenClaimsAsJSONRequired: YES
946+ keychainError: NO
947+ restoredSignIn: NO
948+ oldAccessToken: NO
949+ modalCancel: NO ];
950+
951+ NSArray <NSString *> *grantedScopes;
952+ NSString *grantedScopeString = _savedAuthorizationRequest.scope ;
953+
954+ if (grantedScopeString) {
955+ grantedScopeString = [grantedScopeString stringByTrimmingCharactersInSet:
956+ [NSCharacterSet whitespaceCharacterSet ]];
957+ // Tokenize with space as a delimiter.
958+ NSMutableArray <NSString *> *parsedScopes =
959+ [[grantedScopeString componentsSeparatedByString: @" " ] mutableCopy ];
960+ // Remove empty strings.
961+ [parsedScopes removeObject: @" " ];
962+ grantedScopes = [parsedScopes copy ];
963+ }
964+
965+ NSArray <NSString *> *expectedScopes = @[kNewScope , kGrantedScope ];
966+ XCTAssertEqualObjects (grantedScopes, expectedScopes);
967+ XCTAssertEqualObjects (_savedAuthorizationRequest.additionalParameters [@" claims" ],
968+ kNonEssentialAuthTimeClaimsJsonString ,
969+ @" Claims JSON should be correctly formatted" );
970+
971+ [_user verify ];
972+ [profile verify ];
973+ [profile stopMocking ];
974+ }
975+
976+
891977- (void )testOpenIDRealm {
892978 _signIn.configuration = [[GIDConfiguration alloc ] initWithClientID: kClientId
893979 serverClientID: nil
@@ -904,6 +990,7 @@ - (void)testOpenIDRealm {
904990 authError: nil
905991 tokenError: nil
906992 emmPasscodeInfoRequired: NO
993+ tokenClaimsAsJSONRequired: NO
907994 keychainError: NO
908995 restoredSignIn: NO
909996 oldAccessToken: NO
@@ -931,6 +1018,7 @@ - (void)testManualNonce {
9311018 authError: nil
9321019 tokenError: nil
9331020 emmPasscodeInfoRequired: NO
1021+ tokenClaimsAsJSONRequired: NO
9341022 keychainError: NO
9351023 tokenClaimsError: NO
9361024 restoredSignIn: NO
@@ -959,6 +1047,7 @@ - (void)testOAuthLogin_LoginHint {
9591047 authError: nil
9601048 tokenError: nil
9611049 emmPasscodeInfoRequired: NO
1050+ tokenClaimsAsJSONRequired: NO
9621051 keychainError: NO
9631052 restoredSignIn: NO
9641053 oldAccessToken: NO
@@ -984,6 +1073,7 @@ - (void)testOAuthLogin_HostedDomain {
9841073 authError: nil
9851074 tokenError: nil
9861075 emmPasscodeInfoRequired: NO
1076+ tokenClaimsAsJSONRequired: NO
9871077 keychainError: NO
9881078 restoredSignIn: NO
9891079 oldAccessToken: NO
@@ -998,6 +1088,7 @@ - (void)testOAuthLogin_ConsentCanceled {
9981088 authError: @" access_denied"
9991089 tokenError: nil
10001090 emmPasscodeInfoRequired: NO
1091+ tokenClaimsAsJSONRequired: NO
10011092 keychainError: NO
10021093 restoredSignIn: NO
10031094 oldAccessToken: NO
@@ -1012,6 +1103,7 @@ - (void)testOAuthLogin_ModalCanceled {
10121103 authError: nil
10131104 tokenError: nil
10141105 emmPasscodeInfoRequired: NO
1106+ tokenClaimsAsJSONRequired: NO
10151107 keychainError: NO
10161108 restoredSignIn: NO
10171109 oldAccessToken: NO
@@ -1036,6 +1128,7 @@ - (void)testOAuthLogin_KeychainError {
10361128 authError: nil
10371129 tokenError: nil
10381130 emmPasscodeInfoRequired: NO
1131+ tokenClaimsAsJSONRequired: NO
10391132 keychainError: YES
10401133 restoredSignIn: NO
10411134 oldAccessToken: NO
@@ -1056,6 +1149,7 @@ - (void)testOAuthLogin_TokenClaims_FailsWithError {
10561149 authError: nil
10571150 tokenError: nil
10581151 emmPasscodeInfoRequired: NO
1152+ tokenClaimsAsJSONRequired: NO
10591153 keychainError: NO
10601154 tokenClaimsError: YES
10611155 restoredSignIn: NO
@@ -1093,6 +1187,7 @@ - (void)testSignOut {
10931187 authError: nil
10941188 tokenError: nil
10951189 emmPasscodeInfoRequired: NO
1190+ tokenClaimsAsJSONRequired: NO
10961191 keychainError: NO
10971192 restoredSignIn: YES
10981193 oldAccessToken: NO
@@ -1339,6 +1434,7 @@ - (void)testEmmSupportRequestParameters {
13391434 authError: nil
13401435 tokenError: nil
13411436 emmPasscodeInfoRequired: NO
1437+ tokenClaimsAsJSONRequired: NO
13421438 keychainError: NO
13431439 restoredSignIn: NO
13441440 oldAccessToken: NO
@@ -1390,6 +1486,7 @@ - (void)testEmmPasscodeInfo {
13901486 authError: nil
13911487 tokenError: nil
13921488 emmPasscodeInfoRequired: YES
1489+ tokenClaimsAsJSONRequired: NO
13931490 keychainError: NO
13941491 restoredSignIn: NO
13951492 oldAccessToken: NO
@@ -1421,6 +1518,7 @@ - (void)testAuthEndpointEMMError {
14211518 authError: callbackParams[@" error" ]
14221519 tokenError: nil
14231520 emmPasscodeInfoRequired: NO
1521+ tokenClaimsAsJSONRequired: NO
14241522 keychainError: NO
14251523 restoredSignIn: NO
14261524 oldAccessToken: NO
@@ -1458,6 +1556,7 @@ - (void)testTokenEndpointEMMError {
14581556 authError: nil
14591557 tokenError: emmError
14601558 emmPasscodeInfoRequired: NO
1559+ tokenClaimsAsJSONRequired: NO
14611560 keychainError: NO
14621561 restoredSignIn: NO
14631562 oldAccessToken: NO
@@ -1542,6 +1641,7 @@ - (void)OAuthLoginWithAddScopesFlow:(BOOL)addScopesFlow
15421641 authError: (NSString *)authError
15431642 tokenError: (NSError *)tokenError
15441643 emmPasscodeInfoRequired: (BOOL )emmPasscodeInfoRequired
1644+ tokenClaimsAsJSONRequired: (BOOL )tokenClaimsAsJSONRequired
15451645 keychainError: (BOOL )keychainError
15461646 restoredSignIn: (BOOL )restoredSignIn
15471647 oldAccessToken: (BOOL )oldAccessToken
@@ -1550,6 +1650,7 @@ - (void)OAuthLoginWithAddScopesFlow:(BOOL)addScopesFlow
15501650 authError: authError
15511651 tokenError: tokenError
15521652 emmPasscodeInfoRequired: emmPasscodeInfoRequired
1653+ tokenClaimsAsJSONRequired: tokenClaimsAsJSONRequired
15531654 keychainError: keychainError
15541655 tokenClaimsError: NO
15551656 restoredSignIn: restoredSignIn
@@ -1566,6 +1667,7 @@ - (void)OAuthLoginWithAddScopesFlow:(BOOL)addScopesFlow
15661667 authError: (NSString *)authError
15671668 tokenError: (NSError *)tokenError
15681669 emmPasscodeInfoRequired: (BOOL )emmPasscodeInfoRequired
1670+ tokenClaimsAsJSONRequired: (BOOL )tokenClaimsAsJSONRequired
15691671 keychainError: (BOOL )keychainError
15701672 tokenClaimsError: (BOOL )tokenClaimsError
15711673 restoredSignIn: (BOOL )restoredSignIn
@@ -1582,8 +1684,9 @@ - (void)OAuthLoginWithAddScopesFlow:(BOOL)addScopesFlow
15821684 [[[_authState expect ] andReturnValue: [NSNumber numberWithBool: isAuthorized]] isAuthorized ];
15831685 }
15841686
1585- NSDictionary <NSString *, NSString *> *additionalParameters = emmPasscodeInfoRequired ?
1586- @{ @" emm_passcode_info_required" : @" 1" } : nil ;
1687+ NSDictionary <NSString *, NSString *> *additionalParameters =
1688+ [self getAdditionalParametersWithEMMPasscodeInfoRequired: emmPasscodeInfoRequired
1689+ tokenClaimsAsJSONRequired: tokenClaimsAsJSONRequired];
15871690 OIDAuthorizationResponse *authResponse =
15881691 [OIDAuthorizationResponse testInstanceWithAdditionalParameters: additionalParameters
15891692 nonce: nonce
@@ -1646,6 +1749,7 @@ - (void)OAuthLoginWithAddScopesFlow:(BOOL)addScopesFlow
16461749 self->_authError = error;
16471750 };
16481751 if (addScopesFlow) {
1752+ [[[_authState expect ] andReturn: authResponse] lastAuthorizationResponse ];
16491753 [_signIn addScopes: @[kNewScope ]
16501754#if TARGET_OS_IOS || TARGET_OS_MACCATALYST
16511755 presentingViewController:_presentingViewController
@@ -1846,4 +1950,22 @@ - (void)OAuthLoginWithAddScopesFlow:(BOOL)addScopesFlow
18461950 }
18471951}
18481952
1953+ #pragma mark - Private Helpers
1954+
1955+ - (NSDictionary <NSString *, NSString *> *)
1956+ getAdditionalParametersWithEMMPasscodeInfoRequired: (BOOL )emmPasscodeInfoRequired
1957+ tokenClaimsAsJSONRequired: (BOOL )tokenClaimsAsJSONRequired {
1958+ NSMutableDictionary <NSString *, NSString *> *additionalParameters =
1959+ [NSMutableDictionary dictionary ];
1960+
1961+ if (emmPasscodeInfoRequired) {
1962+ additionalParameters[@" emm_passcode_info_required" ] = @" 1" ;
1963+ }
1964+ if (tokenClaimsAsJSONRequired) {
1965+ additionalParameters[@" claims" ] = kNonEssentialAuthTimeClaimsJsonString ;
1966+ }
1967+
1968+ return [additionalParameters copy ];
1969+ }
1970+
18491971@end
0 commit comments