Gestisci utenti con l'autenticazione a più fattori

Questo documento mostra come utilizzare Firebase Admin SDK per gestire gli utenti con autenticazione a più fattori a livello programmatico. Quando gestisci utenti con autenticazione a più fattori, hai accesso a una gamma più ampia di proprietà utente rispetto a utenti con autenticazione a un solo fattore.

Prima di iniziare

Installa l'SDK Admin Node.js Admin SDK. Al momento non sono supportate altre Admin SDK lingue.

Recuperare gli utenti

Puoi recuperare i dati relativi all'autenticazione a più fattori dell'utente, ad esempio un elenco dei secondi fattori registrati, dall'oggetto UserRecord. Per recuperare un record utente, chiama getUser() o getUserByEmail().

L'esempio seguente mostra un utente con autenticazione a più fattori registrata:

// 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',
      },
    ],
  },
};

Elencare gli utenti

Il codice riportato di seguito mostra come elencare tutti gli utenti e verificare se hanno registrato un secondo fattore:

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 batch di risultati contiene un elenco di utenti e un token della 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. Il valore predefinito e massimo è 1000.

Creare 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 2 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);
});

Aggiornare 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);
});

Aggiungere un nuovo fattore secondario

La chiamata a updateUser() con un elenco di enrolledFactors cancellerà tutti i fattori secondari correnti dell'utente. Per aggiungere un nuovo fattore secondario mantenendo quelli esistenti, cerca prima l'utente, quindi aggiungi il nuovo fattore all'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 enrolledFactors su null o su un array vuoto:

admin.auth().updateUser(uid: '123456789', {
  multiFactor: {
    enrolledFactors: null,
  },
})
.then((userRecord) => {
  console.log(userRecord.multiFactor);
})
.catch((error) => {
  console.log(error);
});