Uwierzytelnianie w Firebase za pomocą linku e-mail na platformach Apple

Za pomocą usługi Uwierzytelnianie Firebase możesz logować użytkowników, wysyłając im e-maile z linkiem, który mogą kliknąć, aby się zalogować. W trakcie tego procesu weryfikowany jest też adres e-mail użytkownika.

Logowanie za pomocą adresu e-mail ma wiele korzyści:

  • Łatwa rejestracja i logowanie.
  • Mniejsze ryzyko ponownego użycia hasła w różnych aplikacjach, co może osłabić bezpieczeństwo nawet dobrze dobranych haseł.
  • Możliwość uwierzytelnienia użytkownika przy jednoczesnym sprawdzeniu, czy jest on prawowitym właścicielem adresu e-mail.
  • Aby się zalogować, użytkownik potrzebuje tylko dostępnego konta e-mail. Nie musi mieć numeru telefonu ani konta w mediach społecznościowych.
  • Użytkownik może bezpiecznie się zalogować bez konieczności podawania (ani zapamiętywania) hasła, co może być uciążliwe na urządzeniu mobilnym.
  • Dotychczasowy użytkownik, który logował się za pomocą identyfikatora e-mail (hasła lub federacji), może przejść na logowanie się tylko za pomocą adresu e-mail. Na przykład użytkownik, który zapomniał hasła, może się zalogować bez konieczności jego resetowania.

Zanim zaczniesz

Do instalacji zależności Firebase i do zarządzania nimi możesz używać menedżera pakietów Swift.

  1. Po otwarciu projektu aplikacji wybierz w Xcode kolejno File (Plik) > Add Packages (Dodaj pakiety).
  2. Gdy pojawi się prośba, dodaj repozytorium pakietu SDK Firebase na platformy Apple:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Wybierz bibliotekę Firebase Authentication.
  5. Dodaj flagę -ObjC do sekcji Other Linker Flags (Inne flagi linkera) w ustawieniach kompilacji docelowej.
  6. Gdy skończysz, Xcode zacznie automatycznie wyszukiwać i pobierać Twoje zależności w tle.

Aby logować użytkowników za pomocą linku w e-mailu, musisz najpierw włączyć dostawcę poczty e-mail i metodę logowania za pomocą linku w e-mailu w projekcie w Firebase:

  1. W konsoli Firebase otwórz Zabezpieczenia > Uwierzytelnianie.

  2. Na karcie Metoda logowania włącz dostawcę logowania E-mail/hasło. Pamiętaj, że aby korzystać z logowania za pomocą linku w e-mailu, musisz włączyć logowanie za pomocą e-maila i hasła.

  3. W tej samej sekcji włącz dostawcę Link w e-mailu (logowanie bez hasła).

  4. Kliknij Zapisz.

