Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Administrar usuarios multifactor

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

Este documento le muestra cómo usar Firebase Admin SDK para administrar sus usuarios multifactor mediante programación. Al administrar usuarios de múltiples factores, tiene acceso a una mayor variedad de propiedades de usuario en comparación con los usuarios de un solo factor .

Antes de que empieces

Instale el SDK de administrador de Node.js. Actualmente, no se admiten otros idiomas del SDK de administración.

Conseguir usuarios

Puede recuperar datos relacionados con múltiples factores del usuario, como una lista de segundos factores inscritos, del objeto UserRecord . Para obtener un registro de usuario, llame a getUser() o getUserByEmail() .

El siguiente ejemplo muestra un usuario inscrito multifactor:

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

Listado de usuarios

El siguiente código muestra cómo enumerar todos los usuarios y verificar si tienen un factor secundario inscrito:

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

Los usuarios se devuelven en lotes, ordenados por su uid . Cada lote de resultados contiene una lista de usuarios y un token de página siguiente que se usa para obtener el siguiente lote. Cuando se han enumerado todos los usuarios, no se devuelve ningún pageToken de página.

El campo maxResult especifica el tamaño máximo del lote. El valor predeterminado y máximo es 1000.

Creando un usuario

Llame a createUser() para crear un nuevo usuario. Los nuevos usuarios con factores secundarios deben tener una dirección de correo electrónico verificada (configurar emailVerified en true ) y usar un primer factor compatible para iniciar sesión. Se permiten hasta 5 factores secundarios por usuario.

El ejemplo muestra cómo crear un nuevo usuario con 2 factores secundarios:

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

Actualización de un usuario

Para actualizar un usuario existente, llama a 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);
});

Adición de un nuevo factor secundario

Llamar updateUser() con una lista de factores enrolledFactors borrará cualquiera de los factores secundarios actuales del usuario. Para agregar un nuevo factor secundario y conservar los existentes, primero busque al usuario y luego agregue el nuevo factor a la lista:

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

Eliminar un factor secundario

Para cancelar completamente la inscripción de un usuario de la autenticación de múltiples factores, configure los factores enrolledFactors en null o en una matriz vacía:

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