Verwalten Sie Multi-Faktor-Benutzer

In diesem Dokument erfahren Sie, wie Sie mit dem Firebase Admin SDK Ihre Multi-Faktor-Benutzer programmgesteuert verwalten. Bei der Verwaltung von Multi-Faktor-Benutzern haben Sie im Vergleich zu Einzel-Faktor-Benutzern Zugriff auf eine größere Auswahl an Benutzereigenschaften.

Bevor Sie beginnen

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

Benutzer gewinnen

Sie können mehrfaktorbezogene Benutzerdaten, z. B. eine Liste der registrierten zweiten Faktoren, aus dem UserRecord Objekt abrufen. Um einen Benutzerdatensatz abzurufen, rufen Sie getUser() oder getUserByEmail() auf.

Das folgende Beispiel zeigt einen für mehrere Faktoren registrierten Benutzer:

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

Benutzer auflisten

Der folgende Code zeigt, wie alle Benutzer aufgelistet und überprüft werden, ob für sie ein sekundärer Faktor registriert ist:

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

Benutzer werden in Stapeln zurückgegeben, sortiert nach ihrer uid . Jeder Ergebnisstapel enthält eine Liste von Benutzern und ein Token für die nächste Seite, das zum Abrufen des nächsten Stapels verwendet wird. Wenn alle Benutzer aufgelistet wurden, wird kein pageToken zurückgegeben.

Das Feld maxResult gibt die maximale Batchgröße an. Der Standard- und Maximalwert ist 1000.

Einen Benutzer erstellen

Rufen Sie createUser() auf, um einen neuen Benutzer zu erstellen. Neue Benutzer mit sekundären Faktoren müssen über eine bestätigte E-Mail-Adresse verfügen ( emailVerified auf true setzen) und zum Anmelden einen unterstützten ersten Faktor verwenden. Pro Benutzer sind bis zu 5 sekundäre Faktoren zulässig.

Das Beispiel zeigt, wie man einen neuen Benutzer mit 2 sekundären Faktoren erstellt:

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

Einen Benutzer aktualisieren

Um einen vorhandenen Benutzer zu aktualisieren, rufen Sie updateUser() auf:

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

Hinzufügen eines neuen sekundären Faktors

Durch den Aufruf von updateUser() mit einer Liste von enrolledFactors werden alle aktuellen sekundären Faktoren des Benutzers gelöscht. Um einen neuen sekundären Faktor hinzuzufügen und gleichzeitig die vorhandenen beizubehalten, suchen Sie zuerst nach dem Benutzer und fügen Sie dann den neuen Faktor zur Liste hinzu:

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

Entfernen eines sekundären Faktors

Um einen Benutzer vollständig von der Multi-Faktor-Authentifizierung abzumelden, setzen Sie enrolledFactors auf null oder ein leeres Array:

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