ניהול משתמשים מרובי גורמים

במאמר הזה מוסבר איך להשתמש ב-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 מציינים את הגודל המקסימלי של קבוצת הפעולות. ערך ברירת המחדל והערך המקסימלי הוא 1,000.

יצירת משתמש

מתקשרים אל 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);
});