Memigrasikan pengguna antara project dan tenant

Dokumen ini menjelaskan cara memigrasikan pengguna dari project Identity Platform yang ada ke project lain. Bagian ini juga menunjukkan cara memigrasikan pengguna dari project non-tenant ke tenant, atau memigrasikan pengguna antar-tenant.

Sebelum memulai

Mengonfigurasi kunci akun layanan

Sebelum dapat memigrasikan akun pengguna, Anda memerlukan kunci akun layanan untuk project sumber dan target. Akun layanan harus diberi setidaknya peran IAM Editor (roles/editor) untuk mengakses pengguna dan sandi yang di-hash dari project sumber. Baca dokumentasi IAM untuk mempelajari lebih lanjut cara membuat akun layanan, memberikan izin, dan mendapatkan kunci.

Setelah mendownload kunci, gunakan kunci tersebut untuk membuat instance dua instance 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();

Jika kebijakan kontrol akses Anda tidak mengizinkan penggunaan beberapa akun layanan dalam satu beban kerja, Anda masih dapat menggunakan kode contoh dari dokumen ini. Namun, Anda harus mendownload semua pengguna dari project sumber ke sistem penyimpanan terlebih dahulu, lalu menguploadnya ke project target dalam beban kerja terpisah.

Memigrasikan pengguna antar-project

Untuk memigrasikan pengguna, panggil metode admin.auth().listUsers, yang menampilkan daftar pengguna yang telah dipaginasi. Selanjutnya, Anda dapat memanggil admin.auth().importUsers() untuk menguploadnya ke project target.

Maksimum 1.000 pengguna dapat didownload atau diupload sekaligus.

Untuk pengguna sandi, Anda perlu menyediakan konfigurasi hash untuk hashing sandi. Anda dapat mengambil konfigurasi hash dengan membuka halaman Identity Platform Users di Konsol Google Cloud, lalu mengklik Import Users.

Contoh berikut menunjukkan cara memigrasikan pengguna:

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

Untuk informasi selengkapnya, lihat referensi Admin SDK API.

Memigrasikan pengguna ke tenant

Memigrasikan pengguna dari project non-tenant ke tenant hampir sama persis dengan memigrasikan pengguna antar-project.

Dengan asumsi tenant termasuk dalam project yang berbeda dengan project Platform Identitas sumber, gunakan kode yang sama seperti sebelumnya, tetapi panggil admin.auth().tenantManager().authForTenant() pada instance aplikasi target dan tetapkan ID tenant target sebelum memanggil importUsers().

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

Memigrasikan pengguna antar-tenant

Memigrasikan pengguna antar-tenant sangat mirip dengan yang memigrasikan pengguna antar-project, dengan dua perbedaan utama:

  1. Anda harus menghapus ID tenant dari pengguna tenant lama sebelum menguploadnya ke tenant baru. Jika langkah ini dilewati, error ketidakcocokan ID tenant akan terjadi.

  2. Panggil admin.auth().tenantManager().authForTenant() untuk menetapkan ID tenant pada tenant sumber dan target.

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

Kode lainnya tetap sama.