Gestione programmatica degli utenti con autenticazione a più fattori

Questo documento illustra come utilizzare l'SDK Admin di Identity Platform per gestire gli utenti con autenticazione 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 utilizzano un solo fattore.

Prima di iniziare

Acquisire utenti

Puoi recuperare i dati relativi all'autenticazione a più fattori dell'utente, ad esempio un elenco di secondi fattori registrati, 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 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);
});

Passaggi successivi