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

במסמך הזה מוסבר איך להשתמש ב-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);
});