Se hai eseguito l'upgrade a Firebase Authentication with Identity Platform, puoi aggiungere l'autenticazione a più fattori (MFA) con password monouso a tempo (TOTP) alla tua app.
Firebase Authentication with Identity Platform ti consente di utilizzare una TOTP come fattore aggiuntivo per l'MFA. Quando attivi questa funzionalità, gli utenti che tentano di accedere alla tua app visualizzano una richiesta di TOTP. Per generarlo, devono utilizzare un'app di autenticazione in grado di generare codici TOTP validi, come Google Authenticator.
Prima di iniziare
Attiva almeno un provider che supporti l'MFA. Tieni presente che tutti i provider, ad eccezione dei seguenti, supportano l'MFA:
- Autenticazione tramite telefono
- Autenticazione anonima
- Token di autenticazione personalizzati
- Apple Game Center
Assicurati che la tua app verifichi gli indirizzi email degli utenti. La MFA richiede la verifica email. In questo modo, i malintenzionati non possono registrarsi a un servizio con un indirizzo email che non possiedono e bloccare l'accesso al proprietario effettivo dell'indirizzo email aggiungendo un secondo fattore.
Se non l'hai ancora fatto, installa l'SDK Firebase per Android.
La MFA TOTP è supportata solo su SDK Android versione v22.1.0 e successive.
Abilita l'MFA TOTP
Per abilitare TOTP come secondo fattore, utilizza Admin SDK o chiama l'endpoint REST di configurazione del progetto.
Per utilizzare Admin SDK, segui questi passaggi:
Se non l'hai già fatto, installa l'SDK Firebase Admin Node.js.
L'MFA TOTP è supportata solo nelle versioni 11.6.0 e successive dell'SDK Firebase Admin Node.js.
Esegui questo comando:
import { getAuth } from 'firebase-admin/auth'; getAuth().projectConfigManager().updateProjectConfig( { multiFactorConfig: { providerConfigs: [{ state: "ENABLED", totpProviderConfig: { adjacentIntervals: NUM_ADJ_INTERVALS } }] } })Sostituisci quanto segue:
NUM_ADJ_INTERVALS: il numero di intervalli di finestre temporali adiacenti da cui accettare i TOTP, da zero a dieci. Il valore predefinito è 5.Le TOTP funzionano garantendo che quando due parti (il prover e il validator) generano OTP entro lo stesso intervallo di tempo (in genere 30 secondi), generano la stessa password. Tuttavia, per tenere conto della deviazione dell'orologio tra le parti e del tempo di risposta umano, puoi configurare il servizio TOTP in modo che accetti anche i TOTP delle finestre adiacenti.
Per abilitare l'MFA TOTP utilizzando l'API REST, esegui questo comando:
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
}
}]
}
}'
Sostituisci quanto segue:
PROJECT_ID: l'ID progetto.NUM_ADJ_INTERVALS: il numero di intervalli della finestra temporale, da zero a dieci. Il valore predefinito è 5.Le TOTP funzionano garantendo che quando due parti (il prover e il validator) generano OTP entro lo stesso intervallo di tempo (in genere 30 secondi), generano la stessa password. Tuttavia, per tenere conto della deviazione dell'orologio tra le parti e del tempo di risposta umano, puoi configurare il servizio TOTP in modo che accetti anche i TOTP delle finestre adiacenti.
Scegli un pattern di registrazione
Puoi scegliere se la tua app richiede l'autenticazione a più fattori e come e quando registrare gli utenti. Ecco alcuni pattern comuni:
Registra il secondo fattore dell'utente durante la registrazione. Utilizza questo metodo se la tua app richiede l'autenticazione a più fattori per tutti gli utenti.
Offri un'opzione ignorabile per registrare un secondo fattore durante la registrazione. Se vuoi incoraggiare, ma non richiedere, l'autenticazione a più fattori nella tua app, puoi utilizzare questo approccio.
Offri la possibilità di aggiungere un secondo fattore dalla pagina di gestione dell'account o del profilo dell'utente, anziché dalla schermata di registrazione. In questo modo, l'attrito durante il processo di registrazione viene ridotto al minimo, pur rendendo disponibile l'autenticazione a più fattori per gli utenti sensibili alla sicurezza.
Richiedi l'aggiunta di un secondo fattore in modo incrementale quando l'utente vuole accedere a funzionalità con requisiti di sicurezza più elevati.
Registra gli utenti alla MFA TOTP
Dopo aver attivato l'MFA TOTP come secondo fattore per la tua app, implementa la logica lato client per registrare gli utenti nell'MFA TOTP:
Esegui nuovamente l'autenticazione dell'utente.
Genera un secret TOTP per l'utente autenticato:
// 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.) } }Mostra il secret all'utente e chiedigli di inserirlo nella sua app di autenticazione:
// Display this key: val secret = totpSecret.sharedSecretKeyOltre a visualizzare la chiave segreta, puoi provare ad aggiungerla automaticamente all'app di autenticazione predefinita del dispositivo. Per farlo, genera un URI della chiave compatibile con Google Authenticator e passalo a
openInOtpApp():val qrCodeUri = totpSecret.generateQrCodeUrl( currentUser.email ?: "default account", "Your App Name") totpSecret.openInOtpApp(qrCodeUri)Dopo che l'utente ha aggiunto il proprio secret all'app di autenticazione, quest'ultima inizierà a generare TOTP.
Chiedi all'utente di digitare la TOTP visualizzata dall'app di autenticazione e utilizzala per completare la registrazione 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. }
Consenti agli utenti di accedere con un secondo fattore
Per consentire agli utenti di accedere con l'MFA TOTP, utilizza il seguente codice:
Chiama uno dei metodi
signInWith- come faresti se non utilizzassi l'MFA. (Ad esempio,signInWithEmailAndPassword()). Se il metodo genera un'eccezioneFirebaseAuthMultiFactorException, avvia il flusso MFA della tua app.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.) // ... } } }Il flusso MFA della tua app deve prima chiedere all'utente di scegliere il secondo fattore che vuole utilizzare. Puoi ottenere un elenco dei secondi fattori supportati esaminando la proprietà
hintsdi un'istanzaMultiFactorResolver:val enrolledFactors = exception.resolver.hints.map { it.displayName }Se l'utente sceglie di utilizzare la TOTP, chiedigli di digitare la TOTP visualizzata nella sua app di autenticazione e di utilizzarla per accedere:
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. } }
Annulla la registrazione all'MFA TOTP
Questa sezione descrive come gestire l'annullamento della registrazione di un utente da MFA TOTP.
Se un utente ha eseguito la registrazione a più opzioni MFA e annulla la registrazione
all'opzione attivata più di recente, riceve un auth/user-token-expired
e viene disconnesso. L'utente deve accedere di nuovo e verificare le proprie credenziali esistenti, ad esempio un indirizzo email e una password.
Per annullare la registrazione dell'utente, gestire l'errore e attivare la nuova autenticazione, utilizza il seguente codice:
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.
}
}
}
}
Passaggi successivi
- Gestisci gli utenti con autenticazione a più fattori in modo programmatico con Admin SDK.