Uwierzytelnianie Firebase umożliwia logowanie użytkownika przez wysłanie mu e-maila z linkiem, który może kliknąć, aby się zalogować. W trakcie tego procesu weryfikowany jest też adres e-mail użytkownika.
Logowanie za pomocą adresu e-mail ma wiele zalet:
- Ł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 wcześniej logował się za pomocą identyfikatora e-mail (hasła lub federacji), może zostać uaktualniony do logowania 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
Jeśli jeszcze tego nie zrobisz, wykonaj czynności opisane w przewodniku Pierwsze kroki.
Włącz logowanie za pomocą linku w e-mailu w projekcie 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 Firebase:
W konsoli Firebase otwórz Zabezpieczenia > Uwierzytelnianie.
Na karcie Metoda logowania włącz dostawcę logowania Adres 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 uwierzytelniającego na adres e-mail użytkownika
Aby rozpocząć proces uwierzytelniania, wyświetl interfejs, który prosi użytkownika o podanie adresu e-mail, a następnie wywołaj funkcję sendSignInLinkToEmail(), 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 domenę linku do listy autoryzowanych domen:W konsoli Firebase otwórz kartę Uwierzytelnianie > Ustawienia.
W sekcji Autoryzowane domeny kliknij Dodaj domenę i dodaj domenę linku.
Jeśli aplikacja nie jest zainstalowana na urządzeniu użytkownika i nie można jej zainstalować, link przekieruje użytkownika na ten adres URL.
androidPackageNameiIOSBundleId: aplikacje, które mają być używane, gdy link logowania zostanie otwarty na urządzeniu z Androidem lub iOS. Więcej informacji o konfigurowaniu Linków dynamicznych Firebase, aby otwierać linki do działań w e-mailach za pomocą aplikacji mobilnychhandleCodeInApp: ustaw wartośćtrue. W przeciwieństwie do innych działań w e-mailach (resetowanie hasła i 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 jego stan uwierzytelnienia powinien być zachowany w aplikacji.dynamicLinkDomain: (wycofane, użyjlinkDomain) jeśli w projekcie zdefiniowano wiele niestandardowych domen Linków dynamicznych, określ, której z nich należy użyć, gdy link ma zostać otwarty za pomocą określonej aplikacji mobilnej (np.example.page.link). W przeciwnym razie automatycznie zostanie wybrana pierwsza domena.linkDomain: opcjonalna niestandardowa domena Hostingu Firebase, która ma być używana, gdy link ma zostać otwarty za pomocą określonej aplikacji mobilnej. Domena musi być skonfigurowana w Hostingu Firebase i należeć do projektu. Nie może to być domyślna domena Hostingu (web.appanifirebaseapp.com). Zastępuje ona wycofane ustawieniedynamicLinkDomain.
var acs = ActionCodeSettings( // URL you want to redirect back to. The domain (www.example.com) for this // URL must be whitelisted in the Firebase Console. url: 'https://www.example.com/finishSignUp?cartId=1234', // This must be true handleCodeInApp: true, iOSBundleId: 'com.example.ios', androidPackageName: 'com.example.android', // installIfNotAvailable androidInstallApp: true, // minimumVersion androidMinimumVersion: '12');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.
var emailAuth = 'someemail@domain.com'; FirebaseAuth.instance.sendSignInLinkToEmail( email: emailAuth, actionCodeSettings: acs) .catchError((onError) => print('Error sending email verification $onError')) .then((value) => print('Successfully sent email verification')); });
Dokończenie logowania za pomocą linku w e-mailu
Potencjalne problemy z bezpieczeństwem
Aby zapobiec użyciu linku logowania do zalogowania się jako niepożądany użytkownik lub na niepożądanym urządzeniu, 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 logowania.
Możesz uprościć ten proces dla użytkowników, którzy otwierają link logowania na tym samym urządzeniu, na którym go zażądali, zapisując ich adres e-mail lokalnie – na przykład za pomocą SharedPreferences – podczas wysyłania e-maila z linkiem logowania. Następnie użyj tego adresu, aby dokończyć proces. Nie przekazuj adresu e-mail użytkownika w parametrach adresu URL przekierowania i nie używaj go ponownie, ponieważ może to umożliwić wstrzyknięcie sesji.
Po zakończeniu logowania wszystkie poprzednie niezweryfikowane metody logowania zostaną usunięte, a wszystkie istniejące sesje zostaną unieważnione. Jeśli na przykład 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ę za pomocą niezweryfikowanego adresu e-mail i hasła.
Upewnij się też, że w środowisku produkcyjnym używasz adresu URL HTTPS, aby uniknąć przechwycenia linku przez serwery pośredniczące.
Dokończenie logowania
Linki dynamiczne Firebase zostały wycofane. Do wysyłania linku logowania używany jest teraz Hosting Firebase. Postępuj zgodnie z instrukcjami dotyczącymi konfiguracji na poszczególnych platformach:
Weryfikowanie linku w e-mailu i logowanie
Aby dokończyć logowanie za pomocą aplikacji mobilnej, aplikacja musi być skonfigurowana tak, aby wykrywała przychodzący link aplikacji, analizowała precyzyjny link i dokończyła logowanie.
W obsłudze linków sprawdź, czy link jest przeznaczony do uwierzytelniania za pomocą linku w e-mailu, a jeśli tak, dokończ proces logowania.
// Confirm the link is a sign-in with email link. if (FirebaseAuth.instance.isSignInWithEmailLink(emailLink)) { try { // The client SDK will parse the code from the link for you. final userCredential = await FirebaseAuth.instance .signInWithEmailLink(email: emailAuth, emailLink: emailLink); // You can access the new user via userCredential.user. final emailAddress = userCredential.user?.email; print('Successfully signed in with email link!'); } catch (error) { print('Error signing in with email link.'); } }
Łą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:
final authCredential = EmailAuthProvider
.credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
await FirebaseAuth.instance.currentUser
?.linkWithCredential(authCredential);
} catch (error) {
print("Error linking emailLink credential.");
}
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.
final authCredential = EmailAuthProvider
.credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
await FirebaseAuth.instance.currentUser
?.reauthenticateWithCredential(authCredential);
} catch (error) {
print("Error reauthenticating credential.");
}
Jednak ponieważ proces może zakończyć się 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: odróżnianie adresu e-mail 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 dokumentacji dotyczącej ochrony przed wyliczaniem adresów e-mail.
Dalsze kroki
Gdy użytkownik utworzy nowe konto, zostanie ono zapisane w projekcie Firebase i będzie można go używać do identyfikowania użytkownika w każdej aplikacji w projekcie, niezależnie od metody logowania.
W aplikacjach możesz uzyskać podstawowe informacje o profilu użytkownika z obiektu User. Więcej informacji znajdziesz w artykule Zarządzanie użytkownikami.
W regułach bezpieczeństwa Bazy danych w czasie rzeczywistym Firebase i Cloud Storage możesz uzyskać unikalny identyfikator użytkownika zalogowanego za pomocą 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 łączenie danych logowania dostawcy uwierzytelniania) z istniejącym kontem użytkownika.
Aby wylogować użytkownika, wywołaj funkcję signOut():
await FirebaseAuth.instance.signOut();