Gérer les utilisateurs multi-facteurs

Ce document vous montre comment utiliser le SDK Firebase Admin pour gérer vos utilisateurs multifacteur par programmation. Lors de la gestion d'utilisateurs multifacteur, vous avez accès à une gamme accrue de propriétés utilisateur par rapport aux utilisateurs à un seul facteur .

Avant que tu commences

Installez le SDK d'administration Node.js. Les autres langues du SDK Admin ne sont actuellement pas prises en charge.

Obtenir des utilisateurs

Vous pouvez récupérer des données utilisateur liées à plusieurs facteurs, telles qu'une liste de seconds facteurs inscrits, à partir de l'objet UserRecord . Pour obtenir un enregistrement utilisateur, appelez getUser() ou getUserByEmail() .

L'exemple ci-dessous montre un utilisateur inscrit à plusieurs facteurs :

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

Liste des utilisateurs

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

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 par leur uid . Chaque lot de résultats contient une liste d'utilisateurs et un jeton de page suivante utilisé pour récupérer le lot suivant. Lorsque tous les utilisateurs ont été répertoriés, aucun 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éation d'un utilisateur

Appelez createUser() pour créer un nouvel utilisateur. Les nouveaux utilisateurs avec des facteurs secondaires doivent disposer d'une adresse e-mail vérifiée (définissez emailVerified sur true ) et utiliser un premier facteur pris en charge pour se connecter. Jusqu'à 5 facteurs secondaires sont autorisés par utilisateur.

L'exemple montre comment créer un nouvel 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 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);
});

Ajout d'un nouveau facteur secondaire

L’appel updateUser() avec une liste de enrolledFactors effacera tous les facteurs secondaires actuels de l’utilisateur. Pour ajouter un nouveau facteur secondaire tout en préservant ceux 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 sur un tableau vide :

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