Skip to content

Commit 9bf67eb

Browse files
authored
Facebook support for email_in_user_when_upgrading (firebase#408)
* Facebook support for email_in_user_when_upgrading Adds support for Facebook when autolinking an exisiting user to a new federated user (Google). * Addresses comments
1 parent b9cc5df commit 9bf67eb

File tree

2 files changed

+29
-12
lines changed

2 files changed

+29
-12
lines changed

FirebaseAuthUI/FUIAuth.m

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -295,22 +295,29 @@ - (void)signInWithEmailHint:(NSString *)emailHint
295295

296296
[self.auth fetchProvidersForEmail:emailHint completion:^(NSArray<NSString *> *_Nullable providers,
297297
NSError *_Nullable error) {
298-
NSString *federatedProviderID = [self federatedAuthProviderFromProviders:providers];
299-
// Google case
300-
if ([federatedProviderID isEqualToString:FIRGoogleAuthProviderID]) {
301-
id<FUIAuthProvider> googleProviderUI;
298+
if (error) {
299+
completion(nil, error);
300+
return;
301+
}
302+
NSString *existingFederatedProviderID = [self federatedAuthProviderFromProviders:providers];
303+
// Set of providers which can be auto-linked
304+
NSSet *supportedProviders =
305+
[NSSet setWithObjects:FIRGoogleAuthProviderID, FIRFacebookAuthProviderID, nil];
306+
if ([supportedProviders containsObject:existingFederatedProviderID]) {
307+
id<FUIAuthProvider> authProviderUI;
308+
// Retrieve the FUIAuthProvider instance from FUIAuth for the existing provider ID.
302309
for (id<FUIAuthProvider> provider in self.providers) {
303-
if ([provider.providerID isEqualToString:FIRGoogleAuthProviderID]) {
304-
googleProviderUI = provider;
310+
if ([provider.providerID isEqualToString:existingFederatedProviderID]) {
311+
authProviderUI = provider;
305312
break;
306313
}
307314
}
308-
[googleProviderUI signOut];
309-
[googleProviderUI signInWithDefaultValue:emailHint
310-
presentingViewController:presentingViewController
311-
completion:^(FIRAuthCredential *_Nullable credential,
312-
NSError *_Nullable error,
313-
FIRAuthResultCallback _Nullable result) {
315+
[authProviderUI signOut];
316+
[authProviderUI signInWithDefaultValue:emailHint
317+
presentingViewController:presentingViewController
318+
completion:^(FIRAuthCredential *_Nullable credential,
319+
NSError *_Nullable error,
320+
FIRAuthResultCallback _Nullable result) {
314321
if (error) {
315322
completion(nil, error);
316323
return;

FirebaseGoogleAuthUI/FUIGoogleAuth.m

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ @implementation FUIGoogleAuth {
5555
@brief The callback which should be invoked when the sign in flow completes (or is cancelled.)
5656
*/
5757
FIRAuthProviderSignInCompletionBlock _pendingSignInCallback;
58+
59+
/** @var _email
60+
@brief The email address associated with this account.
61+
*/
62+
NSString *_email;
5863
}
5964

6065
- (instancetype)init {
@@ -140,6 +145,10 @@ - (BOOL)handleOpenURL:(NSURL *)URL sourceApplication:(NSString *)sourceApplicati
140145
return [signIn handleURL:URL sourceApplication:sourceApplication annotation:nil];
141146
}
142147

148+
- (NSString *)email {
149+
return _email;
150+
}
151+
143152
#pragma mark - GIDSignInDelegate methods
144153

145154
- (void)signIn:(GIDSignIn *)signIn
@@ -158,6 +167,7 @@ - (void)signIn:(GIDSignIn *)signIn
158167
}
159168
return;
160169
}
170+
_email = user.profile.email;
161171
UIActivityIndicatorView *activityView =
162172
[FUIAuthBaseViewController addActivityIndicator:_presentingViewController.view];
163173
[activityView startAnimating];

0 commit comments

Comments
 (0)