Migrar usuarios entre proyectos y grupos de usuarios

En este documento, se explica cómo migrar usuarios de un proyecto de Identity Platform existente a otro diferente. También se muestra cómo migrar usuarios de un proyecto que no sea de usuario a un grupo de usuarios o migrar usuarios entre grupos de usuarios.

Antes de comenzar

Configura claves de cuentas de servicio

Antes de migrar las cuentas de usuario, necesitas claves de cuenta de servicio para los proyectos de origen y de destino. Las cuentas de servicio deben tener al menos la función de editor de IAM (roles/editor) para acceder a los usuarios y sus contraseñas con hash del proyecto de origen. Consulta la documentación de IAM si deseas obtener más información para crear cuentas de servicio, otorgar permisos y obtener claves.

Después de descargar las claves, úsalas para crear una instancia de 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, aún puedes usar el código de ejemplo de este documento, pero deberás descargar todos los usuarios del proyecto de origen al sistema de almacenamiento primero, y luego, los puedes subir al proyecto de destino en una carga de trabajo independiente.

Migra usuarios entre proyectos

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

Se puede descargar o subir hasta 1,000 usuarios a la vez.

Para los usuarios de contraseñas, debes proporcionar la configuración del hash a fin de que genere un hash de contraseña. Para recuperar la configuración de hash, navega a la página Usuarios de Identity Platform en la consola de Google Cloud y 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 de SDK de Admin.

Migra usuarios a un grupo de usuarios

Migrar usuarios de un proyecto sin grupos de usuarios a un grupo de usuarios es casi el mismo que migrar a los usuarios entre proyectos.

Si suponemos que la instancia pertenece a un proyecto diferente que al proyecto de origen de Identity Platform, usa el mismo código que antes, pero llama a admin.auth().tenantManager().authForTenant() en la instancia de app de destino y establece el ID de grupos de usuarios de destino antes de llamar a importUsers().

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

Migra usuarios entre grupos de usuarios

La migración de usuarios entre grupos de usuarios es muy similar a la migración de usuarios entre proyectos, con dos diferencias clave:

  1. Deberás borrar el ID de grupos de usuarios de los usuarios del grupo anterior antes de subirlos al grupo de usuarios nuevo. Si omites este paso, se generarán errores de coincidencia de ID de grupos de usuarios.

  2. Llama a admin.auth().tenantManager().authForTenant() para establecer el ID del grupo en los grupos de usuarios de origen y 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.