在项目和租户之间迁移用户

本文档介绍如何将用户从现有 Identity Platform 项目迁移到其他 Identity Platform 项目。此外,还介绍了如何将用户从非租户项目迁移到租户,或者在租户之间迁移用户。

准备工作

配置服务账号密钥

在迁移用户账号之前,您需要源项目和目标项目的服务账号密钥。服务账号必须至少被授予 IAM Editor 角色 (roles/editor),才能访问源项目中的用户以及经过哈希处理的密码。请参阅 IAM 文档,详细了解如何创建服务账号、授予权限和获取密钥。

下载密钥后,您可以使用它们来实例化两个 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();

如果您的访问权限控制政策不允许在单个工作负载中使用多个服务账号,您仍然可以使用本文中的示例代码,但需要先从源项目中把所有用户下载到存储系统,然后在另一个工作负载中将它们上传到目标项目。

在项目之间迁移用户

要迁移用户,请调用 admin.auth().listUsers 方法,该方法会返回分页的用户列表。然后,您可以调用 admin.auth().importUsers() 将它们上传到目标项目。

一次最多可下载或上传 1000 位用户。

对于密码用户,您需要提供哈希配置以对密码进行哈希处理。您可以检索哈希配置,方法是导航到 Google Cloud 控制台中的 Identity Platform 用户页面,然后点击导入用户

以下示例展示了如何迁移用户:

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

如需了解详情,请参阅 Admin SDK API 参考文档

将用户迁移到租户

将用户从非租户项目迁移到租户与在项目之间迁移用户几乎完全相同。

假设租户不属于源 Identity Platform 项目,请使用与之前相同的代码,但在目标应用实例上调用 admin.auth().tenantManager().authForTenant() 并设置目标租户 ID,然后再调用 importUsers()

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

在租户之间迁移用户

在租户之间迁移用户与在项目之间迁移用户的非常相似,但有两个主要区别:

  1. 您需要先删除旧租户的用户的租户 ID,然后再将其上传到新租户。跳过此步骤将导致租户 ID 不匹配错误。

  2. 调用 admin.auth().tenantManager().authForTenant() 以在源项目和目标租户上设置租户 ID。

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

其余代码是相同的。