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