Łatwe logowanie się w aplikacji na iOS dzięki FirebaseUI

FirebaseUI to biblioteka utworzona na bazie pakietu SDK Uwierzytelniania Firebase, która udostępnia przepływy w interfejsie użytkownika do aplikacji. FirebaseUI zapewnia następujące korzyści:

  • Wielu dostawców: procesy logowania w przypadku adresu e-mail i hasła, linku w e-mailu, uwierzytelniania telefonu, logowania przez Google, logowania na Facebooku i logowania na Twitterze.
  • Zarządzanie kontem: procesy obsługi zadań związanych z zarządzaniem kontem, takich jak tworzenie konta czy resetowanie hasła.
  • Anonimowe łączenie kont: proces automatycznego łączenia anonimowych kont z dostawcami tożsamości.
  • Możliwość dostosowania: dostosuj wygląd FirebaseUI do swojej aplikacji. Oprócz tego FirebaseUI jest open source, więc możesz utworzyć rozwidlenie projektu i dostosować go do swoich potrzeb.

Zanim zaczniesz

  1. Dodaj Firebase do projektu Apple.

  2. Dodaj FirebaseUI do pliku Podfile:

    pod 'FirebaseUI'
    

    Jeśli wolisz, możesz dodać tylko komponent Auth i dostawców, z których chcesz korzystać:

    pod 'FirebaseUI/Auth'
    
    pod 'FirebaseUI/Google'
    pod 'FirebaseUI/Facebook'
    pod 'FirebaseUI/OAuth' # Used for Sign in with Apple, Twitter, etc
    pod 'FirebaseUI/Phone'
    
  3. Jeśli Twoja aplikacja nie jest jeszcze połączona z projektem Firebase, możesz to zrobić z poziomu konsoli Firebase.

Skonfiguruj metody logowania

Aby móc logować użytkowników za pomocą Firebase, musisz włączyć i skonfigurować metody logowania, które mają być obsługiwane.

Adres e-mail i hasło

W konsoli Firebase otwórz sekcję Uwierzytelnianie i włącz uwierzytelnianie za pomocą adresu e-mail oraz hasła.

  1. W konsoli Firebase otwórz sekcję Uwierzytelnianie. Na karcie Metoda logowania włącz dostawcę E-mail/hasło. Pamiętaj, że aby korzystać z logowania za pomocą linku e-mail, musisz włączyć logowanie za pomocą adresu e-mail lub hasła.

  2. W tej samej sekcji włącz metodę logowania Link w e-mailu (logowanie bez hasła) i kliknij Zapisz.

  3. Logowanie za pomocą linku w e-mailu możesz włączyć, zainicjując instancję FUIEmailAuth za pomocą FIREmailLinkAuthSignInMethod. Musisz też podać prawidłowy obiekt FIRActionCodeSettings z atrybutem handleCodeInApp ustawionym na wartość true.

Swift

var actionCodeSettings = ActionCodeSettings()
actionCodeSettings.url = URL(string: "https://example.appspot.com")
actionCodeSettings.handleCodeInApp = true
actionCodeSettings.setAndroidPackageName("com.firebase.example", installIfNotAvailable: false, minimumVersion: "12")

let provider = FUIEmailAuth(authUI: FUIAuth.defaultAuthUI()!,
                            signInMethod: FIREmailLinkAuthSignInMethod,
                            forceSameDevice: false,
                            allowNewEmailAccounts: true,
                            actionCodeSetting: actionCodeSettings)

Objective-C

FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init];
actionCodeSettings.URL = [NSURL URLWithString:@"https://example.appspot.com"];
actionCodeSettings.handleCodeInApp = YES;
[actionCodeSettings setAndroidPackageName:@"com.firebase.example"
                    installIfNotAvailable:NO
                           minimumVersion:@"12"];

