Gestione programmatica degli utenti con autenticazione a più fattori

Questo documento mostra come utilizzare l'SDK Admin di Identity Platform per gestire i tuoi utenti a più fattori in modo programmatico. Quando gestisci utenti con più fattori, hai accesso a una gamma più ampia di proprietà utente rispetto agli utenti con fattori singoli.

Prima di iniziare

Conquistare utenti

Puoi recuperare i dati a più fattori relativi all'utente, ad esempio un elenco di fattori con secondi registrati, dall'oggetto UserRecord. Per recuperare il 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',
      },
    ],
  },
};

Utenti della scheda

Il codice seguente mostra come elencare tutti gli utenti e verificare se hanno registrato un fattore secondario:

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 di pagina successivo utilizzato per recuperare il gruppo 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.

Creazione di un utente

Chiama il numero 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 cinque 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('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

Se chiami updateUser() con un elenco di enrolledFactors, tutti i fattori secondari attuali dell'utente verranno eliminati. Per aggiungere un nuovo fattore secondario pur mantenendo quelli esistenti, cerca prima l'utente, poi 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);
    });
}

Rimozione di un fattore secondario

Per annullare completamente la registrazione di un utente dall'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);
});

Passaggi successivi