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.
- Po otwarciu projektu aplikacji wybierz w Xcode kolejno File (Plik) > Add Packages (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 Zabezpieczenia > Uwierzytelnianie.
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.
W tej samej sekcji włącz dostawcę Link w e-mailu (logowanie bez hasła).
Kliknij Zapisz.
Wysyłanie linku uwierzytelniającego na adres e-mail użytkownika
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.
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ę Zabezpieczenia > Uwierzytelnianie > Ustawienia.
W sekcji Autoryzowane domeny kliknij Dodaj domenę i dodaj swoją domenę.
iOSBundleIDiandroidPackageName: 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. ).HostingPROJECT_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 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.
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:
.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) 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.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) { // ... }]; }
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.
Łą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ż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.
Wycofane: weryfikacja na podstawie Firebase Dynamic Links
Jeśli Twoja aplikacja używa linków w starym stylu, musisz przeprowadzić migrację do nowego Firebase Hosting systemu.
Wycofane: odróżnianie e-maila i hasła od 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 ma 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.