Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Gestione programmatica degli utenti con autenticazione a più fattori

Questo documento mostra come utilizzare l'SDK Admin Platform di Identity Platform per gestire i tuoi utenti a più fattori in modo programmatico. Quando gestisci gli utenti a più fattori, hai accesso a un intervallo più ampio di proprietà utente rispetto agli utenti con un unico fattore.

Prima di iniziare

Acquisizione utenti

Puoi recuperare i dati utente a più fattori, ad esempio un elenco di fattori secondo registrati, dall'oggetto UserRecord. Per recuperare un record dell'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 dell'elenco

Il codice seguente mostra come elencare tutti gli utenti e verificare se sono registrati 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 della 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 createUser() per creare un nuovo utente. I nuovi utenti con fattori secondari devono avere un indirizzo email verificato (impostato su 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 il numero 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

La chiamata a updateUser() con un elenco di enrolledFactors comporterà la cancellazione di tutti i fattori secondari dell'utente corrente. Per aggiungere un nuovo fattore secondario 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);
    });
}

Rimuovere 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