@@ -475,7 +475,11 @@ - (void)signInWithCredential:(id)arguments
475
475
// error.
476
476
result.error (nil , firebaseDictionary[@" message" ], nil , nil );
477
477
} else {
478
- result.error (nil , nil , nil , error);
478
+ if (error.code == FIRAuthErrorCodeSecondFactorRequired) {
479
+ [self handleMultiFactorError: arguments withResult: result withError: error];
480
+ } else {
481
+ result.error (nil , nil , nil , error);
482
+ }
479
483
}
480
484
} else {
481
485
result.success (authResult);
@@ -498,8 +502,13 @@ - (void)signInWithAuthProvider:(id)arguments
498
502
completion: ^(FIRAuthCredential *_Nullable credential,
499
503
NSError *_Nullable error) {
500
504
if (error) {
501
- result.error (kErrCodeInvalidCredential , kErrMsgInvalidCredential , nil ,
502
- nil );
505
+ if (error.code == FIRAuthErrorCodeSecondFactorRequired) {
506
+ [self handleMultiFactorError: arguments
507
+ withResult: result
508
+ withError: error];
509
+ } else {
510
+ result.error (nil , nil , nil , error);
511
+ }
503
512
return ;
504
513
}
505
514
if (credential) {
@@ -582,13 +591,66 @@ - (void)signInWithCustomToken:(id)arguments
582
591
[auth signInWithCustomToken: arguments[kArgumentToken ]
583
592
completion: ^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) {
584
593
if (error != nil ) {
585
- result.error (nil , nil , nil , error);
594
+ if (error.code == FIRAuthErrorCodeSecondFactorRequired) {
595
+ [self handleMultiFactorError: arguments withResult: result withError: error];
596
+ } else {
597
+ result.error (nil , nil , nil , error);
598
+ }
586
599
} else {
587
600
result.success (authResult);
588
601
}
589
602
}];
590
603
}
591
604
605
+ - (void )handleMultiFactorError : (id )arguments
606
+ withResult : (FLTFirebaseMethodCallResult *)result
607
+ withError : (NSError *_Nullable)error {
608
+ #if TARGET_OS_OSX
609
+ result.error (nil , nil , nil , error);
610
+ #else
611
+
612
+ FIRMultiFactorResolver *resolver =
613
+ (FIRMultiFactorResolver *)error.userInfo [FIRAuthErrorUserInfoMultiFactorResolverKey];
614
+
615
+ NSArray <FIRMultiFactorInfo *> *hints = resolver.hints ;
616
+ FIRMultiFactorSession *session = resolver.session ;
617
+
618
+ NSString *sessionId = [[NSUUID UUID ] UUIDString ];
619
+ self->_multiFactorSessionMap [sessionId] = session;
620
+
621
+ NSString *resolverId = [[NSUUID UUID ] UUIDString ];
622
+ self->_multiFactorResolverMap [resolverId] = resolver;
623
+
624
+ NSMutableArray <NSDictionary *> *pigeonHints = [NSMutableArray array ];
625
+
626
+ for (FIRMultiFactorInfo *multiFactorInfo in hints) {
627
+ NSString *phoneNumber;
628
+ if ([multiFactorInfo class ] == [FIRPhoneMultiFactorInfo class ]) {
629
+ FIRPhoneMultiFactorInfo *phoneFactorInfo = (FIRPhoneMultiFactorInfo *)multiFactorInfo;
630
+ phoneNumber = phoneFactorInfo.phoneNumber ;
631
+ }
632
+
633
+ PigeonMultiFactorInfo *object = [PigeonMultiFactorInfo
634
+ makeWithDisplayName: multiFactorInfo.displayName
635
+ enrollmentTimestamp: [NSNumber numberWithDouble: multiFactorInfo.enrollmentDate
636
+ .timeIntervalSince1970]
637
+ factorId: multiFactorInfo.factorID
638
+ uid: multiFactorInfo.UID
639
+ phoneNumber: phoneNumber];
640
+
641
+ [pigeonHints addObject: object.toMap];
642
+ }
643
+
644
+ NSDictionary *output = @{
645
+ kAppName : arguments[kAppName ],
646
+ kArgumentMultiFactorHints : pigeonHints,
647
+ kArgumentMultiFactorSessionId : sessionId,
648
+ kArgumentMultiFactorResolverId : resolverId,
649
+ };
650
+ result.error (nil , nil , output, error);
651
+ #endif
652
+ }
653
+
592
654
- (void )signInWithEmailAndPassword : (id )arguments
593
655
withMethodCallResult : (FLTFirebaseMethodCallResult *)result {
594
656
FIRAuth *auth = [self getFIRAuthFromArguments: arguments];
@@ -597,52 +659,7 @@ - (void)signInWithEmailAndPassword:(id)arguments
597
659
completion: ^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) {
598
660
if (error != nil ) {
599
661
if (error.code == FIRAuthErrorCodeSecondFactorRequired) {
600
- #if TARGET_OS_OSX
601
- result.error (nil , nil , nil , error);
602
- #else
603
- FIRMultiFactorResolver *resolver =
604
- (FIRMultiFactorResolver *)
605
- error.userInfo [FIRAuthErrorUserInfoMultiFactorResolverKey];
606
-
607
- NSArray <FIRMultiFactorInfo *> *hints = resolver.hints ;
608
- FIRMultiFactorSession *session = resolver.session ;
609
-
610
- NSString *sessionId = [[NSUUID UUID ] UUIDString ];
611
- self->_multiFactorSessionMap [sessionId] = session;
612
-
613
- NSString *resolverId = [[NSUUID UUID ] UUIDString ];
614
- self->_multiFactorResolverMap [resolverId] = resolver;
615
-
616
- NSMutableArray <NSDictionary *> *pigeonHints = [NSMutableArray array ];
617
-
618
- for (FIRMultiFactorInfo *multiFactorInfo in hints) {
619
- NSString *phoneNumber;
620
- if ([multiFactorInfo class ] == [FIRPhoneMultiFactorInfo class ]) {
621
- FIRPhoneMultiFactorInfo *phoneFactorInfo =
622
- (FIRPhoneMultiFactorInfo *)multiFactorInfo;
623
- phoneNumber = phoneFactorInfo.phoneNumber ;
624
- }
625
-
626
- PigeonMultiFactorInfo *object = [PigeonMultiFactorInfo
627
- makeWithDisplayName: multiFactorInfo.displayName
628
- enrollmentTimestamp: [NSNumber numberWithDouble: multiFactorInfo.enrollmentDate
629
- .timeIntervalSince1970]
630
- factorId: multiFactorInfo.factorID
631
- uid: multiFactorInfo.UID
632
- phoneNumber: phoneNumber];
633
-
634
- [pigeonHints addObject: object.toMap];
635
- }
636
-
637
- NSDictionary *output = @{
638
- kAppName : arguments[kAppName ],
639
- kArgumentMultiFactorHints : pigeonHints,
640
- kArgumentMultiFactorSessionId : sessionId,
641
- kArgumentMultiFactorResolverId : resolverId,
642
- };
643
- result.error (nil , nil , output, error);
644
- #endif
645
-
662
+ [self handleMultiFactorError: arguments withResult: result withError: error];
646
663
} else {
647
664
result.error (nil , nil , nil , error);
648
665
}
@@ -659,7 +676,11 @@ - (void)signInWithEmailLink:(id)arguments
659
676
link: arguments[@" emailLink" ]
660
677
completion: ^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) {
661
678
if (error != nil ) {
662
- result.error (nil , nil , nil , error);
679
+ if (error.code == FIRAuthErrorCodeSecondFactorRequired) {
680
+ [self handleMultiFactorError: arguments withResult: result withError: error];
681
+ } else {
682
+ result.error (nil , nil , nil , error);
683
+ }
663
684
} else {
664
685
result.success (authResult);
665
686
}
0 commit comments