Zarządzanie użytkownikami uwierzytelniania wielopoziomowego

Z tego dokumentu dowiesz się, jak za pomocą pakietu Firebase Admin SDK automatycznie zarządzać użytkownikami wielopoziomowymi. Przy zarządzaniu użytkownikami wielopoziomowymi masz dostęp do większego zakresu właściwości użytkowników niż w przypadku użytkowników jednopoziomowych.

Zanim zaczniesz

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

Pozyskiwanie użytkowników

Z obiektu UserRecord możesz pobierać dane dotyczące użytkownika wielopoziomowego, takie jak lista zarejestrowanych drugich czynników. Aby uzyskać informacje o użytkownikach, wywołaj getUser() lub getUserByEmail().

Oto przykład 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',
      },
    ],
  },
};

Użytkownicy wizytówki

Poniższy kod pokazuje, jak wyświetlić listę wszystkich użytkowników i sprawdzić, czy mają zarejestrowani dla nich czynnik dodatkowy:

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 partiami w kolejności według: uid. Każda porcja wyników zawiera listę użytkowników oraz token następnej strony używany do pobrania następnej partii. Gdy wszyscy użytkownicy są widoczni, nie jest zwracany żaden element pageToken.

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

Tworzenie użytkownika

Wywołaj createUser(), aby utworzyć nowego użytkownika. Nowi użytkownicy z dodatkowymi czynnikami muszą mieć zweryfikowany adres e-mail (z wartością emailVerified ustaw wartość true) i logować się za pomocą obsługiwanego pierwszego składnika. Dozwolonych jest maksymalnie 5 czynników dodatkowych na użytkownika.

Ten 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, zadzwoń pod numer 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 updateUser() z listą enrolledFactors spowoduje usunięcie wszystkich bieżących czynników dodatkowych użytkownika. Aby dodać nowy czynnik dodatkowy i zachować obecne, najpierw wyszukaj użytkownika, a potem dodaj do listy nowy czynnik:

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 czynnika dodatkowego

Aby całkowicie wyrejestrować użytkownika z uwierzytelniania wielopoziomowego, ustaw enrolledFactors na null lub pustą tablica:

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