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

این سند به شما نشان می‌دهد که چگونه از Firebase Admin SDK برای مدیریت کاربران چند عاملی خود به صورت برنامه‌نویسی استفاده کنید. هنگام مدیریت کاربران چند عاملی، در مقایسه با کاربران تک عاملی، به طیف وسیع‌تری از ویژگی‌های کاربر دسترسی دارید.

قبل از اینکه شروع کنی

Admin SDK Node.js را نصب کنید . سایر زبان‌های 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 حداکثر اندازه دسته را مشخص می‌کند. مقدار پیش‌فرض و حداکثری آن ۱۰۰۰ است.

ایجاد یک کاربر

برای ایجاد یک کاربر جدید، تابع createUser() فراخوانی کنید. کاربران جدید با فاکتورهای ثانویه باید یک آدرس ایمیل تأیید شده داشته باشند ( emailVerified را روی true تنظیم کنید) و از یک فاکتور اول پشتیبانی شده برای ورود به سیستم استفاده کنند. هر کاربر مجاز به استفاده از حداکثر ۵ فاکتور ثانویه است.

این مثال نحوه ایجاد یک کاربر جدید با دو عامل ثانویه را نشان می‌دهد:

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