Como gerenciar usuários de vários fatores programaticamente
Neste documento, mostramos como usar o SDK Admin do Identity Platform para gerenciar usuários de vários fatores programaticamente. Ao gerenciar usuários de vários fatores você tem acesso a um intervalo maior de propriedades em comparação com usuários de fator único.
Antes de começar
- Instale o SDK Admin para Node.js. Outras linguagens do SDK Admin não são compatíveis.
Como conseguir usuários
É possível recuperar dados relacionados aos vários fatores do usuário, como uma lista de
segundos fatores registrados, a partir do objeto UserRecord
. Para conseguir um registro de usuário, chame
getUser()
ou getUserByEmail()
.
O exemplo abaixo mostra um usuário inscrito com vários fatores:
// 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',
},
],
},
};
Listar usuários
O código abaixo mostra como listar todos os usuários e verificar se eles têm um fator secundário 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);
});
Os usuários são retornados em lotes, ordenados pelo 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 tiverem sido listados, nenhum pageToken
será retornado.
O campo maxResult
especifica o tamanho máximo do lote. O valor padrão e
valor máximo é 1.000.
Criar um usuário
Chame createUser()
para criar um novo usuário. Os novos usuários com fatores secundários precisam
ter um endereço de e-mail verificado (definir emailVerified
como true
) e usar um
primeiro fator compatível para fazer login. Até cinco fatores secundários são permitidos por
usuário.
O exemplo mostra como criar um novo usuário com dois 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);
});
Como atualizar um usuário
Para atualizar um usuário, 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);
});
Como adicionar um novo fator secundário
Chamar updateUser()
com uma lista de enrolledFactors
apagará todos os fatores secundários
atuais do usuário. Para adicionar um novo fator secundário ao preservar
os atuais, procure o usuário primeiro e, em seguida, 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);
});
}
Como remover 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);
});