id<FUIAuthProvider> provider = [[FUIEmailAuth alloc] initWithAuthUI:[FUIAuth defaultAuthUI]
                                                       signInMethod:FIREmailLinkAuthSignInMethod
                                                    forceSameDevice:NO
                                              allowNewEmailAccounts:YES
                                                  actionCodeSetting:actionCodeSettings];
  1. Dodatkowo musisz umieścić na białej liście adres URL przekazywany do narzędzia iniatializer. Możesz to zrobić w konsoli Firebase i otwórz sekcję Uwierzytelnianie. Na karcie Metoda logowania dodaj URL w sekcji Autoryzowane domeny.

  2. Po wykryciu precyzyjnego linku musisz przekazać go do interfejsu uwierzytelniania, aby mógł go obsłużyć.

Swift

FUIAuth.defaultAuthUI()!.handleOpen(url, sourceApplication: sourceApplication)

Objective-C

[[FUIAuth defaultAuthUI] handleOpenURL:url sourceApplication:sourceApplication];
  1. Logowanie za pomocą linku w FirebaseUI-iOS za pomocą linku w e-mailu jest zgodne z FirebaseUI-Android i FirebaseUI-web. W tym celu użytkownik rozpoczynający proces z FirebaseUI-Android może otworzyć ten link i zalogować się przez FirebaseUI-web. To samo dotyczy przeciwnego przepływu.

Apple

  1. Wykonaj czynności opisane w sekcjach Zanim zaczniesz i Wymagania Apple dotyczące zanonimizowanych danych w przewodniku Firebase Zaloguj się przez Apple.

  2. Dodaj do pliku uprawnień funkcję Zaloguj się przez Apple.

  3. Zainicjuj instancję dostawcy OAuth skonfigurowaną pod kątem funkcji Zaloguj się przez Apple:

    Swift

    provider = FUIOAuth.appleAuthProvider()
    

    Objective-C

    FUIOAuth *provider = [FUIOAuth appleAuthProvider];
    

Google

  1. Skonfiguruj Logowanie przez Google, korzystając z tego samouczka

Facebook

  1. Skonfiguruj pakiet Facebook Login SDK, postępując zgodnie z tą stroną na temat rozpoczynania pracy z Facebookiem.

  2. W konsoli Firebase otwórz sekcję Uwierzytelnianie i włącz Facebooka. Aby włączyć logowanie przez Facebooka, musisz podać identyfikator aplikacji Facebook i tajny klucz aplikacji, które znajdziesz w konsoli Facebook Developers Console.

  3. Na ekranie Ustawienia projektu > Funkcje włącz udostępnianie pęku kluczy w projekcie Xcode.

  4. Dodaj fbFACEBOOK_APP_ID jako schemat adresu URL w projekcie Xcode.

  5. Dodaj identyfikator aplikacji Facebook i wyświetlaną nazwę do pliku Info.plist:

    Klucz Wartość
    Identyfikator aplikacji Facebook FACEBOOK_APP_ID (np. 1234567890)
    NazwaWyświetlana na Facebooku Nazwa Twojej aplikacji
  6. Zainicjuj instancję dostawcy Facebooka:

    Swift

    provider = FUIFacebookAuth(authUI: FUIAuth.defaultAuthUI())
    

    Objective-C

    FUIFacebookAuth *provider = [[FUIFacebookAuth alloc] initWithAuthUI:[FUIAuth defaultAuthUI]];
    

  7. Jeśli chcesz korzystać z Facebook Limited Login (Logowanie ograniczone przez Facebooka), ustaw właściwość useLimitedLogin w wystąpieniu FUIFacebookAuth.

    Swift

    provider.useLimitedLogin = true
    

    Objective-C

    provider.useLimitedLogin = YES;
    

Twitter

  1. W konsoli Firebase otwórz sekcję Uwierzytelnianie i włącz Twittera. Aby umożliwić logowanie przez Twittera, musisz podać swój klucz klienta i tajny klucz klienta Twitter API, które znajdziesz w konsoli zarządzania aplikacjami Twittera.

  2. Zainicjuj instancję dostawcy OAuth skonfigurowaną na potrzeby logowania przez Twittera:

    Swift

    provider = FUIOAuth.twitterAuthProvider()
    

    Objective-C

    FUIOAuth *provider = [FUIOAuth twitterAuthProvider];
    

