Como migrar usuários entre projetos e locatários

Neste documento, explicamos como migrar usuários de um projeto atual do Identity Platform para outro. Ela também mostra como migrar usuários de um projeto não locatário para um locatário ou migrar usuários entre locatários.

Antes de começar

Como configurar chaves de conta de serviço

Antes de migrar contas de usuário, você precisa de chaves de conta de serviço para os projetos de origem e de destino. As contas de serviço precisam receber pelo menos o papel de editor do IAM (roles/editor) para acessar os usuários e as senhas em hash do projeto de origem. Consulte a documentação do IAM para saber mais sobre como criar contas de serviço, conceder permissões e conseguir chaves.

Depois de fazer o download das chaves, use-as para instanciar duas instâncias de 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();

Se as políticas de controle de acesso não permitirem o uso de várias contas de serviço em uma única carga de trabalho, ainda será possível usar o código de exemplo deste documento, mas você precisará fazer o download de todos os usuários do projeto de origem primeiro para um sistema de armazenamento. Depois, faça o upload deles para o projeto de destino em uma carga de trabalho separada.

Como migrar usuários entre projetos

Para migrar usuários, chame o método admin.auth().listUsers, que retorna uma lista paginada de usuários. Em seguida, chame admin.auth().importUsers() para fazer upload deles para o projeto de destino.

É possível fazer o download ou upload de, no máximo, 1.000 usuários por vez.

Para usuários de senha, você precisa fornecer a configuração de hash para o hash de senha. Para recuperar a configuração de hash, acesse a página Usuários do Identity Platform no Console do Google Cloud e clique em Importar usuários.

O exemplo a seguir mostra como migrar usuários:

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

Para mais informações, consulte a referência da API Admin SDK.

Como migrar usuários para um locatário

A migração de usuários de um projeto sem locatário para um locatário é quase igual à migração de usuários entre projetos.

Supondo que o locatário pertença a um projeto de origem do Identity Platform, use o mesmo código de antes, mas chame admin.auth().tenantManager().authForTenant() na instância do app de destino e defina o ID de locatário de destino antes de chamar importUsers().

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

Como migrar usuários entre locatários

A migração de usuários entre locatários é muito semelhante à migração de usuários entre projetos, com duas diferenças principais:

  1. Você precisará excluir o ID de locatário dos usuários do locatário antigo antes de fazer o upload para o novo locatário. Ignorar esta etapa resultará em erros de incompatibilidade com o ID de locatário.

  2. Chame admin.auth().tenantManager().authForTenant() para definir o ID do locatário nos locatários de origem e destino.

    // Migrate from tenant1 to tenant2 in same project.
    var authFrom = admin.auth().tenantManager().authForTenant('tenant1');
    var authTo = admin.auth().tenantManager().authForTenant('tenant2');
    

O restante do código é o mesmo.