Możesz użyć uwierzytelniania Firebase, aby zalogować się do użytkownika, wysyłając mu wiadomość e-mail z linkiem, który może kliknąć, aby się zalogować. W tym procesie weryfikowany jest również adres e-mail użytkownika.
Logowanie przez e-mail ma wiele zalet:
- Rejestracja i logowanie o niskim współczynniku tarcia.
- Niższe ryzyko ponownego użycia haseł w różnych aplikacjach, co może podważyć bezpieczeństwo nawet dobrze wybranych haseł.
- Możliwość uwierzytelniania użytkownika przy jednoczesnym weryfikowaniu, czy jest on prawowitym właścicielem adresu e-mail.
- Aby się zalogować, użytkownik potrzebuje tylko dostępnego konta e-mail. Nie jest wymagane posiadanie numeru telefonu ani konta w mediach społecznościowych.
- Użytkownik może się bezpiecznie zalogować bez konieczności podawania (lub zapamiętywania) hasła, które może być uciążliwe na urządzeniu mobilnym.
- Istniejący użytkownik, który wcześniej zalogował się przy użyciu identyfikatora e-mail (hasło lub federacja), może zostać uaktualniony tak, aby logował się tylko 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 Wprowadzenie.
Włącz logowanie przez Email Link w swoim 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ą łącza e-mail dla swojego projektu Firebase:
- W konsoli Firebase otwórz sekcję Auth .
- Na karcie Metoda logowania włącz dostawcę poczty e-mail/hasła . Pamiętaj, że logowanie za pomocą poczty e-mail/hasła musi być włączone, aby można było korzystać z logowania za pomocą łącza e-mail.
- W tej samej sekcji włącz metodę logowania przez łącze 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 prosi użytkownika o podanie adresu e-mail, a następnie wywołaj sendSignInLinkToEmail()
, aby zażądać od Firebase wysłania linku uwierzytelniającego na adres e-mail użytkownika.
Skonstruuj obiekt ActionCodeSettings, który udostępnia Firebase instrukcje dotyczące tworzenia łącza w wiadomości e-mail. Ustaw następujące pola:
url
: precyzyjny link do umieszczenia i wszelkie dodatkowe stany do przekazania. Domena linku musi znajdować się na białej liście domen autoryzowanych w konsoli Firebase, którą można znaleźć przechodząc do zakładki Metoda logowania (Uwierzytelnianie -> Metoda logowania). Link przekieruje użytkownika do tego adresu URL, jeśli aplikacja nie jest zainstalowana na jego urządzeniu i nie można jej zainstalować.androidPackageName
iIOSBundleId
: aplikacje używane po otwarciu linku logowania na urządzeniu z systemem Android lub iOS. Dowiedz się więcej o konfigurowaniu Linków dynamicznych Firebase, aby otwierać linki akcji w wiadomościach e-mail w aplikacjach mobilnych.handleCodeInApp
: Ustaw natrue
. Operacja logowania musi być zawsze zakończona w aplikacji, w przeciwieństwie do innych działań e-mail poza pasmem (resetowanie hasła i weryfikacja adresu e-mail). Dzieje się tak, ponieważ na końcu przepływu oczekuje się, że użytkownik zostanie zalogowany, a jego stan uwierzytelniania zostanie zachowany w aplikacji.dynamicLinkDomain
: jeśli dla projektu zdefiniowano wiele niestandardowych domen linków dynamicznych, określ, której należy użyć, gdy link ma zostać otwarty za pośrednictwem określonej aplikacji mobilnej (na przykładexample.page.link
). W przeciwnym razie pierwsza domena jest wybierana automatycznie.
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 łącze uwierzytelniające na adres e-mail użytkownika i zapisz adres e-mail użytkownika na wypadek, gdyby użytkownik zakończył logowanie do poczty e-mail 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 uniemożliwić użycie linku do logowania do zalogowania 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 wysłano łącze logowania.
Możesz usprawnić ten przepływ dla użytkowników, którzy otwierają łącze logowania na tym samym urządzeniu, na którym żądają łącza, przechowując ich adres e-mail lokalnie — na przykład przy użyciu 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ć wstrzykiwanie sesji.
Po zakończeniu logowania wszelkie poprzednie 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 z tym samym adresem e-mail i hasłem, hasło użytkownika zostanie usunięte, aby zapobiec ponownemu zalogowaniu się osoby podszywającej się pod własność i utworzyła to niezweryfikowane konto za pomocą niezweryfikowanego adresu e-mail i hasła.
Upewnij się również, że używasz produkcyjnego adresu URL HTTPS, aby uniknąć potencjalnego przechwycenia linku przez serwery pośredniczące.
Zweryfikuj link e-mail i zaloguj się
Uwierzytelnianie Firebase używa dynamicznych linków Firebase do wysyłania linku w e-mailu na urządzenie mobilne. Aby ukończyć logowanie za pośrednictwem aplikacji mobilnej, aplikacja musi być skonfigurowana do wykrywania przychodzącego łącza do aplikacji, analizowania podstawowego łącza precyzyjnego, a następnie dokończenia logowania.
Skonfiguruj swoją aplikację, aby otrzymywać dynamiczne linki na Flutter w przewodniku .
W programie obsługi linków sprawdź, czy link jest przeznaczony do uwierzytelniania linków w wiadomości e-mail, a jeśli tak, zakoń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 również połączyć tę metodę uwierzytelniania z istniejącym użytkownikiem. Na przykład użytkownik wcześniej uwierzytelniony u innego dostawcy, taki jak numer telefonu, może dodać tę metodę logowania do swojego istniejącego konta.
Różnica byłaby 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 to również wykorzystać do ponownego uwierzytelnienia użytkownika łącza e-mail przed uruchomieniem poufnej operacji.
final authCredential = EmailAuthProvider
.credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
await FirebaseAuth.instance.currentUser
?.reauthenticateWithCredential(authCredential);
} catch (error) {
print("Error reauthenticating credential.");
}
Jednak ponieważ 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, aby zmusić go do otwarcia łącza na tym samym urządzeniu. W łączu można przekazać pewien stan, aby dostarczyć informacji o typie operacji i identyfikatorze użytkownika.
Odróżnianie adresu e-mail/hasła od łącza e-mail
Jeśli obsługujesz logowanie za pomocą hasła i linku za pomocą poczty e-mail, aby odróżnić metodę logowania dla użytkownika hasła/linku, użyj fetchSignInMethodsForEmail
. Jest to przydatne w przypadku przepływów polegających na pierwszym identyfikatorze, w których użytkownik jest najpierw proszony o podanie swojego adresu e-mail, a następnie przedstawiany jest sposób logowania:
try {
final signInMethods =
await FirebaseAuth.instance.fetchSignInMethodsForEmail(emailAuth);
final userExists = signInMethods.isNotEmpty;
final canSignInWithLink = signInMethods
.contains(EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD);
final canSignInWithPassword = signInMethods
.contains(EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD);
} on FirebaseAuthException catch (exception) {
switch (exception.code) {
case "invalid-email":
print("Not a valid email address.");
break;
default:
print("Unknown error.");
}
}
Jak opisano powyżej, adres e-mail/hasło i adres e-mail/link są uważane za ten sam EmailAuthProvider
e-mail (ten sam PROVIDER_ID
) z różnymi metodami logowania.
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 użytej metody logowania.
W swoich 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 czasu rzeczywistego i usługi Cloud Storage Firebase możesz uzyskać unikalny identyfikator zalogowanego użytkownika ze zmiennej auth
i używać go do kontrolowania, do jakich danych użytkownik może uzyskać dostęp.
Możesz zezwolić użytkownikom na logowanie się do Twojej aplikacji przy użyciu wielu dostawców uwierzytelniania, łącząc poświadczenia dostawcy uwierzytelniania ) z istniejącym kontem użytkownika.
Aby wylogować użytkownika, wywołaj signOut()
:
await FirebaseAuth.instance.signOut();