Mengelola Pengguna Multi-faktor

Dokumen ini menunjukkan cara menggunakan Firebase Admin SDK untuk mengelola pengguna multi-faktor secara terprogram. Saat mengelola pengguna multi-faktor, Anda memiliki akses ke berbagai properti pengguna yang ditingkatkan dibandingkan dengan pengguna satu faktor.

Sebelum memulai

Instal Admin SDK Node.js. Bahasa Admin SDK lainnya saat ini tidak didukung.

Mendapatkan pengguna

Anda dapat mengambil data terkait multi-faktor pengguna, seperti daftar faktor kedua yang terdaftar, dari objek UserRecord. Untuk mendapatkan data pengguna, panggil getUser() atau getUserByEmail().

Contoh di bawah menunjukkan pengguna terdaftar dengan multi-faktor:

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

Menampilkan daftar pengguna

Kode di bawah menunjukkan cara menampilkan daftar semua pengguna dan memeriksa apakah mereka memiliki faktor sekunder yang terdaftar atau tidak:

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

Pengguna ditampilkan dalam batch, yang diurutkan berdasarkan uid mereka. Setiap batch hasil berisi daftar pengguna, dan token halaman berikutnya digunakan untuk mengambil batch berikutnya. Setelah semua pengguna sudah tercantum, tidak ada pageToken yang ditampilkan.

Kolom maxResult menentukan ukuran batch maksimum. Nilai default dan maksimumnya adalah 1000.

Membuat pengguna

Panggil createUser() untuk membuat pengguna baru. Pengguna baru dengan faktor sekunder harus memiliki alamat email terverifikasi (tetapkan emailVerified ke true) dan menggunakan faktor pertama yang didukung untuk login. Maksimal 5 faktor sekunder diizinkan per pengguna.

Contoh berikut menunjukkan cara membuat pengguna baru dengan 2 faktor sekunder:

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

Memperbarui data pengguna

Untuk memperbarui data pengguna yang sudah ada, panggil 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);
});

Menambahkan faktor sekunder baru

Memanggil updateUser() dengan daftar enrolledFactors akan menghapus faktor sekunder pengguna saat ini. Untuk menambahkan faktor sekunder baru sekaligus mempertahankan faktor yang sudah ada, cari pengguna terlebih dahulu, lalu tambahkan faktor baru ke daftar:

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

Menghapus faktor sekunder

Untuk membatalkan pendaftaran pengguna sepenuhnya dari autentikasi multi-faktor, tetapkan enrolledFactors ke null atau array kosong:

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