Zarządzanie użytkownikami uwierzytelniania wielopoziomowego

Z tego dokumentu dowiesz się, jak za pomocą narzędzia 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 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 dodatkowych czynników. Aby uzyskać informacje o użytkowniku, 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 porcja wyników zawiera listę użytkowników oraz token następnej strony używany do pobrania następnej partii. Gdy wyświetlono wszystkich użytkowników, nie zwraca się pageToken.

Pole maxResult określa maksymalny rozmiar wsadu. 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 czynnika dodatkowego

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