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

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

قبل ان تبدأ

قم بتثبيت Node.js Admin SDK . لغات المشرف الأخرى 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);
});