Numer telefonu

  1. W konsoli Firebase otwórz sekcję Uwierzytelnianie i włącz logowanie numeru telefonu.

  2. Firebase musi mieć możliwość sprawdzania, czy żądania zalogowania się na numer telefonu pochodzą z Twojej aplikacji. Można to zrobić na przykład za pomocą powiadomień APN. Więcej informacji znajdziesz w artykule Włączanie weryfikacji aplikacji.

    Aby włączyć powiadomienia APNs do użytku z Uwierzytelnianiem Firebase:

    1. W Xcode włącz powiadomienia push dla swojego projektu.

    2. Prześlij swój klucz uwierzytelniania APNs do Firebase. Jeśli nie masz jeszcze klucza uwierzytelniania APNs, utwórz go w Apple Developer Member Center.

      1. W projekcie w konsoli Firebase kliknij ikonę koła zębatego, wybierz Ustawienia projektu, a następnie kartę Komunikacja w chmurze.

      2. W sekcji Klucz uwierzytelniania APNs w sekcji Konfiguracja aplikacji na iOS kliknij przycisk Prześlij.

      3. Przejdź do lokalizacji, w której masz zapisany klucz, wybierz go i kliknij Otwórz. Dodaj identyfikator klucza (dostępny w Apple Developer Member Center) i kliknij Prześlij.

      Jeśli masz już certyfikat APNs, możesz zamiast tego przesłać certyfikat.

  3. Jeśli nie można odebrać powiadomień APN na urządzenie, Firebase używa reCAPTCHA do weryfikacji żądań.

    Aby włączyć weryfikację reCAPTCHA, wykonaj te czynności w Xcode:

    1. Otwórz konfigurację projektu: kliknij dwukrotnie nazwę projektu w widoku drzewa po lewej stronie. Wybierz aplikację w sekcji CELE, kliknij kartę Informacje i rozwiń sekcję Typy adresów URL.
    2. Kliknij przycisk + i dodaj zakodowany identyfikator aplikacji jako schemat adresu URL. Zakodowany identyfikator aplikacji znajdziesz na stronie Ustawienia ogólne konsoli Firebase, w sekcji dotyczącej aplikacji na iOS. Pozostałe pola pozostaw puste.

      Po zakończeniu konfiguracja powinna wyglądać podobnie do tej (ale z wartościami dotyczącymi aplikacji):

      Zrzut ekranu interfejsu konfiguracji niestandardowego schematu adresu URL Xcode
  4. Opcjonalnie: Firebase używa wirowania metod, aby automatycznie uzyskiwać token APNs Twojej aplikacji, obsługiwać ciche powiadomienia push wysyłane do Twojej aplikacji i automatycznie przechwytywać przekierowanie schematu niestandardowego ze strony weryfikacji reCAPTCHA podczas weryfikacji.

    Jeśli nie chcesz używać przesuwania palcem, przeczytaj artykuł Dodatek: logowanie się przy użyciu telefonu bez przesuwania w dokumentacji uwierzytelniania pakietu SDK Firebase.

Zaloguj się

Aby uruchomić logowanie się w FirebaseUI, najpierw zainicjuj interfejs FirebaseUI:

Swift

import FirebaseAuthUI

/* ... */

FirebaseApp.configure()
let authUI = FUIAuth.defaultAuthUI()
// You need to adopt a FUIAuthDelegate protocol to receive callback
authUI.delegate = self

Objective-C

@import FirebaseAuthUI;

...

[FIRApp configure];
FUIAuth *authUI = [FUIAuth defaultAuthUI];
// You need to adopt a FUIAuthDelegate protocol to receive callback
authUI.delegate = self;

Następnie skonfiguruj FirebaseUI, tak aby korzystała z metod logowania, które chcesz obsługiwać:

Swift

import FirebaseAuthUI
import FirebaseFacebookAuthUI
import FirebaseGoogleAuthUI
import FirebaseOAuthUI
import FirebasePhoneAuthUI

let providers: [FUIAuthProvider] = [
  FUIGoogleAuth(),
  FUIFacebookAuth(),
  FUITwitterAuth(),
  FUIPhoneAuth(authUI:FUIAuth.defaultAuthUI()),
]
self.authUI.providers = providers

Objective-C

@import FirebaseAuthUI;
@import FirebaseFacebookAuthUI;
@import FirebaseGoogleAuthUI;
@import FirebaseOAuthUI;
@import FirebasePhoneAuthUI;

