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

يوضّح هذا المستند كيفية استخدام 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 الحد الأقصى لحجم الدفعة. القيمة التلقائية والحد الأقصى هي 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);
});