העברת משתמשים בין פרויקטים ודיירים

במאמר הזה מוסבר איך להעביר משתמשים מפרויקט קיים ב-Identity Platform לפרויקט אחר. בנוסף, מוסבר איך להעביר משתמשים מפרויקט שאינו פרויקט של דייר לפרויקט של דייר, או להעביר משתמשים בין דיירים.

לפני שמתחילים

הגדרת מפתחות של חשבונות שירות

כדי להעביר חשבונות משתמשים, צריך מפתחות של חשבונות שירות גם לפרויקט המקור וגם לפרויקט היעד. לחשבונות השירות צריך להעניק לפחות את תפקיד העריכה (roles/editor) ב-IAM כדי לגשת למשתמשים ולסיסמאות שלהם שעברו גיבוב מפרויקט המקור. במאמרים ומסמכי העזרה של IAM מוסבר איך ליצור חשבונות שירות, להעניק הרשאות ולקבל מפתחות.

אחרי שמורידים את המפתחות, משתמשים בהם כדי ליצור שני מופעים של auth.

var admin = require('firebase-admin');

var sourceApp = admin.initializeApp({
  credential: admin.credential.cert('source-project-service-account.json'),
}, 'source-app');

var targetApp = admin.initializeApp({
  credential: admin.credential.cert('target-project-service-account.json'),
}, 'target-app');

var authFrom = sourceApp.auth();
var authTo = targetApp.auth();

אם מדיניות בקרת הגישה לא מאפשרת שימוש בכמה חשבונות שירות בעומס עבודה יחיד, עדיין אפשר להשתמש בקוד לדוגמה מהמסמך הזה, אבל קודם צריך להוריד את כל המשתמשים מפרויקט המקור למערכת אחסון, ואז להעלות אותם לפרויקט היעד בעומס עבודה נפרד.

העברת משתמשים בין פרויקטים

כדי להעביר משתמשים, קוראים לשיטה admin.auth().listUsers שמחזירה רשימה של משתמשים עם אפשרות להצגת דפים. אחר כך תוכלו להתקשר אל admin.auth().importUsers() כדי להעלות אותם לפרויקט היעד.

אפשר להוריד או להעלות עד 1,000 משתמשים בכל פעם.

משתמשים בסיסמאות? תצטרכו לספק את הגדרות הגיבוב לגיבוב הסיסמאות. כדי לאחזר את הגדרת הגיבוב, עוברים אל דף המשתמשים של Identity Platform במסוףGoogle Cloud ולוחצים על ייבוא משתמשים.

בדוגמה הבאה אפשר לראות איך מעבירים משתמשים:

function migrateUsers(userImportOptions, nextPageToken) {
 var pageToken;
 authFrom.listUsers(1000, nextPageToken)
   .then(function(listUsersResult) {
    var users = [];
    listUsersResult.users.forEach(function(user) {
      var modifiedUser = user.toJSON();
      // Convert to bytes.
      if (user.passwordHash) {
       modifiedUser.passwordHash = Buffer.from(user.passwordHash, 'base64');
       modifiedUser.passwordSalt = Buffer.from(user.passwordSalt, 'base64');
      }
      // Delete tenant ID if available. This will be set automatically.
      delete modifiedUser.tenantId;
      users.push(modifiedUser);
    });
    // Save next page token.
    pageToken = listUsersResult.pageToken;
    // Upload current chunk.
    return authTo.importUsers(users, userImportOptions);
   })
   .then(function(results) {
    results.errors.forEach(function(indexedError) {
       console.log('Error importing user ' + indexedError.index);
     });
     // Continue if there is another page.
     if (pageToken) {
         migrateUsers(userImportOptions, pageToken);
     }
   })
   .catch(function(error) {
     console.log('Error importing users:', error);
   });
}
var userImportOptions = {
 hash: {
   algorithm: 'SCRYPT',
   // The following parameters can be obtained from the "Users" page in the
   // Cloud console. The key must be a byte buffer.
   key: Buffer.from('base64-secret', 'base64'),
   saltSeparator: Buffer.from('base64SaltSeparator', 'base64'),
   rounds: 8,
   memoryCost: 14
 }
};

migrateUsers(userImportOptions);

מידע נוסף מופיע במאמרי העזרה של Admin SDK API.

העברת משתמשים לדייר

העברת משתמשים מפרויקט שאינו פרויקט של דייר לפרויקט של דייר כמעט זהה להעברת משתמשים בין פרויקטים.

בהנחה שהדייר שייך לפרויקט אחר מפרויקט Identity Platform של המקור, משתמשים באותו קוד כמו קודם, אבל קוראים ל-admin.auth().tenantManager().authForTenant() במופע של אפליקציית היעד ומגדירים את מזהה דייר היעד לפני שקוראים ל-importUsers().

var authTo = targetApp.auth().tenantManager().authForTenant('tenant');

העברת משתמשים בין דיירים

העברת משתמשים בין דיירים דומה מאוד להעברת משתמשים בין פרויקטים, עם שני הבדלים עיקריים:

  1. תצטרכו למחוק את מזהה הדייר מהמשתמשים בדייר הישן לפני שתעלו אותם לדייר החדש. דילוג על השלב הזה יגרום לשגיאות של אי-התאמה של מזהה הדייר.

  2. מתקשרים אל admin.auth().tenantManager().authForTenant() כדי להגדיר את מזהה הדייר (tenant) בדיירי המקור והיעד.

    // Migrate from tenant1 to tenant2 in same project.
    var authFrom = admin.auth().tenantManager().authForTenant('tenant1');
    var authTo = admin.auth().tenantManager().authForTenant('tenant2');
    

שאר הקוד נשאר זהה.