Gerenciar usuários multifatores

Este documento mostra como usar o SDK Admin do Firebase para gerenciar seus usuários multifatoriais de maneira programática. Ao gerenciar usuários multifatoriais, você tem acesso a uma variedade maior de propriedades do usuário em comparação com usuários de fator único .

Antes de você começar

Instale o SDK Admin do Node.js. Outras linguagens do Admin SDK não são suportadas atualmente.

Obtendo usuários

Você pode recuperar dados relacionados a vários fatores do usuário, como uma lista de segundos fatores registrados, do objeto UserRecord . Para obter um registro de usuário, chame getUser() ou getUserByEmail() .

O exemplo abaixo mostra um usuário inscrito multifator:

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

Listando usuários

O código abaixo mostra como listar todos os usuários e verificar se eles possuem um fator secundário cadastrado:

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

Os usuários são retornados em lotes, ordenados pelo seu uid . Cada lote de resultados contém uma lista de usuários e um token de próxima página usado para buscar o próximo lote. Quando todos os usuários forem listados, nenhum pageToken será retornado.

O campo maxResult especifica o tamanho máximo do lote. O valor padrão e máximo é 1000.

Criando um usuário

Chame createUser() para criar um novo usuário. Novos usuários com fatores secundários devem ter um endereço de e-mail verificado (definir emailVerified como true ) e usar um primeiro fator compatível para fazer login. São permitidos até cinco fatores secundários por usuário.

O exemplo mostra como criar um novo usuário com 2 fatores secundários:

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

Atualizando um usuário

Para atualizar um usuário existente, chame 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);
});

Adicionando um novo fator secundário

Chamar updateUser() com uma lista de enrolledFactors apagará qualquer um dos fatores secundários atuais do usuário. Para adicionar um novo fator secundário preservando os existentes, procure primeiro o usuário e depois adicione o novo fator à 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);
    });
}

Removendo um fator secundário

Para cancelar completamente a inscrição de um usuário na autenticação multifator, defina enrolledFactors como null ou uma matriz vazia:

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