Migrar usuarios entre proyectos y propietarios

En este documento se explica cómo migrar usuarios de un proyecto de Identity Platform a otro. También se muestra cómo migrar usuarios de un proyecto sin propietario a un propietario o cómo migrar usuarios entre propietarios.

Antes de empezar

Configurar claves de cuenta de servicio

Para migrar cuentas de usuario, necesitas claves de cuenta de servicio tanto para el proyecto de origen como para el de destino. Las cuentas de servicio deben tener al menos el rol Editor de gestión de identidades y accesos (roles/editor) para acceder a los usuarios y sus contraseñas cifradas del proyecto de origen. Consulta la documentación de gestión de identidades y accesos para obtener más información sobre cómo crear cuentas de servicio, conceder permisos y obtener claves.

Después de descargar las claves, úsalas para crear dos instancias 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();

Si tus políticas de control de acceso no permiten el uso de varias cuentas de servicio en una sola carga de trabajo, puedes usar el código de ejemplo de este documento, pero primero tendrás que descargar todos los usuarios del proyecto de origen en un sistema de almacenamiento y, a continuación, subirlos al proyecto de destino en una carga de trabajo independiente.

Migrar usuarios entre proyectos

Para migrar usuarios, llama al método admin.auth().listUsers, que devuelve una lista paginada de usuarios. Después, puedes llamar a admin.auth().importUsers() para subirlos al proyecto de destino.

Se pueden descargar o subir un máximo de 1000 usuarios a la vez.

En el caso de los usuarios con contraseña, debes proporcionar la configuración del hash para el cifrado de contraseñas. Para obtener la configuración del hash, ve a la página Usuarios de Identity Platform en laGoogle Cloud consola y, a continuación, haz clic en Importar usuarios.

En el siguiente ejemplo se muestra cómo migrar usuarios:

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 obtener más información, consulta la referencia de la API del SDK de administrador.

Migrar usuarios a un arrendatario

Migrar usuarios de un proyecto que no tiene propietario a uno que sí lo tiene es casi exactamente igual que migrar usuarios entre proyectos.

Si el arrendatario pertenece a un proyecto distinto del proyecto de Identity Platform de origen, usa el mismo código que antes, pero llama a admin.auth().tenantManager().authForTenant() en la instancia de la aplicación de destino y define el ID del arrendatario de destino antes de llamar a importUsers().

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

Migrar usuarios entre propietarios

Migrar usuarios entre propietarios es muy similar a migrar usuarios entre proyectos, con dos diferencias clave:

  1. Tendrás que eliminar el ID de inquilino de los usuarios del inquilino antiguo antes de subirlos al nuevo. Si se omite este paso, se producirán errores de discrepancia de ID de arrendatario.

  2. Llama a admin.auth().tenantManager().authForTenant() para definir el ID de arrendatario en los arrendatarios de origen y de destino.

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

El resto del código es el mismo.