在專案和用戶群之間遷移使用者

本文說明如何將使用者從現有的 Identity Platform 專案遷移至其他專案。這篇文章也說明如何將使用者從非用戶群專案遷移至用戶群,或是在用戶群之間遷移使用者。

事前準備

設定服務帳戶金鑰

您必須先取得來源和目標專案的服務帳戶金鑰,才能遷移使用者帳戶。服務帳戶至少必須具備 IAM 編輯者角色 (roles/editor),才能存取來源專案中的使用者和經雜湊處理的密碼。如要進一步瞭解如何建立服務帳戶、授予權限和取得金鑰,請參閱 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() 將這些檔案上傳至目標專案。

一次最多可下載或上傳 1000 位使用者。

如果使用者使用密碼,您必須提供密碼雜湊的雜湊設定。如要擷取雜湊設定,請前往Google Cloud 主控台的「Identity Platform 使用者」頁面,然後按一下「匯入使用者」

以下範例說明如何遷移使用者:

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 參考資料

將使用者遷移至用戶群

將使用者從非租用戶專案遷移至租用戶,與在專案之間遷移使用者幾乎相同。

假設租用戶屬於與來源身分識別平台專案不同的專案,請使用與先前相同的程式碼,但在呼叫 importUsers() 之前,請在目標應用程式執行個體上呼叫 admin.auth().tenantManager().authForTenant(),並設定目標租用戶 ID。

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

在用戶群之間遷移使用者

在用戶群之間遷移使用者,與在專案之間遷移使用者非常相似,但有兩個主要差異:

  1. 您必須先從舊租用戶的使用者中刪除租用戶 ID,才能將使用者上傳至新租用戶。略過這個步驟會導致租用戶 ID 不相符錯誤。

  2. 呼叫 admin.auth().tenantManager().authForTenant() 來設定來源和目標租用戶的租用戶 ID。

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

程式碼的其餘部分則不受影響。