จัดการผู้ใช้แบบหลายปัจจัย

เอกสารนี้แสดงวิธีใช้ Firebase Admin SDK เพื่อจัดการผู้ใช้แบบหลายปัจจัยแบบเป็นโปรแกรม เมื่อจัดการผู้ใช้แบบหลายปัจจัย คุณจะมีสิทธิ์เข้าถึงพร็อพเพอร์ตี้ผู้ใช้ที่หลากหลายมากขึ้นเมื่อเทียบกับผู้ใช้แบบปัจจัยเดียว

ก่อนเริ่มต้น

ติดตั้ง Node.js Admin SDK ระบบยังไม่รองรับAdmin SDKภาษาอื่นๆ ในขณะนี้

การได้ผู้ใช้

คุณสามารถดึงข้อมูลที่เกี่ยวข้องกับการตรวจสอบสิทธิ์แบบหลายปัจจัยของผู้ใช้ เช่น รายการปัจจัยที่ 2 ที่ลงทะเบียนไว้ ได้จากออบเจ็กต์ UserRecord หากต้องการดูระเบียนผู้ใช้ ให้โทรไปที่ getUser() หรือ getUserByEmail()

ตัวอย่างด้านล่างแสดงผู้ใช้ที่ลงทะเบียนแบบหลายปัจจัย

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

การแสดงรายชื่อผู้ใช้

โค้ดด้านล่างแสดงวิธีแสดงรายการผู้ใช้ทั้งหมดและตรวจสอบว่าผู้ใช้ลงทะเบียนปัจจัยรองไว้หรือไม่

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

ระบบจะแสดงผู้ใช้เป็นกลุ่มๆ โดยจัดเรียงตาม uid ผลลัพธ์แต่ละชุดจะมีรายการผู้ใช้และโทเค็นหน้าถัดไปที่ใช้ดึงข้อมูลชุดถัดไป เมื่อแสดงผู้ใช้ทั้งหมดแล้ว ระบบจะไม่แสดง pageToken

ช่อง maxResult จะระบุขนาดการประมวลผลกลุ่มสูงสุด ค่าเริ่มต้นและค่าสูงสุดคือ 1,000

การสร้างผู้ใช้

โทรหา createUser() เพื่อสร้างผู้ใช้ใหม่ ผู้ใช้ใหม่ที่มีปัจจัยรองต้องมีอีเมลที่ยืนยันแล้ว (ตั้งค่า emailVerified เป็น true) และใช้ปัจจัยแรกที่ได้รับการรองรับเพื่อลงชื่อเข้าใช้ ผู้ใช้แต่ละรายจะมีปัจจัยรองได้สูงสุด 5 รายการ

ตัวอย่างนี้แสดงวิธีสร้างผู้ใช้ใหม่ด้วยปัจจัยรอง 2 รายการ

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

กำลังอัปเดตผู้ใช้

หากต้องการอัปเดตผู้ใช้ที่มีอยู่ ให้เรียกใช้ 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);
});

การเพิ่มปัจจัยรองใหม่

การเรียกใช้ updateUser() ด้วยรายการ enrolledFactors จะลบปัจจัยรองปัจจุบันทั้งหมดของผู้ใช้ หากต้องการเพิ่มปัจจัยรองใหม่โดยที่ยังคงเก็บปัจจัยที่มีอยู่ ให้ค้นหาผู้ใช้ก่อน แล้วเพิ่มปัจจัยใหม่ลงในรายการดังนี้

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

การนำปัจจัยรองออก

หากต้องการยกเลิกการลงทะเบียนผู้ใช้จากการตรวจสอบสิทธิ์แบบหลายปัจจัยโดยสมบูรณ์ ให้ตั้งค่า enrolledFactors เป็น null หรืออาร์เรย์ว่าง

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