Użyj Uwierzytelniania Firebase, aby zalogować użytkownika. Wyślij mu e-maila z linkiem, który umożliwi mu zalogowanie się. W ramach tego procesu weryfikowany jest też adres e-mail użytkownika.
Logowanie się za pomocą adresu e-mail ma wiele zalet:
- Rejestracja i logowanie bez zbędnych formalności.
- mniejsze ryzyko ponownego użycia hasła w różnych aplikacjach, co może obniżyć bezpieczeństwo nawet dobrze dobranych haseł;
- Umożliwia uwierzytelnianie użytkownika i weryfikowanie, czy jest on prawowitym właścicielem adresu e-mail.
- Aby się zalogować, użytkownik potrzebuje tylko dostępu do konta e-mail. Nie musisz być właścicielem numeru telefonu ani konta w mediach społecznościowych.
- Użytkownik może logować się bezpiecznie bez konieczności podawania (lub zapamiętywania) hasła, co może być uciążliwe na urządzeniu mobilnym.
- Istniejący użytkownik, który wcześniej logował się przy użyciu identyfikatora e-mail (hasła lub federacji), może uzyskać możliwość logowania się tylko za pomocą adresu e-mail. Na przykład użytkownik, który zapomniał hasło, może się zalogować bez konieczności resetowania hasła.
Zanim zaczniesz
Do instalacji zależności Firebase i zarządzania nimi możesz używać menedżera pakietów Swift.
- Po otwarciu projektu aplikacji w Xcode wybierz Plik > Dodaj pakiety.
- Gdy pojawi się prośba, dodaj repozytorium pakietu SDK Firebase na platformy Apple:
- Wybierz bibliotekę Firebase Authentication.
- Dodaj flagę
-ObjC
do sekcji Inne flagi linkera w ustawieniach kompilacji docelowej. - Gdy to zrobisz, Xcode automatycznie zacznie wyszukiwać i pobierać zależności w tle.
https://github.com/firebase/firebase-ios-sdk.git
Włączanie logowania za pomocą usługi Email Link w projekcie Firebase
Aby umożliwić użytkownikom logowanie się za pomocą linku e-mail, musisz najpierw włączyć w projekcie Firebase dostawcę e-maili i metodę logowania za pomocą linku e-mail:
- 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 w e-mailu, musisz włączyć logowanie za pomocą adresu e-mail i hasła.
- W tej samej sekcji włącz metodę logowania Link w e-mailu (logowanie bez hasła).
- Kliknij Zapisz.
Wysyłanie linku uwierzytelniania na adres e-mail użytkownika
Aby zainicjować proces uwierzytelniania, wyświetl użytkownikowi interfejs, który poprosi go o podanie adresu e-mail, a potem wywołaj funkcję sendSignInLink
, aby poprosić Firebase o wysłanie linku uwierzytelniania na adres e-mail użytkownika.
Utwórz obiekt
ActionCodeSettings
, który zawiera instrukcje dotyczące tworzenia linku e-maila. Ustaw wartości w tych polach:url
: precyzyjny link do osadzenia i dodatkowe stany, które mają być przekazywane. Domena linku musi znajdować się na liście autoryzowanych domen w konsoli Firebase (karta Metoda logowania -> Metoda logowania).iOSBundleID
iandroidPackageName
: pomagają Firebase Authentication określić, czy mają utworzyć link tylko do strony internetowej czy do strony mobilnej, który będzie otwierany na urządzeniu z Androidem lub Apple.handleCodeInApp
: ustaw na wartość true. W przeciwieństwie do innych działań wykonywanych poza aplikacją (takich jak resetowanie hasła czy weryfikacja adresu e-mail) operacja logowania musi być zawsze wykonywana w aplikacji. Dzieje się tak, ponieważ na końcu procesu użytkownik powinien być zalogowany, a stan autoryzacji powinien być zachowany w aplikacji.linkDomain
: jeśli w projekcie zdefiniowano niestandardowe Hostingdomeny linków, określ, której z nich chcesz używać, gdy link ma być otwierany przez określoną aplikację mobilną. W przeciwnym razie domyślnie zostanie wybrana domena domyślna (np. ).PROJECT_ID.firebaseapp.com
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 e-mail.Poproś użytkownika o adres e-mail.
Wyślij link uwierzytelniania na adres e-mail użytkownika i zapisz jego adres e-mail na wypadek, gdyby użytkownik zalogował się za pomocą adresu e-mail 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"]; // ... }];
Zaloguj się, klikając link w e-mailu
Potencjalne problemy z bezpieczeństwem
Aby zapobiec używaniu linku logowania przez nieuprawnionego użytkownika lub na nieuprawnionym urządzeniu, usługa Firebase Auth wymaga podania adresu e-mail użytkownika podczas procesu logowania. Aby zalogować się na konto, musisz podać adres e-mail, na który został wysłany link do logowania.
Możesz uprościć ten proces w przypadku użytkowników, którzy otwierają link do logowania na tym samym urządzeniu, na którym wysłali prośbę o link, przechowując ich adresy e-mail lokalnie podczas wysyłania e-maila z linkiem. Następnie użyj tego adresu, aby dokończyć proces.
Po zakończeniu logowania wszystkie wcześniejsze niesprawdzone mechanizmy logowania zostaną usunięte z konta użytkownika, a istniejące sesje zostaną unieważnione. Jeśli na przykład ktoś wcześniej utworzył niezawalone konto z tym samym adresem e-mail i tym samym hasłem, hasło użytkownika zostanie usunięte, aby osoba podszywająca się pod niego nie mogła zalogować się ponownie na to samo konto.
Logowanie się w aplikacji mobilnej Apple
Firebase Authentication używa Firebase Hosting do wysyłania e-maila z linkiem na urządzenie mobilne. Aby umożliwić logowanie się w aplikacji mobilnej, musisz skonfigurować aplikację tak, aby wykrywała przychodzące linki aplikacji, analizowała precyzyjny link podrzędny, a następnie umożliwiała logowanie. Aby dowiedzieć się więcej, zapoznaj się z artykułem Uniwersalne linki i powiązane domeny na iOS.
Skonfiguruj: Firebase Hosting
Firebase Authentication używa domen Firebase Hosting podczas tworzenia i wysyłania linku, który ma być otwierany w aplikacji mobilnej. Domena domyślna Firebase Hosting została już skonfigurowana.
Skonfiguruj domeny Firebase Hosting:
W konsoli Firebase otwórz sekcję Hosting.
Jeśli chcesz użyć domyślnej domeny dla linku e-maila, który otwiera się w aplikacji mobilnej, otwórz witrynę domyślną i zapisz swoją domyślną domenę Hosting. Domyślna domena Hosting wygląda zwykle tak:
.PROJECT_ID.firebaseapp.com
Będzie ona potrzebna do skonfigurowania aplikacji w celu przechwytywania linków przychodzących.
Jeśli chcesz użyć domeny niestandardowej dla linku e-mail, możesz zarejestrować ją w Firebase Hosting i użyć jej jako domeny linku.
Konfigurowanie aplikacji Apple:
Wybraną domenę musisz skonfigurować jako powiązaną domenę dla linków w aplikacji. Aby skonfigurować uprawnienia w aplikacji, otwórz w Xcode kartę Podpisywanie i możliwości i dodaj do możliwości „Powiązane domeny” domeny hostingu Firebase z poprzedniego kroku. Jeśli używasz domyślnej domeny Firebase Hosting, będzie to
.applinks:PROJECT_ID.firebaseapp.com
Więcej informacji znajdziesz w dokumentacji Apple dotyczącej obsługi powiązanych domen.
Weryfikowanie linku i logowanie
Gdy otrzymasz link w sposób opisany powyżej, sprawdź, czy jest on przeznaczony do uwierzytelniania za pomocą linku e-mail, i zaloguj się.
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) { // ... }]; }
Informacje o tym, jak obsługiwać logowanie za pomocą linku e-mail w aplikacji na Androida, znajdziesz w przewodniku po Androidzie.
Aby dowiedzieć się, jak obsługiwać logowanie za pomocą linku e-maila w aplikacji internetowej, zapoznaj się z przewodnikiem po aplikacjach internetowych.
Łączenie/ponowne uwierzytelnianie za pomocą linku e-maila
Możesz też połączyć tę metodę uwierzytelniania z dotychczasowym 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 polega na tym, że druga połowa 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żna go też użyć do ponownego uwierzytelnienia użytkownika, który używa linku e-mail, przed wykonaniem operacji wrażliwej.
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. }];
Ponieważ jednak proces może zakończyć się na innym urządzeniu, na którym pierwotny użytkownik nie był zalogowany, może on nie zostać ukończony. W takim przypadku użytkownik może zobaczyć komunikat o błędzie, który zmusza go do otwarcia linku na tym samym urządzeniu. W linku można przekazać pewien stan, aby podać informacje o typie operacji i identyfikatorze użytkownika (UID).
Wycofane: weryfikacja na podstawie Firebase Dynamic Links
Przed wersją pakietu Firebase Authentication iOS SDK 11.8.0 funkcja logowania za pomocą linku e-mail wykorzystywała Firebase Dynamic Links do otwierania linków logowania w odpowiedniej aplikacji. Te linki weryfikacyjne zostały wycofane, ponieważ Firebase Dynamic Links zostanie wyłączony 25 sierpnia 2025 r..
Jeśli Twoja aplikacja używa linków w starym formacie, przeprowadź ją na nowy system oparty na Firebase Hosting.
Odradzane: rozróżnianie adresu e-mail i hasła od linku e-mail
Jeśli projekt został utworzony 15 września 2023 r. lub później, ochrona przed enumeracją adresów e-mail jest domyślnie włączona. Ta funkcja zwiększa bezpieczeństwo kont użytkowników projektu, ale wyłącza metodę fetchSignInMethodsForEmail()
, która była wcześniej zalecana do implementacji procesów opartych na identyfikatorze.
Możesz wyłączyć ochronę przed wyliczaniem adresów e-mail w przypadku swojego projektu, ale nie zalecamy tego.
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, czyli nazwą użytkownika i hasłem, numerem telefonu lub informacjami dostawcy uwierzytelniania, za pomocą których użytkownik się zalogował. To nowe konto jest przechowywane w ramach projektu Firebase i może służyć do identyfikowania użytkownika we wszystkich aplikacjach w projekcie, niezależnie od tego, jak użytkownik się loguje.
-
W swoich aplikacjach możesz pobrać podstawowe informacje o profilu użytkownika z obiektu
User
. Zobacz Zarządzanie użytkownikami. W regułach Firebase Realtime Database i Cloud Storage Regułach bezpieczeństwa możesz pobrać z zmiennej
auth
unikalny identyfikator zalogowanego użytkownika i używać go do kontrolowania dostępu użytkownika do danych.
Możesz zezwolić użytkownikom na logowanie się w aplikacji za pomocą danych logowania od wielu dostawców uwierzytelniania, połączając je z dotychczasowym kontem użytkownika.
Aby wylogować użytkownika, zadzwoń pod numer
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 do obsługi błędów w przypadku wszystkich błędów uwierzytelniania. Zobacz Obsługa błędów.