Questo documento mostra come utilizzare Firebase Admin SDK per gestire gli utenti a più fattori in modo programmatico. Quando si gestiscono gli utenti a più fattori, hai accesso a una gamma più ampia di proprietà utente rispetto per gli utenti che usano un solo fattore.
Prima di iniziare
Installa Admin SDK di Node.js. Altro Admin SDK lingue non supportate al momento.
Acquisire utenti
Puoi recuperare i dati relativi all'autenticazione a più fattori dell'utente, ad esempio un elenco
secondi fattori, dall'oggetto UserRecord
. Per ottenere un record di un utente, chiama
getUser()
o getUserByEmail()
.
L'esempio seguente mostra un utente registrato a più fattori:
// console.log(userRecord.toJSON());
{
uid: 'some-uid',
displayName: 'John Doe',
email: 'johndoe@gmail.com',
photoURL: 'http://www.example.com/12345678/photo.png',
emailVerified: true,
phoneNumber: '+11234567890',
// Set this user as admin.
customClaims: {admin: true},
// User with Google provider.
providerData: [{
uid: 'google-uid',
email: 'johndoe@gmail.com',
displayName: 'John Doe',
photoURL: 'http://www.example.com/12345678/photo.png',
providerId: 'google.com'
}],
multiFactor: {
enrolledFactors: [
// 2FA with SMS as 2nd factor.
{
uid: '53HG4HG45HG8G04GJ40J4G3J',
phoneNumber: '+16505551234',
displayName: 'Work phone',
enrollmentTime: 'Fri, 22 Sep 2017 01:49:58 GMT',
factorId: 'phone',
},
],
},
};
Elenco utenti
Il codice seguente mostra come elencare tutti gli utenti e verificare se dispongono di un account secondario fattore registrato:
admin.auth().listUsers(1000, nextPageToken)
.then((listUsersResult) => {
listUsersResult.users.forEach((userRecord) => {
// Multi-factor enrolled users second factors can be retrieved via:
if (userRecord.multiFactor) {
userRecord.multiFactor.enrolledFactors.forEach((enrolledFactor) => {
console.log(userRecord.uid, enrolledFactor.toJSON());
});
}
});
})
.catch((error) => {
console.log('Error listing users:', error);
});
Gli utenti vengono restituiti in batch, ordinati in base al loro uid
. Ogni gruppo di risultati
contiene un elenco di utenti e un token per la pagina successiva utilizzato per recuperare il batch successivo.
Quando tutti gli utenti sono stati elencati, non viene restituito alcun pageToken
.
Il campo maxResult
specifica la dimensione massima del batch. I valori predefiniti e
il valore massimo è 1000.
Creazione di un utente
Chiama createUser()
per creare un nuovo utente. I nuovi utenti con fattori secondari devono avere un indirizzo email verificato (imposta emailVerified
su true
) e utilizzare un primo fattore supportato per accedere. Sono consentiti fino a 5 fattori secondari per
utente.
L'esempio mostra come creare un nuovo utente con due fattori secondari:
admin.auth().createUser({
uid: '123456789',
email: 'user@example.com',
emailVerified: true,
password: 'password',
multiFactor: {
enrolledFactors: [
// When creating users with phone second factors, the uid and
// enrollmentTime should not be specified. These will be provisioned by
// the Auth server.
// Primary second factor.
{
phoneNumber: '+16505550001',
displayName: 'Corp phone',
factorId: 'phone',
},
// Backup second factor.
{
phoneNumber: '+16505550002',
displayName: 'Personal phone',
factorId: 'phone'
},
],
},
})
.then((userRecord) => {
console.log(userRecord.multiFactor.enrolledFactors);
})
.catch((error) => {
console.log(error);
});
Aggiornamento di un utente
Per aggiornare un utente esistente, chiama updateUser()
:
admin.auth().updateUser(uid: '123456789', {
multiFactor: {
enrolledFactors: [
{
// uid will be auto-generated.
phoneNumber: '+16505550003',
displayName: 'Spouse\'s phone',
factorId: 'phone',
},
{
// uid can also be specified. This is useful if a new second factor is added and an
// existing enrolled second factor is kept unmodified.
uid: 'existing-enrolled-mfa-uid',
phoneNumber: '+16505550004',
displayName: 'Personal phone',
factorId: 'phone',
},
{
phoneNumber: '+16505550005',
displayName: 'Backup phone',
factorId: 'phone',
// Enrollment time can also be explicitly specified.
enrollmentTime: new Date().toUTCString(),
},
],
},
})
.then((userRecord) => {
console.log(userRecord.multiFactor.enrolledFactors);
})
.catch((error) => {
console.log(error);
});
Aggiunta di un nuovo fattore secondario
La chiamata a updateUser()
con un elenco di enrolledFactors
comporterà la cancellazione di tutti i
fattori secondari dell'utente. Per aggiungere un nuovo fattore secondario
preservare quelli esistenti, cercare prima l'utente e poi aggiungere il nuovo fattore
nell'elenco:
function enrollSecondFactor(userId, secondFactorPhoneNumber, secondFactorDisplayName) {
return admin.auth().getUser(userId)
.then((userRecord) => {
const updatedList = (userRecord.multiFactor &&
userRecord.multiFactor.toJSON().enrolledFactors) || [];
updatedList.push({
phoneNumber: secondFactorPhoneNumber,
displayName: secondFactorDisplayName,
factorId: 'phone',
});
return admin.auth().updateUser(userRecord.uid, {
multiFactor: {
enrolledFactors: updatedList,
},
});
})
.catch((error) => {
console.log(error);
});
}
Rimuovere un fattore secondario
Per annullare completamente la registrazione di un utente all'autenticazione a più fattori, imposta
Da enrolledFactors
a null
o un array vuoto:
admin.auth().updateUser(uid: '123456789', {
multiFactor: {
enrolledFactors: null,
},
})
.then((userRecord) => {
console.log(userRecord.multiFactor);
})
.catch((error) => {
console.log(error);
});