Możesz użyć uwierzytelniania Firebase, aby zalogować użytkownika, wysyłając mu wiadomość e-mail zawierającą link, który może kliknąć, aby się zalogować. Podczas tego procesu weryfikowany jest również adres e-mail użytkownika.
Logowanie się przez e-mail ma wiele zalet:
- Rejestracja i logowanie o niskim współczynniku tarcia.
- Mniejsze ryzyko ponownego użycia hasła w różnych aplikacjach, co może podważyć bezpieczeństwo nawet dobrze wybranych haseł.
- Możliwość uwierzytelnienia użytkownika przy jednoczesnej weryfikacji, czy użytkownik jest prawowitym właścicielem adresu e-mail.
- Aby się zalogować, użytkownik potrzebuje jedynie dostępnego konta e-mail. Nie jest wymagane posiadanie numeru telefonu ani konta w mediach społecznościowych.
- Użytkownik może zalogować się bezpiecznie, bez konieczności podawania (lub zapamiętywania) hasła, co na urządzeniu mobilnym może być uciążliwe.
- Istniejącego użytkownika, który wcześniej logował się przy użyciu identyfikatora e-mail (hasła lub konta federacyjnego), można uaktualnić tak, aby logował się wyłącznie przy użyciu adresu e-mail. Na przykład użytkownik, który zapomniał hasła, nadal może się zalogować bez konieczności resetowania hasła.
Zanim zaczniesz
Jeśli jeszcze tego nie zrobiłeś, wykonaj czynności opisane w przewodniku wprowadzającym .
Włącz logowanie za pomocą łącza e-mail dla swojego projektu Firebase.
Aby logować użytkowników za pomocą łącza e-mail, musisz najpierw włączyć dostawcę poczty e-mail i metodę logowania za pomocą łącza e-mail dla swojego projektu Firebase:
- W konsoli Firebase otwórz sekcję Uwierzytelnianie .
- Na karcie Metoda logowania włącz dostawcę adresu e-mail/hasła . Pamiętaj, że aby móc logować się za pomocą łącza e-mail, musi być włączone logowanie za pomocą adresu e-mail/hasła.
- W tej samej sekcji włącz metodę logowania za pomocą łącza e-mail (logowanie bez hasła) .
- Kliknij Zapisz .
Wyślij link uwierzytelniający na adres e-mail użytkownika
Aby zainicjować proces uwierzytelniania, zaprezentuj interfejs, który poprosi użytkownika o podanie adresu e-mail, a następnie wywołaj metodę sendSignInLinkToEmail()
, aby zażądać, aby Firebase wysłała link uwierzytelniający na adres e-mail użytkownika.
Skonstruuj obiekt ActionCodeSettings, który udostępnia Firebase instrukcje dotyczące tworzenia łącza e-mail. Ustaw następujące pola:
url
: precyzyjny link do umieszczenia i wszelki dodatkowy stan, który należy przekazać. Domena linku musi znajdować się na białej liście w konsoli Firebase Console, na liście autoryzowanych domen, którą można znaleźć przechodząc do zakładki Metoda logowania (Uwierzytelnianie -> Metoda logowania). Link przekieruje użytkownika na ten adres URL, jeśli aplikacja nie jest zainstalowana na jego urządzeniu i nie można było jej zainstalować.androidPackageName
iIOSBundleId
: aplikacje, które mają być używane po otwarciu łącza logowania na urządzeniu z systemem Android lub iOS. Dowiedz się więcej o konfigurowaniu łączy dynamicznych Firebase w celu otwierania linków do działań w wiadomościach e-mail za pośrednictwem aplikacji mobilnych.handleCodeInApp
: Ustaw natrue
. Operację logowania należy zawsze przeprowadzić w aplikacji, w przeciwieństwie do innych pozapasmowych działań e-mailowych (reset hasła i weryfikacja adresu e-mail). Dzieje się tak, ponieważ na końcu przepływu oczekuje się, że użytkownik będzie zalogowany, a jego stan uwierzytelnienia zostanie utrwalony w aplikacji.dynamicLinkDomain
: Jeśli dla projektu zdefiniowano wiele niestandardowych domen łączy dynamicznych, określ, która z nich ma być używana, gdy łącze ma być otwierane za pośrednictwem określonej aplikacji mobilnej (na przykładexample.page.link
). W przeciwnym wypadku automatycznie wybierana jest pierwsza domena.
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 adres e-mail.
Wyślij link uwierzytelniający na adres e-mail użytkownika i zapisz adres e-mail użytkownika na wypadek, gdyby użytkownik ukończył logowanie e-mailem 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ńcz logowanie za pomocą łącza e-mail
Obawy dotyczące bezpieczeństwa
Aby zapobiec używaniu linku do logowania do logowania się jako niezamierzony użytkownik lub na niezamierzonym urządzeniu, Firebase Auth wymaga podania adresu e-mail użytkownika podczas koń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 usprawnić ten przepływ dla użytkowników, którzy otwierają link do logowania na tym samym urządzeniu, na którym proszą o łącze, przechowując lokalnie ich adresy e-mail — na przykład za pomocą SharedPreferences — podczas wysyłania wiadomości e-mail logowania. Następnie użyj tego adresu, aby zakończyć przepływ. Nie podawaj adresu e-mail użytkownika w parametrach adresu URL przekierowania i używaj go ponownie, ponieważ może to umożliwić zastrzyki sesji.
Po zakończeniu logowania wszelkie dotychczasowe niezweryfikowane mechanizmy logowania zostaną usunięte z użytkownika, a wszelkie istniejące sesje zostaną unieważnione. Na przykład, jeśli ktoś wcześniej utworzył niezweryfikowane konto przy użyciu tego samego adresu e-mail i hasła, hasło użytkownika zostanie usunięte, aby uniemożliwić osobie podszywającej się, która rościła sobie prawo własności i utworzyła to niezweryfikowane konto, ponowne zalogowanie się przy użyciu niezweryfikowanego adresu e-mail i hasła.
Upewnij się także, że używasz adresu URL HTTPS w środowisku produkcyjnym, aby uniknąć potencjalnego przechwycenia łącza przez serwery pośredniczące.
Sprawdź łącze e-mail i zaloguj się
Uwierzytelnianie Firebase wykorzystuje łącza dynamiczne Firebase do wysyłania linku e-mail na urządzenie mobilne. Aby móc logować się za pomocą aplikacji mobilnej, należy ją skonfigurować tak, aby wykrywała przychodzące łącze do aplikacji, analizowała głęboki link, a następnie dokończyła logowanie.
Skonfiguruj swoją aplikację, aby otrzymywać linki dynamiczne w Flutter w przewodniku .
W module obsługi linków sprawdź, czy link służy do uwierzytelniania łącza e-mail, 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ą łącza e-mail
Możesz także powiązać tę metodę uwierzytelniania z istniejącym użytkownikiem. Na przykład użytkownik uwierzytelniony wcześniej u innego dostawcy, na przykład za pomocą numeru telefonu, może dodać tę metodę logowania do swojego istniejącego konta.
Różnica będzie dotyczyć drugiej połowy 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 to również wykorzystać do ponownego uwierzytelnienia użytkownika łącza e-mail przed wykonaniem poufnej operacji.
final authCredential = EmailAuthProvider
.credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
await FirebaseAuth.instance.currentUser
?.reauthenticateWithCredential(authCredential);
} catch (error) {
print("Error reauthenticating credential.");
}
Ponieważ jednak przepływ może zakończyć się na innym urządzeniu, na którym pierwotny użytkownik nie był zalogowany, przepływ ten może nie zostać ukończony. W takim przypadku użytkownikowi może zostać wyświetlony błąd mający na celu wymuszenie otwarcia łącza na tym samym urządzeniu. W łączu można przekazać pewien stan, aby dostarczyć informacji o typie operacji i identyfikatorze użytkownika.
Przestarzałe: rozróżnienie hasła e-mail od łącza e-mail
Jeśli projekt utworzyłeś 15 września 2023 r. lub później, ochrona wyliczeń 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órą wcześniej zalecaliśmy w celu implementacji przepływów opartych na identyfikatorze.
Chociaż możesz wyłączyć ochronę wyliczania adresów e-mail w swoim projekcie, odradzamy robienie tego.
Więcej szczegółów można znaleźć w dokumentacji dotyczącej ochrony wyliczeń adresów e-mail .
Następne kroki
Gdy użytkownik utworzy nowe konto, jest ono przechowywane jako część projektu Firebase i może służyć do identyfikowania użytkownika w każdej aplikacji w projekcie, niezależnie od metody logowania, której użył użytkownik.
W Twoich aplikacjach możesz uzyskać podstawowe informacje o profilu użytkownika z obiektu User
. Zobacz Zarządzanie użytkownikami .
W regułach bezpieczeństwa bazy danych Firebase Realtime i Cloud Storage możesz uzyskać unikalny identyfikator zalogowanego użytkownika ze zmiennej auth
i użyć go do kontrolowania, do jakich danych użytkownik może uzyskać dostęp.
Możesz zezwolić użytkownikom na logowanie się do aplikacji przy użyciu wielu dostawców uwierzytelniania, łącząc dane uwierzytelniające dostawcy uwierzytelniania ) z istniejącym kontem użytkownika.
Aby wylogować użytkownika, wywołaj funkcję signOut()
:
await FirebaseAuth.instance.signOut();