프로젝트와 테넌트 간 사용자 마이그레이션
이 문서에서는 기존 Identity Platform 프로젝트에서 사용자를 다른 프로젝트로 마이그레이션하는 방법을 설명합니다. 또한 테넌트가 아닌 프로젝트에서 테넌트로 사용자를 마이그레이션하거나 테넌트 간에 사용자를 마이그레이션하는 방법도 보여줍니다.
시작하기 전에
- Admin SDK를 설치합니다.
서비스 계정 키 구성
사용자 계정을 마이그레이션하려면 소스 및 대상 프로젝트 모두에 대한 서비스 계정 키가 필요합니다. 서비스 계정에는 소스 프로젝트에서 사용자 및 해시된 비밀번호에 액세스할 수 있도록 최소한 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()
를 호출하여 대상 프로젝트에 업로드할 수 있습니다.
한 번에 최대 1,000명의 사용자를 다운로드하거나 업로드할 수 있습니다.
비밀번호 사용자의 경우 비밀번호 해싱을 위한 해시 구성을 제공해야 합니다. Google 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');
테넌트 간 사용자 마이그레이션
테넌트 간 사용자 마이그레이션은 프로젝트 간의 사용자 마이그레이션과 매우 비슷하지만 다음과 같은 두 가지 주요 차이점이 있습니다.
새 테넌트에 업로드하기 전에 이전 테넌트의 사용자에서 테넌트 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');
나머지 코드는 동일합니다.