Multi-Faktor-Nutzer verwalten

In diesem Dokument wird gezeigt, wie Sie mit dem Firebase Admin SDK Ihre Multi-Faktor-Nutzer programmatisch verwalten. Wenn Sie Multi-Faktor-Nutzer verwalten, haben Sie Zugriff auf eine größere Anzahl von Nutzerattributen im Vergleich zu Single-Faktor-Nutzern.

Hinweis

Installieren Sie die Node.js-Admin SDK. Andere Admin SDK-Sprachen werden derzeit nicht unterstützt.

Nutzer abrufen

Sie können multifaktorbezogene Daten für Nutzer aus dem UserRecord-Objekt abrufen, z. B. eine Liste angemeldeter zweiter Faktoren. Rufen Sie getUser() oder getUserByEmail() auf, um einen Nutzerdatensatz abzurufen.

Das folgende Beispiel zeigt einen Nutzer, der über die Multi-Faktor-Authentifizierung angemeldet ist:

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

Nutzer auflisten

Der folgende Code zeigt, wie Sie alle Nutzer auflisten und prüfen können, ob sie einen sekundären Faktor registriert haben:

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

Die Nutzer werden in Batches nach uid sortiert. Jeder Batch von Ergebnissen enthält eine Liste von Nutzern sowie ein Token für die nächste Seite zum Abrufen des nächsten Batches. Wenn alle Nutzer aufgelistet wurden, wird kein pageToken zurückgegeben.

Das Feld maxResult gibt die maximale Stapelgröße an. Der Standard- und der Höchstwert sind 1.000.

Nutzer erstellen

Rufen Sie createUser() auf, um einen neuen Nutzer zu erstellen. Neue Nutzer mit sekundären Faktoren müssen eine bestätigte E-Mail-Adresse haben (emailVerified auf true festlegen) und einen unterstützten ersten Faktor für die Anmeldung verwenden. Pro Nutzer sind maximal fünf sekundäre Faktoren zulässig.

Das Beispiel zeigt, wie ein neuer Nutzer mit zwei sekundären Faktoren erstellt wird:

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

Nutzer aktualisieren

Rufen Sie updateUser() auf, um einen vorhandenen Nutzer zu aktualisieren:

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

Neuen sekundären Faktor hinzufügen

Wenn Sie updateUser() mit einer Liste von enrolledFactors aufrufen, werden alle aktuellen sekundären Faktoren des Nutzers gelöscht. Wenn Sie einen neuen sekundären Faktor hinzufügen möchten, während Sie die vorhandenen beibehalten möchten, suchen Sie zuerst den Nutzer und fügen Sie den neuen Faktor in die Liste ein:

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

Sekundären Faktor entfernen

Setzen Sie enrolledFactors auf null oder ein leeres Array, um einen Nutzer vollständig aus der Multi-Faktor-Authentifizierung abzumelden:

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