Jeśli korzystasz z wersji Firebase Authentication with Identity Platform, możesz dodać do aplikacji uwierzytelnianie wielopoziomowe (MFA) z hasłem jednorazowym generowanym na podstawie czasu (TOTP).
Firebase Authentication with Identity Platform umożliwia korzystanie z TOTP jako dodatkowego czynnika uwierzytelniania wieloskładnikowego. Gdy włączysz tę funkcję, użytkownicy, którzy spróbują zalogować się w aplikacji, zobaczą prośbę o wygenerowanie kodu TOTP. Aby go wygenerować, muszą użyć aplikacji uwierzytelniającej, która może generować prawidłowe kody TOTP, takiej jak Google Authenticator.
Zanim zaczniesz
Włącz co najmniej 1 dostawcę, który obsługuje uwierzytelnianie wieloskładnikowe. Pamiętaj, że wszyscy dostawcy z wyjątkiem tych obsługują uwierzytelnianie wieloskładnikowe:
- uwierzytelnianie przez telefon,
- Anonimowe uwierzytelnianie
- Niestandardowe tokeny uwierzytelniania
- Apple Game Center
Upewnij się, że aplikacja weryfikuje adresy e-mail użytkowników. MFA wymaga weryfikacji adresu e-mail. Dzięki temu nieuczciwi użytkownicy nie będą mogli zarejestrować się w usłudze, podając adres e-mail, którego nie są właścicielami, a potem zablokować dostęp do tego adresu, dodając drugi czynnik.
Jeśli jeszcze tego nie zrobiono, zainstaluj pakiet SDK Firebase na Androida.
TOTP MFA jest obsługiwana tylko w pakiecie Android SDK w wersji 22.1.0 lub nowszej.
Włącz MFA TOTP
Aby włączyć TOTP jako drugi czynnik uwierzytelniania, użyj parametru Admin SDK lub wywołaj punkt końcowy REST konfiguracji projektu.
Aby korzystać z Admin SDK:
Jeśli jeszcze tego nie zrobiono, zainstaluj pakiet SDK Firebase Admin Node.js.
TOTP MFA jest obsługiwana tylko w pakiecie SDK Firebase Admin Node.js w wersji 11.6.0 lub nowszej.
Wykonaj zapytanie:
import { getAuth } from 'firebase-admin/auth'; getAuth().projectConfigManager().updateProjectConfig( { multiFactorConfig: { providerConfigs: [{ state: "ENABLED", totpProviderConfig: { adjacentIntervals: NUM_ADJ_INTERVALS } }] } })
Zastąp następujące elementy:
NUM_ADJ_INTERVALS
: liczba sąsiadujących przedziałów czasowych, z których mają być akceptowane tokeny TOTP, od 0 do 10. Wartość domyślna to 5.TOTP działają w taki sposób, że gdy obie strony (weryfikator i weryfikator) generują OTP w tym samym oknie czasowym (zwykle 30 sekund), generują ten sam hasło. Jednak ze względu na różnice w czasie między stronami i czasie reakcji człowieka możesz skonfigurować usługę TOTP tak, aby akceptowała również TOTP z sąsiednich okien.
Aby włączyć uwierzytelnianie wieloskładnikowe TOTP za pomocą interfejsu REST API, wykonaj te czynności:
curl -X PATCH "https://identitytoolkit.googleapis.com/admin/v2/projects/PROJECT_ID/config?updateMask=mfa" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-H "X-Goog-User-Project: PROJECT_ID" \
-d \
'{
"mfa": {
"providerConfigs": [{
"state": "ENABLED",
"totpProviderConfig": {
"adjacentIntervals": NUM_ADJ_INTERVALS
}
}]
}
}'
Zastąp następujące elementy:
PROJECT_ID
: identyfikator projektu.NUM_ADJ_INTERVALS
: liczba przedziałów czasowych, od 0 do 10. Wartość domyślna to 5.TOTP działają w taki sposób, że gdy obie strony (weryfikator i weryfikator) wygenerują OTP w tym samym oknie czasowym (zwykle 30 sekund), wygenerują ten sam hasło. Jednak ze względu na różnice w czasie między stronami i czasie reakcji człowieka możesz skonfigurować usługę TOTP tak, aby akceptowała ona również TOTP z sąsiednich okien.
Wybieranie schematu rejestracji
Możesz wybrać, czy Twoja aplikacja wymaga uwierzytelniania wielopoziomowego oraz jak i kiedy rejestrować użytkowników. Oto kilka typowych wzorców:
Zarejestruj drugi składnik uwierzytelniający użytkownika w ramach rejestracji. Użyj tej metody, jeśli aplikacja wymaga uwierzytelniania wielopoziomowego od wszystkich użytkowników.
Zaoferuj opcję pominięcia rejestracji drugiego czynnika podczas rejestracji. Jeśli chcesz zachęcać użytkowników do korzystania z uwierzytelniania wielopoziomowego, ale nie wymagać tego, możesz zastosować to rozwiązanie.
Dodanie możliwości dodawania drugiego czynnika na koncie użytkownika lub na stronie zarządzania profilem zamiast na ekranie rejestracji. Pozwala to zminimalizować trudności podczas procesu rejestracji, a jednocześnie udostępnia uwierzytelnianie wielopoziomowe użytkownikom, którzy przykładają dużą wagę do bezpieczeństwa.
Wymagaj stopniowego dodawania drugiego czynnika, gdy użytkownik chce uzyskać dostęp do funkcji o większych wymaganiach bezpieczeństwa.
Rejestrowanie użytkowników w usługach MFA TOTP
Po włączeniu uwierzytelniania wieloskładnikowego TOTP jako drugiego poziomu uwierzytelniania w aplikacji wprowadź logikę po stronie klienta, aby rejestrować użytkowników w ramach uwierzytelniania wieloskładnikowego TOTP:
Ponownie uwierzytelnij użytkownika.
Wygeneruj klucz TOTP dla uwierzytelnionego użytkownika:
// Generate a TOTP secret. Firebase.auth.currentUser.multiFactor.session .addOnSuccessListener { multiFactorSession -> TotpMultiFactorGenerator.generateSecret(multiFactorSession) .addOnSuccessListener { totpSecret -> // Display the secret to the user and prompt them to // enter it into their authenticator app. (See the next // step.) } }
Wyświetl tajny klucz użytkownikowi i poproś go o jego wpisanie w aplikacji uwierzytelniającej:
// Display this key: val secret = totpSecret.sharedSecretKey
Oprócz wyświetlania klucza tajnego możesz spróbować automatycznie dodać go do domyślnej aplikacji uwierzytelniającej na urządzeniu. Aby to zrobić, wygeneruj adres URI klucza zgodny z Google Authenticator i przekaż go do
openInOtpApp()
:val qrCodeUri = totpSecret.generateQrCodeUrl( currentUser.email ?: "default account", "Your App Name") totpSecret.openInOtpApp(qrCodeUri)
Gdy użytkownik doda klucz tajny do aplikacji uwierzytelniającej, aplikacja zacznie generować kody TOTP.
Poproś użytkownika o wpisanie TOTP wyświetlanego przez aplikację uwierzytelniającą i użyj go do sfinalizowania rejestracji MFA:
// Ask the user for a verification code from the authenticator app. val verificationCode = // Code from user input. // Finalize the enrollment. val multiFactorAssertion = TotpMultiFactorGenerator .getAssertionForEnrollment(totpSecret, verificationCode) Firebase.auth.currentUser.multiFactor.enroll(multiFactorAssertion, "TOTP") .addOnSuccessListener { // Enrollment complete. }
Logowanie użytkowników za pomocą drugiego składnika
Aby zalogować użytkowników przy użyciu uwierzytelniania wieloskładniowego TOTP, użyj tego kodu:
Zadzwoń do nas, korzystając z jednej z metod
signInWith
, tak jakbyś nie używał MFA. (np.signInWithEmailAndPassword()
). Jeśli metoda zwraca błądFirebaseAuthMultiFactorException
, uruchom proces uwierzytelniania dwuskładnikowego w aplikacji.Firebase.auth.signInWithEmailAndPassword(email, password) .addOnSuccessListener { result -> // If the user is not enrolled with a second factor and provided valid // credentials, sign-in succeeds. // (If your app requires MFA, this could be considered an error // condition, which you would resolve by forcing the user to enroll a // second factor.) // ... } .addOnFailureListener { exception -> when (exception) { is FirebaseAuthMultiFactorException -> { // Initiate your second factor sign-in flow. (See next step.) // ... } } }
W ramach procesu uwierzytelniania dwuskładnikowego aplikacja powinna najpierw poprosić użytkownika o wybranie drugiego czynnika. Listę obsługiwanych drugich czynników możesz uzyskać, sprawdzając właściwość
hints
instancjiMultiFactorResolver
:val enrolledFactors = exception.resolver.hints.map { it.displayName }
Jeśli użytkownik zdecyduje się użyć TOTP, poproś go o wpisanie TOTP wyświetlanego w aplikacji uwierzytelniającej i używanie go do logowania:
when (exception.resolver.hints[selectedIndex].factorId) { TotpMultiFactorGenerator.FACTOR_ID -> { val otpFromAuthenticator = // OTP typed by the user. val assertion = TotpMultiFactorGenerator.getAssertionForSignIn( exception.resolver.hints[selectedIndex].uid, otpFromAuthenticator ) exception.resolver.resolveSignIn(assertion) .addOnSuccessListener { result -> // Successfully signed in! } .addOnFailureListener { resolveError -> // Invalid or expired OTP. } } PhoneMultiFactorGenerator.FACTOR_ID -> { // Handle SMS second factor. } }
Wyrejestrowanie z wielostopniowej weryfikacji tożsamości z użyciem klucza bezpieczeństwa TOTP
W tej sekcji opisano, jak postępować w przypadku wyrejestrowania użytkownika z wielostopniowej weryfikacji tożsamości TOTP.
Jeśli użytkownik korzysta z kilku opcji uwierzytelniania wielopoziomowego i rezygnuje z najnowszej z nich, otrzyma auth/user-token-expired
i zostanie wylogowany. Użytkownik musi się ponownie zalogować i potwierdzić swoje dotychczasowe dane logowania, np. adres e-mail i hasło.
Aby anulować rejestrację użytkownika, obsłużyć błąd i wywołać ponowne uwierzytelnianie, użyj tego kodu:
Firebase.auth.currentUser.multiFactor.unenroll(mfaEnrollmentId)
.addOnSuccessListener {
// Second factor unenrolled.
}
.addOnFailureListener { exception ->
when (exception) {
is FirebaseAuthInvalidUserException -> {
// Second factor unenrolled. If the user was signed out, re-authenticate
// them.
// For example, if they signed in with a password, prompt them to
// provide it again, then call `reauthenticateWithCredential()` as shown
// below.
val credential = EmailAuthProvider.getCredential(email, password)
currentUser.reauthenticate(credential)
.addOnSuccessListener {
// Success!
}
.addOnFailureListener {
// Bad email address and password combination.
}
}
}
}
Co dalej?
- Zarządzaj użytkownikami korzystającymi z uwierzytelniania wieloskładnikowego za pomocą pakietu Admin SDK.