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

يوضّح لك هذا المستند كيفية استخدام 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);
});