diff --git a/FirebaseAuthUI/FUIAuth.m b/FirebaseAuthUI/FUIAuth.m index 09319e2efcf..2d9a37e6c67 100644 --- a/FirebaseAuthUI/FUIAuth.m +++ b/FirebaseAuthUI/FUIAuth.m @@ -295,22 +295,29 @@ - (void)signInWithEmailHint:(NSString *)emailHint [self.auth fetchProvidersForEmail:emailHint completion:^(NSArray *_Nullable providers, NSError *_Nullable error) { - NSString *federatedProviderID = [self federatedAuthProviderFromProviders:providers]; - // Google case - if ([federatedProviderID isEqualToString:FIRGoogleAuthProviderID]) { - id googleProviderUI; + if (error) { + completion(nil, error); + return; + } + NSString *existingFederatedProviderID = [self federatedAuthProviderFromProviders:providers]; + // Set of providers which can be auto-linked + NSSet *supportedProviders = + [NSSet setWithObjects:FIRGoogleAuthProviderID, FIRFacebookAuthProviderID, nil]; + if ([supportedProviders containsObject:existingFederatedProviderID]) { + id authProviderUI; + // Retrieve the FUIAuthProvider instance from FUIAuth for the existing provider ID. for (id provider in self.providers) { - if ([provider.providerID isEqualToString:FIRGoogleAuthProviderID]) { - googleProviderUI = provider; + if ([provider.providerID isEqualToString:existingFederatedProviderID]) { + authProviderUI = provider; break; } } - [googleProviderUI signOut]; - [googleProviderUI signInWithDefaultValue:emailHint - presentingViewController:presentingViewController - completion:^(FIRAuthCredential *_Nullable credential, - NSError *_Nullable error, - FIRAuthResultCallback _Nullable result) { + [authProviderUI signOut]; + [authProviderUI signInWithDefaultValue:emailHint + presentingViewController:presentingViewController + completion:^(FIRAuthCredential *_Nullable credential, + NSError *_Nullable error, + FIRAuthResultCallback _Nullable result) { if (error) { completion(nil, error); return; diff --git a/FirebaseGoogleAuthUI/FUIGoogleAuth.m b/FirebaseGoogleAuthUI/FUIGoogleAuth.m index eab9962e320..38cea1ca7d7 100644 --- a/FirebaseGoogleAuthUI/FUIGoogleAuth.m +++ b/FirebaseGoogleAuthUI/FUIGoogleAuth.m @@ -55,6 +55,11 @@ @implementation FUIGoogleAuth { @brief The callback which should be invoked when the sign in flow completes (or is cancelled.) */ FIRAuthProviderSignInCompletionBlock _pendingSignInCallback; + + /** @var _email + @brief The email address associated with this account. + */ + NSString *_email; } - (instancetype)init { @@ -140,6 +145,10 @@ - (BOOL)handleOpenURL:(NSURL *)URL sourceApplication:(NSString *)sourceApplicati return [signIn handleURL:URL sourceApplication:sourceApplication annotation:nil]; } +- (NSString *)email { + return _email; +} + #pragma mark - GIDSignInDelegate methods - (void)signIn:(GIDSignIn *)signIn @@ -158,6 +167,7 @@ - (void)signIn:(GIDSignIn *)signIn } return; } + _email = user.profile.email; UIActivityIndicatorView *activityView = [FUIAuthBaseViewController addActivityIndicator:_presentingViewController.view]; [activityView startAnimating];