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

במאמר הזה מוסבר איך להשתמש ב-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 מציין את גודל האצווה המקסימלי. ערך ברירת המחדל והערך המקסימלי הוא 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);
});