إدارة المستخدمين متعددي العوامل

يوضّح لك هذا المستند كيفية استخدام حزمة تطوير البرامج (SDK) لمشرفي Firebase لإدارة المستخدمين متعددي العوامل آليًا. عند إدارة المستخدمين متعددي العوامل، يمكنك الوصول إلى مجموعة أكبر من خصائص المستخدمين مقارنةً بالمستخدمين الأحاديين.

قبل البدء

ثبِّت حزمة تطوير البرامج لمشرف Node.js. لا يتم حاليًا دعم لغات 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 الحد الأقصى لحجم الدُفعة. القيمة الافتراضية والقصوى هي 1000.

إنشاء مستخدم

يُرجى الاتصال بالرقم createUser() لإنشاء مستخدم جديد. على المستخدمين الجدد الذين لديهم عوامل ثانوية الحصول على عنوان بريد إلكتروني تم إثبات ملكيته (تم ضبط emailVerified على true) واستخدام عامل أول متوافق لتسجيل الدخول. ويُسمح باستخدام ما يصل إلى 5 عوامل ثانوية لكل مستخدم.

يوضّح المثال كيفية إنشاء مستخدم جديد بعاملَين ثانويَين:

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