Zarządzanie użytkownikami uwierzytelniania wielopoziomowego

Z tego dokumentu dowiesz się, jak za pomocą interfejsu API Firebase Admin SDK zarządzać użytkownikami korzystającymi z wieloczynnikowego uwierzytelniania programowo. Podczas zarządzania użytkownikami uwierzytelniania wielopoziomowego masz dostęp do większej liczby właściwości użytkownika niż w przypadku użytkowników uwierzytelniania jednopoziomowego.

Zanim zaczniesz

Zainstaluj Node.js Admin SDK. Inne języki Admin SDKnie są obecnie obsługiwane.

Pozyskiwanie użytkowników

Z obiektu UserRecord możesz pobrać dane dotyczące uwierzytelniania wielopoziomowego użytkownika, np. listę zarejestrowanych drugorzędnych czynników uwierzytelniania. Aby uzyskać rekord użytkownika, wywołaj funkcję getUser() lub getUserByEmail().

Przykład poniżej pokazuje zarejestrowanego użytkownika uwierzytelniania wielopoziomowego:

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

Wyświetlanie użytkowników

Poniższy kod pokazuje, jak wyświetlić wszystkich użytkowników i sprawdzić, czy mają włączony drugi czynnik:

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

Użytkownicy są zwracani w partiach, uporządkowanych według uid. Każda partia wyników zawiera listę użytkowników i token strony następnej, który służy do pobierania kolejnej partii. Gdy wyświetlono wszystkich użytkowników, nie zwraca się pageToken.

Pole maxResult określa maksymalny rozmiar partii. Wartością domyślną i maksymalną jest 1000.

Tworzenie konta użytkownika

Aby utworzyć nowego użytkownika, zadzwoń pod numer createUser(). Nowi użytkownicy z czynnikami dodatkowymi muszą mieć zweryfikowany adres e-mail (ustaw emailVerified na true) i używać obsługiwanego pierwszego poziomu uwierzytelniania. Na użytkownika można ustawić maksymalnie 5 drugorzędnych czynników.

Przykład pokazuje, jak utworzyć nowego użytkownika z 2 czynnikami dodatkowymi:

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

Aktualizowanie użytkownika

Aby zaktualizować istniejącego użytkownika, wywołaj funkcję 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);
});

Dodawanie nowego czynnika dodatkowego

Wywołanie funkcji updateUser() z listą enrolledFactors spowoduje usunięcie wszystkich aktualnych czynników pomocniczych użytkownika. Aby dodać nowy czynnik dodatkowy, zachowując istniejące, najpierw wyszukaj użytkownika, a potem dodaj nowy czynnik do listy:

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

Usuwanie drugiego czynnika

Aby całkowicie wyrejestrować użytkownika z uwierzytelniania wielopoziomowego, ustaw enrolledFactors na null lub pusty tablicę:

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