Migrazione degli utenti tra progetti e tenant

Questo documento spiega come eseguire la migrazione degli utenti da un progetto Identity Platform esistente a un progetto diverso. Mostra inoltre come eseguire la migrazione degli utenti da un progetto non-tenant a un tenant o come eseguire la migrazione degli utenti tra tenant.

Prima di iniziare

Configurazione delle chiavi degli account di servizio

Prima di poter eseguire la migrazione degli account utente, devi disporre delle chiavi degli account di servizio per i progetti di origine e di destinazione. Agli account di servizio deve essere concesso almeno il ruolo IAM Editor (roles/editor) per accedere agli utenti e alle relative password sottoposte ad hashing del progetto di origine. Consulta la documentazione IAM per ulteriori informazioni sulla creazione di account di servizio, sulla concessione delle autorizzazioni e sull'ottenimento di chiavi.

Dopo aver scaricato le chiavi, utilizzale per creare un'istanza di due istanze 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 i tuoi criteri di controllo dell'accesso non consentono l'utilizzo di più account di servizio in un singolo carico di lavoro, puoi comunque utilizzare il codice di esempio di questo documento, ma devi prima scaricare tutti gli utenti dal progetto di origine in un sistema di archiviazione, quindi caricarli nel progetto di destinazione in un carico di lavoro separato.

Migrazione degli utenti tra progetti

Per eseguire la migrazione degli utenti, chiama il metodo admin.auth().listUsers, che restituisce un elenco impaginato di utenti. Puoi quindi chiamare admin.auth().importUsers() per caricarli nel progetto di destinazione.

È possibile scaricare o caricare un massimo di 1000 utenti alla volta.

Per gli utenti che utilizzano una password, devi fornire la configurazione di hash per l'hashing delle password. Per recuperare la configurazione dell'hash, accedi alla pagina Utenti di Identity Platform nella console Google Cloud e fai clic su Importa utenti.

L'esempio seguente mostra come eseguire la migrazione degli utenti:

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

Per ulteriori informazioni, consulta il riferimento sull'API SDK Admin.

Migrazione degli utenti a un tenant

La migrazione degli utenti da un progetto non tenant a un tenant è quasi esattamente la stessa della migrazione degli utenti da un progetto all'altro.

Supponendo che il tenant appartenga a un progetto diverso da quello del progetto Identity Platform di origine, utilizza lo stesso codice di prima, ma chiama admin.auth().tenantManager().authForTenant() sull'istanza dell'app di destinazione e imposta l'ID tenant di destinazione prima di chiamare importUsers().

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

Migrazione degli utenti tra tenant

La migrazione degli utenti tra tenant è molto simile alla migrazione degli utenti tra progetti, con due differenze fondamentali:

  1. Devi eliminare l'ID tenant dagli utenti del tenant precedente prima di caricarli nel nuovo tenant. Se salti questo passaggio, si verificheranno errori di mancata corrispondenza dell'ID tenant.

  2. Richiama admin.auth().tenantManager().authForTenant() per impostare l'ID tenant sui tenant di origine e di destinazione.

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

Il resto del codice è lo stesso.