Migrer des utilisateurs entre des projets et des locataires

Ce document explique comment migrer des utilisateurs d'un projet Identity Platform existant vers un autre projet. Il montre également comment migrer des utilisateurs d'un projet non locataire vers un locataire, ou comment migrer des utilisateurs entre locataires.

Avant de commencer

Configurer des clés de compte de service

Avant de pouvoir migrer des comptes utilisateur, vous avez besoin de clés de compte de service pour les projets source et cible. Les comptes de service doivent au moins disposer du rôle d'éditeur IAM (roles/editor) pour accéder aux utilisateurs et à leurs mots de passe hachés à partir du projet source. Consultez la documentation IAM pour en savoir plus sur la création des comptes de service, l'octroi des autorisations et l'obtention des clés.

Après avoir téléchargé les clés, utilisez-les pour instancier deux instances 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 vos règles de contrôle des accès n'autorisent pas l'utilisation de plusieurs comptes de service dans une seule charge de travail, vous pouvez toujours utiliser l'exemple de code fourni dans ce document, mais vous devrez d'abord télécharger tous les utilisateurs du projet source vers un système de stockage, puis les importer vers le projet cible dans une charge de travail distincte.

Migrer des utilisateurs entre projets

Pour migrer des utilisateurs, appelez la méthode admin.auth().listUsers, qui renvoie une liste paginée d'utilisateurs. Vous pouvez ensuite appeler admin.auth().importUsers() pour importer les utilisateurs vers le projet cible.

Un maximum 1 000 utilisateurs peuvent être téléchargés ou importés à la fois.

Pour les utilisateurs de mots de passe, vous devez fournir la configuration de hachage pour le hachage du mot de passe. Vous pouvez récupérer la configuration du hachage en accédant à la page Utilisateurs d'Identity Platform dans la console Google Cloud, puis en cliquant sur Importer des utilisateurs.

L'exemple suivant montre comment migrer des utilisateurs :

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

Pour en savoir plus, consultez la documentation de référence de l'API du SDK Admin.

Migrer des utilisateurs vers un locataire

La migration d'utilisateurs d'un projet non locataire vers un locataire est presque identique à la migration d'utilisateurs entre projets.

En supposant que le locataire appartient à un projet différent du projet Identity Platform source, utilisez le même code qu'auparavant, mais appelez admin.auth().tenantManager().authForTenant() sur l'instance d'application cible et définissez l'ID de locataire cible avant d'appeler importUsers().

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

Migrer des utilisateurs entre locataires

La migration d'utilisateurs entre locataires est très similaire à la migration d'utilisateurs entre projets, à deux différences majeures près :

  1. Vous devez supprimer l'ID de locataire des utilisateurs de l'ancien locataire avant d'importer ces utilisateurs vers le nouveau locataire. Ignorer cette étape provoque des erreurs de non correspondance d'ID de locataire.

  2. Appelez admin.auth().tenantManager().authForTenant() pour définir l'ID de locataire sur les locataires source et cible.

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

Le reste du code est identique.