プロジェクト間およびテナント間でのユーザーの移行

このドキュメントでは、既存の Identity Platform プロジェクトから別のプロジェクトにユーザーを移行する方法について説明します。また、テナント以外のプロジェクトからテナントにユーザーを移行する方法や、テナント間でユーザーを移行する方法についても説明します。

始める前に

サービス アカウント キーの構成

ユーザー アカウントを移行する前に、移行元と移行先のプロジェクトの両方のサービス アカウント キーが必要です。サービス アカウントに少なくとも、ソース プロジェクトのユーザーとハッシュされたパスワードにアクセスするには、少なくとも IAM 編集者のロール(roles/editor)が付与されている必要があります。サービス アカウントの作成、権限の付与、キーの取得の詳細については、IAM のドキュメントをご覧ください。

キーをダウンロードしたら、そのキーを使用して 2 つの 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();

アクセス制御ポリシーで 1 つのワークロードで複数のサービス アカウントの使用を許可しない場合でも、このドキュメントのサンプルコードは使用できますが、ソース プロジェクトのすべてのユーザーをまずストレージ システムにダウンロードしてから、別のワークロードでターゲット プロジェクトにアップロードする必要があります。

プロジェクト間のユーザーの移行

ユーザーを移行するには、admin.auth().listUsers メソッドを呼び出します。このメソッドは、ページ分けされたユーザーのリストを返します。次に、admin.auth().importUsers() を呼び出してターゲット プロジェクトにユーザーをアップロードします。

一度に最大 1,000 ユーザーをダウンロード、またはアップロードできます。

パスワード ユーザーの場合は、パスワード ハッシュ用のハッシュ構成を指定する必要があります。ハッシュ構成を取得するには、Cloud Console で 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 リファレンスをご覧ください。

テナントへのユーザーの移行

非テナントのプロジェクトからテナントにユーザーを移行することは、プロジェクト間でユーザーを移行する場合とほぼ同じです。

テナントが移行元の Identity Platform プロジェクトとは異なるプロジェクトに属している場合、上記と同じコードを使用しますが、移行先のアプリ インスタンスで admin.auth().tenantManager().authForTenant() を呼び出して、importUsers() を呼び出す前に移行先のテナント ID を設定します。

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

テナント間のユーザーの移行

テナント間のユーザーの移行は、プロジェクト間のユーザーの移行とよく似ていますが、次の 2 つの重要な違いがあります。

  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');
    

残りのコードは同じです。