...

NSArray<id<FUIAuthProvider>> *providers = @[
  [[FUIGoogleAuth alloc] init],
  [[FUIFacebookAuth alloc] init],
  [[FUITwitterAuth alloc] init],
  [[FUIPhoneAuth alloc] initWithAuthUI:[FUIAuth defaultAuthUI]]
];
_authUI.providers = providers;

Jeśli masz włączone logowanie przez Google lub Facebooka, zaimplementuj moduł obsługi wyników procesów rejestracji w Google lub na Facebooku:

Swift

func application(_ app: UIApplication, open url: URL,
    options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
  let sourceApplication = options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String?
  if FUIAuth.defaultAuthUI()?.handleOpen(url, sourceApplication: sourceApplication) ?? false {
    return true
  }
  // other URL handling goes here.
  return false
}

Objective-C

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary *)options {
  NSString *sourceApplication = options[UIApplicationOpenURLOptionsSourceApplicationKey];
  return [[FUIAuth defaultAuthUI] handleOpenURL:url sourceApplication:sourceApplication];
}

Na koniec pobierz instancję AuthViewController z usługi FUIAuth. Następnie możesz zaprezentować go jako pierwszy kontroler widoku danych lub użyć innego kontrolera widoku w aplikacji.

Swift

Aby pobrać selektor metody logowania:

let authViewController = authUI.authViewController()

Jeśli korzystasz tylko z logowania się przy użyciu numeru telefonu, możesz zamiast tego wyświetlić bezpośrednio widok logowania z numerem telefonu:

let phoneProvider = FUIAuth.defaultAuthUI().providers.first as! FUIPhoneAuth
phoneProvider.signIn(withPresenting: currentlyVisibleController, phoneNumber: nil)

Objective-C

Aby pobrać selektor metody logowania:

UINavigationController *authViewController = [authUI authViewController];

Jeśli korzystasz tylko z logowania się przy użyciu numeru telefonu, możesz zamiast tego wyświetlić bezpośrednio widok logowania z numerem telefonu:

FUIPhoneAuth *phoneProvider = [FUIAuth defaultAuthUI].providers.firstObject;
[phoneProvider signInWithPresentingViewController:currentlyVisibleController phoneNumber:nil];

Gdy wyświetlisz widok uwierzytelniania, a użytkownik się zaloguje, wynik jest zwracany do przedstawiciela uwierzytelniania FirebaseUI w metodzie didSignInWithUser:error::

Swift

func authUI(_ authUI: FUIAuth, didSignInWith user: FIRUser?, error: Error?) {
  // handle user and error as necessary
}

Objective-C

   - (void)authUI:(FUIAuth *)authUI
didSignInWithUser:(nullable FIRUser *)user
            error:(nullable NSError *)error {
  // Implement this method to handle signed in user or error if any.
}

Wyloguj się

FirebaseUI udostępnia wygodne metody wylogowywania się z Uwierzytelniania Firebase oraz ze wszystkich dostawców tożsamości społecznościowych:

Swift

authUI.signOut()

Objective-C

[authUI signOut];

Dostosowanie

Możesz dostosować ekrany logowania, przypisując kontrolery widoku FirebaseUI do podklasy i określając je w metodach przekazywania dostępu w FUIAuth:

Swift

func authPickerViewController(forAuthUI authUI: FUIAuth) -> FUIAuthPickerViewController {
  return FUICustomAuthPickerViewController(nibName: "FUICustomAuthPickerViewController",
                                           bundle: Bundle.main,
                                           authUI: authUI)
}

func emailEntryViewController(forAuthUI authUI: FUIAuth) -> FUIEmailEntryViewController {
  return FUICustomEmailEntryViewController(nibName: "FUICustomEmailEntryViewController",
                                           bundle: Bundle.main,
                                           authUI: authUI)
}

func passwordRecoveryViewController(forAuthUI authUI: FUIAuth, email: String) -> FUIPasswordRecoveryViewController {
  return FUICustomPasswordRecoveryViewController(nibName: "FUICustomPasswordRecoveryViewController",
                                                 bundle: Bundle.main,
                                                 authUI: authUI,
                                                 email: email)
}

