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

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

درحال ایجاد کاربر

برای ایجاد کاربر جدید، با 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);
});