Aby rozpocząć proces uwierzytelniania, wyświetl użytkownikowi interfejs, w którym będzie on mógł podać swój adres e-mail, a następnie wywołaj funkcję sendSignInLink, aby poprosić Firebase o wysłanie linku uwierzytelniającego na adres e-mail użytkownika.

  1. Utwórz obiekt ActionCodeSettings, który zawiera instrukcje dla Firebase dotyczące tworzenia linku w e-mailu. Ustaw wartości w tych polach:

    • url: precyzyjny link do osadzenia i dodatkowy stan do przekazania. Jeśli jeszcze tego nie zrobisz, dodaj swoją domenę do listy autoryzowanych domen:

      1. W konsoli Firebase otwórz kartę Zabezpieczenia > Uwierzytelnianie > Ustawienia.

      2. W sekcji Autoryzowane domeny kliknij Dodaj domenę i dodaj swoją domenę.

    • iOSBundleID i androidPackageName: pomagają usłudze Firebase Authentication określić , czy ma utworzyć link tylko do witryny, czy link mobilny, który zostanie otwarty na urządzeniu z Androidem lub Apple.
    • handleCodeInApp: ustaw na true. W przeciwieństwie do innych działań wykonywanych poza pasmem (resetowanie hasła i weryfikacja adresu e-mail) operację logowania należy zawsze dokończyć w aplikacji. Dzieje się tak, ponieważ na końcu procesu użytkownik powinien być zalogowany, a jego stan uwierzytelnienia powinien być zachowany w aplikacji.
    • linkDomain: jeśli dla projektu zdefiniowano niestandardowe domeny linków, określ, której z nich należy użyć, gdy link ma zostać otwarty w określonej aplikacji mobilnej. W przeciwnym razie automatycznie zostanie wybrana domena domyślna (np. PROJECT_ID.firebaseapp.com).Hosting
    • dynamicLinkDomain: wycofany. Nie podawaj tego parametru.

    Swift

    let actionCodeSettings = ActionCodeSettings()
    actionCodeSettings.url = URL(string: "https://www.example.com")
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = true
    actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!)
    actionCodeSettings.setAndroidPackageName("com.example.android",
                                             installIfNotAvailable: false, minimumVersion: "12")

    Objective-C

    FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init];
    [actionCodeSettings setURL:[NSURL URLWithString:@"https://www.example.com"]];
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = YES;
    [actionCodeSettings setIOSBundleID:[[NSBundle mainBundle] bundleIdentifier]];
    [actionCodeSettings setAndroidPackageName:@"com.example.android"
                        installIfNotAvailable:NO
                               minimumVersion:@"12"];

    Więcej informacji o ActionCodeSettings znajdziesz w sekcji Przekazywanie stanu w działaniach związanych z e-mailami.

  2. Poproś użytkownika o podanie adresu e-mail.

  3. Wyślij link uwierzytelniający na adres e-mail użytkownika i zapisz ten adres na wypadek, gdyby użytkownik dokończył logowanie za pomocą e-maila na tym samym urządzeniu.

    Swift

    Auth.auth().sendSignInLink(toEmail: email,
                               actionCodeSettings: actionCodeSettings) { error in
      // ...
        if let error = error {
          self.showMessagePrompt(error.localizedDescription)
          return
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        UserDefaults.standard.set(email, forKey: "Email")
        self.showMessagePrompt("Check your email for link")
        // ...
    }

    Objective-C

    [[FIRAuth auth] sendSignInLinkToEmail:email
                       actionCodeSettings:actionCodeSettings
                               completion:^(NSError *_Nullable error) {
      // ...
        if (error) {
          [self showMessagePrompt:error.localizedDescription];
           return;
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        [NSUserDefaults.standardUserDefaults setObject:email forKey:@"Email"];
        [self showMessagePrompt:@"Check your email for link"];
        // ...
    }];

Potencjalne problemy z bezpieczeństwem

Aby zapobiec użyciu linku do logowania w celu zalogowania się jako niepożądany użytkownik lub na niepożądanym urządzeniu, usługa Uwierzytelnianie Firebase wymaga podania adresu e-mail użytkownika podczas dokonywania logowania. Aby logowanie się powiodło, ten adres e-mail musi być zgodny z adresem, na który pierwotnie został wysłany link do logowania.

Możesz uprościć ten proces dla użytkowników, którzy otwierają link do logowania na tym samym urządzeniu, na którym go żądają, zapisując ich adres e-mail lokalnie podczas wysyłania e-maila z linkiem do logowania. Następnie użyj tego adresu, aby dokończyć proces.

Po zakończeniu logowania wszystkie poprzednie niezweryfikowane metody logowania zostaną usunięte, a wszystkie istniejące sesje zostaną unieważnione. Jeśli np. ktoś wcześniej utworzył niezweryfikowane konto z tym samym adresem e-mail i hasłem, hasło użytkownika zostanie usunięte, aby uniemożliwić oszustowi, który przejął własność i utworzył to niezweryfikowane konto, ponowne zalogowanie się na to samo konto.

Dokończenie logowania w aplikacji mobilnej Apple

Firebase Authentication używa Firebase Hosting do wysyłania linku w e-mailu na urządzenie mobilne. Aby dokończyć logowanie w aplikacji mobilnej, aplikacja musi być skonfigurowana tak, aby wykrywała przychodzący link aplikacji, analizowała bazowy precyzyjny link, a następnie dokończyła logowanie. Więcej informacji o tym, jak to zrobić, znajdziesz w artykule o linkach uniwersalnych i powiązanych domenach w iOS .

Konfiguruj Firebase Hosting

Firebase Authentication używa domen Firebase Hosting podczas tworzenia i wysyłania linku, który ma zostać otwarty w aplikacji mobilnej. Dla Ciebie została już skonfigurowana domyślna domena Firebase Hosting.

  1. Skonfiguruj Firebase Hosting domeny:

    W konsoli Firebase otwórz Hosting i usługi bezserwerowe > Hosting.

    • Jeśli chcesz używać domyślnej domeny do linku w e-mailu, który otwiera się w aplikacjach mobilnych, otwórz domyślną witrynę i zanotuj domyślną Hosting domenę. Domyślna domena zwykle wygląda tak: PROJECT_ID.firebaseapp.com.Hosting

      Ta wartość będzie potrzebna podczas konfigurowania aplikacji do przechwytywania przychodzącego linku.

    • Jeśli chcesz używać domeny niestandardowej do linku w e-mailu, możesz zarejestrować ją w Firebase Hosting i użyć jej jako domeny linku.

  2. Konfigurowanie aplikacji Apple:

    Wybraną domenę musisz skonfigurować jako powiązaną domenę dla linków aplikacji. Aby skonfigurować uprawnienie w aplikacji, otwórz w Xcode kartę Signing & Capabilities (Podpisywanie i możliwości) i dodaj domeny Hosting Firebase z poprzedniego kroku do możliwości Associated Domains (Powiązane domeny). Jeśli używasz domyślnej domeny Firebase Hosting, będzie to applinks:PROJECT_ID.firebaseapp.com.

    Więcej informacji znajdziesz w dokumentacji Apple na stronie Supporting associated domains (Obsługa powiązanych domen).

Gdy otrzymasz link w sposób opisany powyżej, sprawdź, czy jest on przeznaczony do uwierzytelniania za pomocą linku w e-mailu, i dokończ logowanie.

Swift

if Auth.auth().isSignIn(withEmailLink: link) {
        Auth.auth().signIn(withEmail: email, link: self.link) { user, error in
          // ...
        }
}

Objective-C

if ([[FIRAuth auth] isSignInWithEmailLink:link]) {
    [[FIRAuth auth] signInWithEmail:email
                               link:link
                         completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
      // ...
    }];
}

Więcej informacji o tym, jak obsługiwać logowanie za pomocą linku w e-mailu w aplikacji na Androida , znajdziesz w przewodniku dla Androida.

Więcej informacji o tym, jak obsługiwać logowanie za pomocą linku w e-mailu w aplikacji internetowej , znajdziesz w przewodniku dla aplikacji internetowych.

Możesz też połączyć tę metodę uwierzytelniania z istniejącym użytkownikiem. Na przykład użytkownik, który wcześniej uwierzytelnił się u innego dostawcy, np. za pomocą numeru telefonu, może dodać tę metodę logowania do swojego dotychczasowego konta.

Różnica będzie widoczna w drugiej połowie operacji:

Swift

  let credential = EmailAuthCredential.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.link(with: credential) { authData, error in
    if (error) {
      // And error occurred during linking.
      return
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }

Objective-C

  FIRAuthCredential *credential =
      [FIREmailAuthProvider credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      linkWithCredential:credential
              completion:^(FIRAuthDataResult *_Nullable result,
                           NSError *_Nullable error) {
    if (error) {
      // And error occurred during linking.
      return;
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }];

Możesz też użyć tej metody do ponownego uwierzytelnienia użytkownika za pomocą linku w e-mailu przed wykonaniem operacji wymagającej zachowania szczególnej ostrożności.

Swift

  let credential = EmailAuthProvider.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.reauthenticate(with: credential) { authData, error in
    if (error) {
      // And error occurred during re-authentication.
      return
    }
    // The user was successfully re-authenticated.
  }

Objective-C

  FIRAuthCredential *credential =
      [FIREmailAuthCredential credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      reauthenticateWithCredential:credential
                        completion:^(FIRAuthDataResult *_Nullable result,
                                     NSError *_Nullable error) {
    if (error) {
      // And error occurred during re-authentication
      return;
    }
    // The user was successfully re-authenticated.
  }];

Jednak proces ten może się nie powieść, ponieważ może się zakończyć na innym urządzeniu, na którym pierwotny użytkownik nie był zalogowany. W takim przypadku użytkownikowi może się wyświetlić błąd, który zmusi go do otwarcia linku na tym samym urządzeniu. W linku można przekazać pewien stan, aby podać informacje o typie operacji i identyfikatorze UID użytkownika.

Przed wydaniem pakietu SDK na iOS w wersji 11.8.0 funkcja logowania za pomocą linku w e-mailu korzystała z Firebase Dynamic Links aby otwierać linki do logowania w odpowiedniej aplikacji. Te linki weryfikacyjne są wycofane, ponieważ Firebase Dynamic Links zostaną wyłączone 25 sierpnia 2025 r.Firebase Authentication

Jeśli Twoja aplikacja używa linków w starym stylu, musisz przeprowadzić migrację do nowego Firebase Hosting systemu.

Jeśli projekt został utworzony 15 września 2023 r. lub później, ochrona przed wyliczaniem adresów e-mail jest domyślnie włączona. Ta funkcja zwiększa bezpieczeństwo kont użytkowników w projekcie, ale wyłącza metodę fetchSignInMethodsForEmail(), której wcześniej zalecaliśmy używać do implementowania procesów opartych na identyfikatorze.

Możesz wyłączyć ochronę przed wyliczaniem adresów e-mail w projekcie, ale nie zalecamy tego robić.

Więcej informacji znajdziesz w artykule Włączanie i wyłączanie ochrony przed wyliczaniem adresów e-mail.

Dalsze kroki

Gdy użytkownik zaloguje się po raz pierwszy, zostanie utworzone nowe konto użytkownika i połączone z danymi logowania – nazwą użytkownika i hasłem, numerem telefonu lub informacjami o dostawcy uwierzytelniania. To nowe konto jest przechowywane jako część projektu w Firebase i może służyć do identyfikowania użytkownika w każdej aplikacji w projekcie, niezależnie od sposobu logowania.

Możesz zezwolić użytkownikom na logowanie się w aplikacji za pomocą wielu dostawców uwierzytelniania przez połączenie danych logowania dostawcy uwierzytelniania z istniejącym kontem użytkownika.

Aby wylogować użytkownika, wywołaj funkcję signOut:.

Swift

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

Objective-C

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

Możesz też dodać kod obsługi błędów dla pełnego zakresu błędów uwierzytelniania. Zobacz Obsługa błędów.