プロジェクト間およびテナント間でのユーザーの移行
このドキュメントでは、既存の 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 ユーザーをダウンロード、またはアップロードできます。
パスワード ユーザーの場合は、パスワード ハッシュ用のハッシュ構成を指定する必要があります。ハッシュ構成を取得するには、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 リファレンスをご覧ください。
テナントへのユーザーの移行
非テナントのプロジェクトからテナントにユーザーを移行することは、プロジェクト間でユーザーを移行する場合とほぼ同じです。
テナントが移行元の Identity Platform プロジェクトとは異なるプロジェクトに属している場合、上記と同じコードを使用しますが、移行先のアプリ インスタンスで admin.auth().tenantManager().authForTenant()
を呼び出して、importUsers()
を呼び出す前に移行先のテナント ID を設定します。
var authTo = targetApp.auth().tenantManager().authForTenant('tenant');
テナント間のユーザーの移行
テナント間のユーザーの移行は、プロジェクト間のユーザーの移行とよく似ていますが、次の 2 つの重要な違いがあります。
新しいテナントにアップロードする前に、古いテナントのユーザーからテナント ID を削除する必要があります。この手順をスキップすると、テナント ID の不一致エラーが発生します。
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');
残りのコードは同じです。