مدیریت کاربران چند عاملی

این سند به شما نشان می دهد که چگونه از 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 عامل ثانویه برای هر کاربر مجاز است.

این مثال نحوه ایجاد یک کاربر جدید با 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(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);
});