在專案和用戶群之間遷移使用者
本文說明如何將使用者從現有的 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');
在用戶群之間遷移使用者
在用戶群之間遷移使用者,與在專案之間遷移使用者非常相似,但有兩個主要差異:
您必須先從舊租用戶的使用者中刪除租用戶 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');
程式碼的其餘部分則不受影響。