프로젝트와 테넌트 간 사용자 마이그레이션

이 문서에서는 기존 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()를 호출하여 대상 프로젝트에 업로드할 수 있습니다.

한 번에 최대 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');

테넌트 간 사용자 마이그레이션

테넌트 간 사용자 마이그레이션은 프로젝트 간의 사용자 마이그레이션과 매우 비슷하지만 다음과 같은 두 가지 주요 차이점이 있습니다.

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

나머지 코드는 동일합니다.