Se hai eseguito l'upgrade a Firebase Authentication with Identity Platform, puoi aggiungere all'app l'autenticazione a più fattori (MFA) con password temporanea e monouso (TOTP).
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, deve utilizzare un'app di autenticazione in grado di generare codici TOTP validi, come Google Authenticator.
Prima di iniziare
Attiva almeno un provider che supporta l'MFA. Tieni presente che tutti i fornitori tranne i seguenti supportano l'MFA:
- Autenticazione telefonica
- Autenticazione anonima
- Token di autenticazione personalizzati
- Apple Game Center
Assicurati che la tua app verifichi gli indirizzi email degli utenti. La verifica dell'identità tramite due fattori richiede la verifica email. In questo modo, gli utenti malintenzionati non possono registrarsi a un servizio con un indirizzo email che non possiedono e bloccare il proprietario effettivo dell'indirizzo email aggiungendo un secondo fattore.
Se non l'hai già fatto, installa l'SDK Firebase per Apple.
L'autenticazione a due fattori TOTP è supportata solo con la versione dell'SDK Apple 10.12.0 e successive e solo su iOS.
Attivare l'autenticazione a due fattori TOTP
Per attivare TOTP come secondo fattore, utilizza Admin SDK o chiama l'endpoint REST della configurazione del progetto.
Per utilizzare Admin SDK:
Se non lo hai già fatto, installa l'SDK Node.js di Firebase Admin.
L'autenticazione a due fattori TOTP è supportata solo nelle versioni dell'SDK Node.js di Firebase Admin 11.6.0 e superiori.
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 è cinque.Le TOTP funzionano assicurando che quando due parti (il provare e lo strumento di convalida) generano OTP nella stessa finestra temporale (in genere di 30 secondi), generino la stessa password. Tuttavia, per tenere conto del sfasamento tra le parti e del tempo di risposta umana, puoi configurare il servizio TOTP in modo che accetti anche i codici TOTP da finestre adiacenti.
Per attivare l'autenticazione a due fattori TOTP utilizzando l'API REST, esegui quanto segue:
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 di finestre temporali, da zero a dieci. Il valore predefinito è 5.Le TOTP funzionano garantendo che, quando due parti (l'utente che verifica l'identità e l'utente che convalida) generano OTP all'interno della stessa finestra temporale (in genere 30 secondi), generino la stessa password. Tuttavia, per tenere conto del sfasamento tra le parti e del tempo di risposta umana, puoi configurare il servizio TOTP in modo che accetti anche i codici TOTP da finestre adiacenti.
Scegli un modello di registrazione
Puoi scegliere se la tua app richiede l'autenticazione a più fattori e come e quando registrare i tuoi 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 l'autenticazione a più fattori nella tua app, ma non richiederla, ti consigliamo di utilizzare questo approccio.
Consente di aggiungere un secondo fattore dalla pagina di gestione dell'account o del profilo dell'utente, anziché dalla schermata di registrazione. In questo modo, le difficoltà durante la procedura di registrazione sono ridotte al minimo, pur mantenendo l'autenticazione multi-fattore disponibile per gli utenti attenti alla sicurezza.
Richiedi l'aggiunta di un secondo fattore in modo incrementale quando l'utente vuole accedere alle funzionalità con requisiti di sicurezza più elevati.
Registra gli utenti alla verifica multifattoriale TOTP
Dopo aver attivato l'MFA TOTP come secondo fattore per la tua app, implementa la logica lato client per registrare gli utenti all'MFA TOTP:
Esegui nuovamente l'autenticazione dell'utente.
Genera una chiave segreta TOTP per l'utente autenticato:
// Generate a TOTP secret. guard let mfaSession = try? await currentUser.multiFactor.session() else { return } guard let totpSecret = try? await TOTPMultiFactorGenerator.generateSecret(with: mfaSession) else { return } // Display the secret to the user and prompt them to enter it into their // authenticator app. (See the next step.)
Mostra il segreto all'utente e invitalo a inserirlo nella sua app di autenticazione:
// Display this key: let secret = totpSecret.sharedSecretKey()
Oltre a visualizzare la chiave segreta, puoi tentare di aggiungerla automaticamente all'app di autenticazione predefinita del dispositivo. Per farlo, genera un URI chiave compatibile con Google Authenticator e trasmettelo a
openInOTPApp(withQRCodeURL:)
:let otpAuthUri = totpSecret.generateQRCodeURL( withAccountName: currentUser.email ?? "default account", issuer: "Your App Name") totpSecret.openInOTPApp(withQRCodeURL: otpAuthUri)
Dopo che l'utente ha aggiunto il segreto all'app di autenticazione, inizierà a generare TOTP.
Chiedi all'utente di digitare il TOTP visualizzato dall'app di autenticazione e di usarlo per completare la registrazione all'MFA:
// Ask the user for a verification code from the authenticator app. let verificationCode = // Code from user input. // Finalize the enrollment. let multiFactorAssertion = TOTPMultiFactorGenerator.assertionForEnrollment( with: totpSecret, oneTimePassword: verificationCode) do { try await currentUser.multiFactor.enroll( with: multiFactorAssertion, displayName: "TOTP") } catch { // Wrong or expired OTP. Re-prompt the user. }
Consentire l'accesso degli utenti con un secondo fattore
Per consentire l'accesso degli utenti con l'autenticazione a due fattori TOTP, utilizza il seguente codice:
Chiama uno dei metodi
signIn(with...:)
come faresti se non utilizzassi la verifica in due passaggi (ad esempiosignIn(withEmail:password:)
). Se il metodo genera un errore con il codicesecondFactorRequired
, avvia il flusso di verifica in due passaggi della tua app.do { let authResult = try await Auth.auth().signIn(withEmail: email, password: password) // 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.) // ... } catch let error as AuthErrorCode where error.code == .secondFactorRequired { // Initiate your second factor sign-in flow. (See next step.) // ... } catch { // Other auth error. throw error }
Il flusso MFA dell'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à
hints
di un'istanzaMultiFactorResolver
:let mfaKey = AuthErrorUserInfoMultiFactorResolverKey guard let resolver = error.userInfo[mfaKey] as? MultiFactorResolver else { return } let enrolledFactors = resolver.hints.map(\.displayName)
Se l'utente sceglie di utilizzare il TOTP, chiedigli di digitare il TOTP visualizzato nell'app di autenticazione e di utilizzarlo per accedere:
let multiFactorInfo = resolver.hints[selectedIndex] switch multiFactorInfo.factorID { case TOTPMultiFactorID: let otpFromAuthenticator = // OTP typed by the user. let assertion = TOTPMultiFactorGenerator.assertionForSignIn( withEnrollmentID: multiFactorInfo.uid, oneTimePassword: otpFromAuthenticator) do { let authResult = try await resolver.resolveSignIn(with: assertion) } catch { // Wrong or expired OTP. Re-prompt the user. } default: return }
Annullare la registrazione alla verifica in due passaggi TOTP
Questa sezione descrive come gestire la disattivazione della verifica in due passaggi TOTP da parte di un utente.
Se un utente ha eseguito la registrazione per più opzioni MFA e se annulla la registrazione all'opzione abilitata più di recente, riceve un auth/user-token-expired
e viene disconnesso. L'utente deve accedere nuovamente 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:
guard let currentUser = Auth.auth().currentUser else { return }
// Prompt the user to select a factor to unenroll, from this array:
currentUser.multiFactor.enrolledFactors
// ...
// Unenroll the second factor.
let multiFactorInfo = currentUser.multiFactor.enrolledFactors[selectedIndex]
do {
try await currentUser.multiFactor.unenroll(with: multiFactorInfo)
} catch let error as AuthErrorCode where error.code == .invalidUserToken {
// Second factor unenrolled, but the user was signed out. Re-authenticate
// them.
}
Passaggi successivi
- Gestisci gli utenti a più fattori in modo programmatico con Admin SDK.