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 być właścicielem 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 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.
- Po otwarciu projektu aplikacji wybierz w Xcode opcję File > Add Packages (Plik > Dodaj pakiety).
- Gdy pojawi się prośba, dodaj repozytorium pakietu SDK Firebase na platformy Apple:
- Wybierz bibliotekę Firebase Authentication.
- Dodaj flagę
-ObjCdo sekcji Other Linker Flags (Inne flagi linkera) w ustawieniach kompilacji docelowej. - Gdy skończysz, Xcode zacznie automatycznie wyszukiwać i pobierać Twoje zależności w tle.
https://github.com/firebase/firebase-ios-sdk.git
Włączanie logowania za pomocą linku w e-mailu w projekcie w Firebase
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:
W konsoli Firebase otwórz Security > Authentication.
Na karcie Sign-in method (Metoda logowania) włącz dostawcę logowania Email/Password (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.
W tej samej sekcji włącz dostawcę Email link (passwordless sign-in) (Link w e-mailu – logowanie bez hasła).
Kliknij Save (Zapisz).
Wysyłanie linku uwierzytelniającego na adres e-mail użytkownika
Aby rozpocząć proces uwierzytelniania, wyświetl użytkownikowi interfejs, który poprosi go o podanie adresu e-mail, a następnie wywołaj funkcję sendSignInLink, aby poprosić Firebase o wysłanie linku uwierzytelniającego na adres e-mail użytkownika.
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:W konsoli Firebase otwórz kartę Security (Zabezpieczenia) > Authentication (Uwierzytelnianie) > Settings (Ustawienia).
W sekcji Authorized domains (Autoryzowane domeny) kliknij Add domain (Dodaj domenę) i dodaj swoją domenę.
iOSBundleIDiandroidPackageName: pomagają usłudze Firebase Authentication określić czy należy 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ń związanych z e-mailami (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 w projekcie zdefiniowano niestandardowe domeny linków Hosting, 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.comdynamicLinkDomain: 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
ActionCodeSettingsznajdziesz w sekcji Przekazywanie stanu w działaniach związanych z e-mailami.Poproś użytkownika o podanie adresu e-mail.
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"]; // ... }];
Dokończenie logowania za pomocą linku w e-mailu
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 dokończenia procesu 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 dotychczasowe sesje zostaną unieważnione. Jeśli na przykład ktoś utworzył wcześniej 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 dokumentacji dotyczącej linków uniwersalnych i powiązanych domen na iOS.
Konfigurowanie 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.
Skonfiguruj Firebase Hosting domeny:
W konsoli Firebase otwórz Hosting & Serverless > 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:
.HostingPROJECT_ID.firebaseapp.comTa 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.
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) docelowej aplikacji i dodaj domeny hostingu Firebase z poprzedniego kroku do możliwości Associated Domains (Powiązane domeny). Jeśli używasz domyślnej Firebase Hosting domeny, będzie to
.applinks:PROJECT_ID.firebaseapp.comWięcej informacji znajdziesz w dokumentacji Apple na stronie Supporting associated domains (Obsługa powiązanych domen).
Weryfikowanie linku i logowanie się
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) { // ... }]; }
Aby dowiedzieć się, jak obsługiwać logowanie za pomocą linku w e-mailu w aplikacji na Androida , zapoznaj się z przewodnikiem na Androida.
Aby dowiedzieć się, jak obsługiwać logowanie za pomocą linku w e-mailu w aplikacji internetowej , zapoznaj się z przewodnikiem dotyczącym internetu.
Łączenie/ponowne uwierzytelnianie za pomocą linku w e-mailu
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żna jej też użyć do ponownego uwierzytelnienia użytkownika za pomocą linku w e-mailu przed wykonaniem operacji wymagającej zachowania poufnoś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 ponieważ proces może się zakończyć na innym urządzeniu, na którym pierwotny użytkownik nie był zalogowany, ten proces może się nie powieść. W takim przypadku użytkownikowi można wyświetlić błąd, aby wymusić otwarcie linku na tym samym urządzeniu. W linku można przekazać pewien stan, aby podać informacje o typie operacji i identyfikatorze UID użytkownika.
Wycofane: weryfikacja na podstawie Firebase Dynamic Links
Jeśli Twoja aplikacja używa linków w starym stylu, musisz przeprowadzić migrację do nowego systemu opartego na Firebase Hosting.
Wycofane: odróżnianie logowania za pomocą e-maila i hasła od logowania za pomocą linku w e-mailu
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.
-
W aplikacjach możesz uzyskać podstawowe informacje o profilu użytkownika z obiektu
User. Zobacz Zarządzanie użytkownikami. W regułach bezpieczeństwa Firebase Realtime Database i Cloud Storage bazy danych czasu rzeczywistego Firebase i Cloud Storage, możesz uzyskać unikalny identyfikator zalogowanego użytkownika z zmiennej
auth, i użyć go do kontrolowania, do jakich danych użytkownik może mieć dostęp.
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.