Catch up on highlights from Firebase at Google I/O 2023. Learn more

Verwalten Sie Multi-Faktor-Benutzer

In diesem Dokument erfahren Sie, wie Sie das Firebase Admin SDK verwenden, um Ihre Multi-Factor-Benutzer programmgesteuert zu verwalten. Bei der Verwaltung von Multi-Factor-Benutzern haben Sie im Vergleich zu Single-Factor-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 bekommen

Sie können benutzerbezogene Multi-Faktor-Daten aus dem UserRecord Objekt abrufen, z. B. eine Liste der registrierten zweiten Faktoren. Rufen Sie zum Abrufen eines Benutzerdatensatzes getUser() oder getUserByEmail() .

Das folgende Beispiel zeigt einen Multi-Factor-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 Sie alle Benutzer auflisten und prüfen, 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);
  });

Benutzer werden in Stapeln zurückgegeben, geordnet 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 Stapelgröße an. Der Standard- und Maximalwert ist 1000.

Erstellen eines Benutzers

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

Das Beispiel zeigt, wie Sie einen neuen Benutzer mit 2 sekundären Faktoren erstellen:

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

Aktualisieren eines Benutzers

Um einen bestehenden Benutzer zu aktualisieren, rufen updateUser() :

admin.auth().updateUser('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

Der Aufruf updateUser() mit einer Liste von enrolledFactors löscht alle aktuellen sekundären Faktoren des Benutzers. Um einen neuen sekundären Faktor hinzuzufügen und gleichzeitig die vorhandenen beizubehalten, suchen Sie zuerst den 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);
});