func passwordSignInViewController(forAuthUI authUI: FUIAuth, email: String) -> FUIPasswordSignInViewController {
  return FUICustomPasswordSignInViewController(nibName: "FUICustomPasswordSignInViewController",
                                               bundle: Bundle.main,
                                               authUI: authUI,
                                               email: email)
}

func passwordSignUpViewController(forAuthUI authUI: FUIAuth, email: String) -> FUIPasswordSignUpViewController {
  return FUICustomPasswordSignUpViewController(nibName: "FUICustomPasswordSignUpViewController",
                                               bundle: Bundle.main,
                                               authUI: authUI,
                                               email: email)
}

func passwordVerificationViewController(forAuthUI authUI: FUIAuth, email: String, newCredential: AuthCredential) -> FUIPasswordVerificationViewController {
  return FUICustomPasswordVerificationViewController(nibName: "FUICustomPasswordVerificationViewController",
                                                     bundle: Bundle.main,
                                                     authUI: authUI,
                                                     email: email,
                                                     newCredential: newCredential)
}

Objective-C

- (FUIAuthPickerViewController *)authPickerViewControllerForAuthUI:(FUIAuth *)authUI {
  return [[FUICustomAuthPickerViewController alloc] initWithNibName:@"FUICustomAuthPickerViewController"
                                                             bundle:[NSBundle mainBundle]
                                                             authUI:authUI];
}

- (FUIEmailEntryViewController *)emailEntryViewControllerForAuthUI:(FUIAuth *)authUI {
  return [[FUICustomEmailEntryViewController alloc] initWithNibName:@"FUICustomEmailEntryViewController"
                                                             bundle:[NSBundle mainBundle]
                                                             authUI:authUI];

}

- (FUIPasswordSignInViewController *)passwordSignInViewControllerForAuthUI:(FUIAuth *)authUI
                                                                     email:(NSString *)email {
  return [[FUICustomPasswordSignInViewController alloc] initWithNibName:@"FUICustomPasswordSignInViewController"
                                                                 bundle:[NSBundle mainBundle]
                                                                 authUI:authUI
                                                                  email:email];

}

- (FUIPasswordSignUpViewController *)passwordSignUpViewControllerForAuthUI:(FUIAuth *)authUI
                                                                     email:(NSString *)email {
  return [[FUICustomPasswordSignUpViewController alloc] initWithNibName:@"FUICustomPasswordSignUpViewController"
                                                                 bundle:[NSBundle mainBundle]
                                                                 authUI:authUI
                                                                  email:email];

}

- (FUIPasswordRecoveryViewController *)passwordRecoveryViewControllerForAuthUI:(FUIAuth *)authUI
                                                                         email:(NSString *)email {
  return [[FUICustomPasswordRecoveryViewController alloc] initWithNibName:@"FUICustomPasswordRecoveryViewController"
                                                                   bundle:[NSBundle mainBundle]
                                                                   authUI:authUI
                                                                    email:email];

}

- (FUIPasswordVerificationViewController *)passwordVerificationViewControllerForAuthUI:(FUIAuth *)authUI
                                                                                 email:(NSString *)email
                                                                         newCredential:(FIRAuthCredential *)newCredential {
  return [[FUICustomPasswordVerificationViewController alloc] initWithNibName:@"FUICustomPasswordVerificationViewController"
                                                                       bundle:[NSBundle mainBundle]
                                                                       authUI:authUI
                                                                        email:email
                                                                newCredential:newCredential];
}

Możesz dostosować adres URL do warunków korzystania z aplikacji. Link znajdziesz na ekranie tworzenia konta:

Swift

let kFirebaseTermsOfService = URL(string: "https://example.com/terms")!
authUI.tosurl = kFirebaseTermsOfService

Objective-C

authUI.TOSURL = [NSURL URLWithString:@"https://example.com/terms"];

Możesz też dostosować komunikaty i prompty wyświetlane użytkownikom, określając pakiet niestandardowy:

Swift

authUI.customStringsBundle = NSBundle.mainBundle() // Or any custom bundle.

Objective-C

authUI.customStringsBundle = [NSBundle mainBundle]; // Or any custom bundle.

Następne kroki