Gérer les utilisateurs multi-facteurs

Ce document vous montre comment utiliser le SDK Firebase Admin pour gérer vos utilisateurs multi-facteurs par programmation. Lorsque vous gérez des utilisateurs multifacteur, vous avez accès à une gamme étendue de propriétés utilisateur par rapport aux utilisateurs à facteur unique .

Avant que tu commences

Installez le SDK d'administration Node.js . Les autres langages du SDK d'administration ne sont actuellement pas pris 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 d'utilisateur, appelez getUser() ou getUserByEmail() .

L'exemple ci-dessous montre un utilisateur inscrit multi-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 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, trié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 de lot maximale. La valeur par défaut et maximale est 1000.

Création d'un utilisateur

Appelez createUser() pour créer un nouvel utilisateur. Les nouveaux utilisateurs avec des facteurs secondaires doivent avoir une adresse e-mail vérifiée (définir 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 d' 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);
    });
}

Suppression d'un facteur secondaire

Pour désinscrire complètement un utilisateur de l'authentification multi-facteurs, 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);
});