Gérer les utilisateurs de l'authentification multifacteur

Ce document explique comment utiliser Firebase Admin SDK pour gérer vos utilisateurs multifacteur par programmation. En gérant des utilisateurs multifacteur, vous avez accès à un plus grand nombre de propriétés utilisateur qu'avec les utilisateurs monofacteur.

Avant de commencer

Installez l'Admin SDK Node.js. Les autres langues Admin SDK ne sont pas compatibles pour le moment.

Obtenir des comptes utilisateur

Vous pouvez récupérer les données liées à l'authentification multifacteur, par exemple une liste de facteurs secondaires enregistrés, à partir de l'objet UserRecord. Pour obtenir une fiche utilisateur, appelez getUser() ou getUserByEmail().

L'exemple ci-dessous montre un utilisateur inscrit multifacteur :

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

Répertorier les utilisateurs

Le code ci-dessous montre comment répertorier tous les utilisateurs et vérifier s'ils possèdent un facteur secondaire inscrit :

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

Les utilisateurs sont renvoyés par lots, classés selon leur uid. Chaque lot de résultats contient une liste d'utilisateurs, ainsi qu'un jeton de page suivant utilisé pour récupérer le lot suivant. Lorsque tous les utilisateurs ont été répertoriés, aucun résultat pageToken n'est renvoyé.

Le champ maxResult spécifie la taille maximale du lot. La valeur par défaut et maximale est de 1 000.

Créer un utilisateur

Appelez createUser() pour créer un utilisateur. Les nouveaux utilisateurs avec des facteurs secondaires doivent disposer d'une adresse e-mail validée (emailVerified défini sur true) et utiliser un premier facteur compatible pour la connexion. Jusqu'à cinq facteurs secondaires sont autorisés par utilisateur.

Cet exemple montre comment créer un utilisateur avec 2 facteurs secondaires :

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

Mettre à jour un compte utilisateur

Pour mettre à jour un utilisateur existant, appelez 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);
});

Ajouter un nouveau facteur secondaire

Si vous appelez updateUser() avec une liste de enrolledFactors, tous les facteurs secondaires actuels de l'utilisateur sont effacés. Pour ajouter un nouveau facteur secondaire tout en préservant les facteurs existants, recherchez d'abord l'utilisateur, puis ajoutez le nouveau facteur à la liste :

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

Supprimer un facteur secondaire

Pour désinscrire complètement un utilisateur de l'authentification multifacteur, définissez enrolledFactors sur null ou un tableau vide :

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