Migrar utilizadores entre projetos e inquilinos

Este documento explica como migrar utilizadores de um projeto do Identity Platform existente para um projeto diferente. Também mostra como migrar utilizadores de um projeto não pertencente a um inquilino para um inquilino ou migrar utilizadores entre inquilinos.

Antes de começar

Configurar chaves de contas de serviço

Antes de poder migrar contas de utilizador, precisa de chaves de contas de serviço para os projetos de origem e de destino. As contas de serviço têm de receber, pelo menos, a função de editor do IAM (roles/editor) para aceder aos utilizadores e às respetivas palavras-passe com hash do projeto de origem. Consulte a documentação do IAM para saber mais sobre como criar contas de serviço, conceder autorizações e obter chaves.

Depois de transferir as chaves, use-as para instanciar duas instâncias 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 suas políticas de controlo de acesso não permitirem a utilização de várias contas de serviço numa única carga de trabalho, pode continuar a usar o código de exemplo deste documento, mas tem de transferir todos os utilizadores do projeto de origem para um sistema de armazenamento primeiro e, em seguida, carregá-los para o projeto de destino numa carga de trabalho separada.

Migrar utilizadores entre projetos

Para migrar utilizadores, chame o método admin.auth().listUsers, que devolve uma lista paginada de utilizadores. Em seguida, pode chamar admin.auth().importUsers() para carregá-los para o projeto de destino.

Pode transferir ou carregar um máximo de 1000 utilizadores de cada vez.

Para utilizadores de palavras-passe, tem de fornecer a configuração de hash para o hash de palavras-passe. Pode obter a configuração de hash navegando para a página Utilizadores da Identity Platform naGoogle Cloud consola e, de seguida, clicando em Importar utilizadores.

O exemplo seguinte mostra como migrar utilizadores:

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.

Migrar utilizadores para um inquilino

A migração de utilizadores de um projeto não pertencente a um inquilino para um projeto pertencente a um inquilino é quase exatamente igual à migração de utilizadores entre projetos.

Partindo do princípio de que o inquilino pertence a um projeto diferente do projeto do Identity Platform de origem, use o mesmo código que antes, mas chame admin.auth().tenantManager().authForTenant() na instância da app de destino e defina o ID do inquilino de destino antes de chamar importUsers().

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

Migrar utilizadores entre inquilinos

A migração de utilizadores entre inquilinos é muito semelhante à migração de utilizadores entre projetos, com duas diferenças principais:

  1. Tem de eliminar o ID do inquilino dos utilizadores do inquilino antigo antes de os carregar para o novo inquilino. Se ignorar este passo, vai receber erros de incompatibilidade do ID do inquilino.

  2. Chame admin.auth().tenantManager().authForTenant() para definir o ID do inquilino nos inquilinos de origem e de destino.

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

O resto do código é igual.