Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

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

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

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

ก่อนจะเริ่ม

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

การรับผู้ใช้

คุณสามารถดึงข้อมูลที่เกี่ยวข้องกับหลายปัจจัยของผู้ใช้ เช่น รายการปัจจัยที่สองที่ลงทะเบียน จากอ็อบเจ็กต์ 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 to 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('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 ผู้ใช้จากการตรวจสอบสิทธิ์แบบหลายปัจจัยโดยสมบูรณ์ ให้ตั้งค่า registeredFactors เป็น null หรืออาร์เรย์ว่าง:

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