导入用户

Firebase Admin SDK 为具有特权的管理员提供了 auth.importUsers() API,供其将用户批量导入至 Firebase 身份验证。尽管 Firebase CLI 中也有此功能,但 Admin SDK 允许您以编程方式从外部身份验证系统或其他 Firebase 项目上传现有用户,而无需创建过渡用的 CSV 或 JSON 文件。

用户导入 API 具有以下优势:

  • 能够从使用不同密码哈希算法的外部身份验证系统迁移用户。
  • 能够从其他 Firebase 项目迁移用户。
  • 经过优化,能够快速而高效地执行批量导入操作。此操作在处理用户时不会核实 uidemailphoneNumber 或其他标识符重复情况。
  • 能够迁移现有 OAuth 用户或创建新的 OAuth 用户(Google、Facebook 等)。
  • 能够直接批量导入使用自定义声明的用户。

用法

一次 API 调用最多可以导入 1000 名用户。请注意,此操作针对速度进行了优化,并且不会核实 uidemailphoneNumber 和其他唯一标识符重复情况。因此,在您使用此 API 时,必须确保独一无二的字段不会出现重复。

// Up to 1000 users can be imported at once.
var userImportRecords = [
  {
    uid: 'uid1',
    email: 'user1@example.com',
    passwordHash: Buffer.from('passwordHash1'),
    passwordSalt: Buffer.from('salt1')
  },
  {
    uid: 'uid2',
    email: 'user2@example.com',
    passwordHash: Buffer.from('passwordHash2'),
    passwordSalt: Buffer.from('salt2')
  },
  ...
];

此示例中指定了哈希选项,目的是在用户下次尝试通过 Firebase 身份验证登录时,帮助 Firebase 安全地对这些用户进行身份验证。成功登录后,Firebase 会使用内部 Firebase 哈希算法重新对用户密码进行哈希处理。详细了解下面每种算法的必填字段。

即使发生与特定用户相关的错误,Firebase 身份验证也会尝试上传所提供的全部用户的完整列表。此操作会返回一个结果,其中对导入成功和导入失败的情况进行了总结。每次用户导入失败都会返回错误详情。

var userImportOptions = {
  hash: {
    algorithm: 'HMAC_SHA256',
    key: Buffer.from('secretKey')
  }
};

admin.auth().importUsers(userImportRecords, userImportOptions)
  .then(function(userImportResult) {
     // The number of successful imports is determined via: userImportResult.successCount.
     // The number of failed imports is determined via: userImportResult.failureCount.
     // To get the error details.
     userImportResult.forEach(function(indexedError) {
        // The corresponding user that failed to upload.
        console.log(userImportRecords[indexedError.index].uid +' failed to import',
            indexedError.error);
     });
  })
  .catch(function(error) {
    // Some unrecoverable error occurred that prevented the operation from running.
  });

如果不需要对密码进行哈希处理(电话号码、自定义令牌用户、OAuth 用户等),则无需提供哈希选项。

导入使用 HMAC 哈希密码的用户

HMAC 哈希算法包括:HMAC_MD5HMAC_SHA1HMAC_SHA256HMAC_SHA512。对于这些哈希算法,您必须提供哈希签名者密钥。

admin.auth().importUsers([{
  uid: 'some-uid',
  email: 'user@example.com',
  // Must be provided in a byte buffer.
  passwordHash: Buffer.from('password-hash'),
  // Must be provided in a byte buffer.
  passwordSalt: Buffer.from('salt')
}], {
  hash: {
    algorithm: 'HMAC_SHA256',
    // Must be provided in a byte buffer.
    key: Buffer.from('secret')
  }
}).then(function(results) {
  results.error.forEach(function(indexedError) {
    console.log('Error importing user ' + indexedError.index.toString(), error);
  });
}).catch(function(error) {
  console.log('Error importing users:', error);
});

导入使用 MD5、SHA 和 PBKDF 哈希密码的用户

MD5、SHA 和 PBKDF 哈希算法包括:MD5SHA1SHA256SHA512BPKDF_SHA1PBKDF2_SHA256。对于这些哈希算法,您必须提供对密码进行哈希处理的轮数(介于 0 到 120000 之间)。

admin.auth().importUsers([{
  uid: 'some-uid',
  email: 'user@example.com',
  // Must be provided in a byte buffer.
  passwordHash: Buffer.from('password-hash'),
  // Must be provided in a byte buffer.
  passwordSalt: Buffer.from('salt')
}], {
  hash: {
    algorithm: 'PBKDF2_SHA256',
    rounds: 100000
  }
}).then(function(results) {
  results.error.forEach(function(indexedError) {
    console.log('Error importing user ' + indexedError.index.toString(), error);
  });
}).catch(function(error) {
  console.log('Error importing users:', error);
});

导入使用标准 SCRYPT 哈希密码的用户

Firebase 身份验证支持标准 SCRYPT 算法以及内部修订版本。对于标准 SCRYPT 算法,需要提供以下哈希参数:

  • memoryCost:哈希算法的 CPU/内存开销。
  • parallelization:哈希算法的并行化。
  • blockSize:哈希算法的块大小(通常为 8)。
  • derivedKeyLength:哈希算法的派生密钥长度。
admin.auth().importUsers([{
  uid: 'some-uid',
  email: 'user@example.com',
  // Must be provided in a byte buffer.
  passwordHash: Buffer.from('password-hash'),
  // Must be provided in a byte buffer.
  passwordSalt: Buffer.from('salt')
}], {
  hash: {
    algorithm: 'STANDARD_SCRYPT',
    memoryCost: 1024,
    parallelization: 16,
    blockSize: 8,
    derivedKeyLength: 64
  }
}).then(function(results) {
  results.error.forEach(function(indexedError) {
    console.log('Error importing user ' + indexedError.index.toString(), error);
  });
}).catch(function(error) {
  console.log('Error importing users:', error);
});

导入使用 BCRYPT 哈希密码的用户

对于 BCRYPT 哈希密码,既不需要额外的哈希参数,也不需要每个用户的密码盐。

admin.auth().importUsers([{
  uid: 'some-uid',
  email: 'user@example.com',
  // Must be provided in a byte buffer.
  passwordHash: Buffer.from('password-hash')
}], {
  hash: {
    algorithm: 'BCRYPT'
  }
}).then(function(results) {
  results.error.forEach(function(indexedError) {
    console.log('Error importing user ' + indexedError.index.toString(), error);
  });
}).catch(function(error) {
  console.log('Error importing users:', error);
});

导入使用 Firebase SCRYPT 哈希密码的用户

如果是从其他现有 Firebase 项目迁移用户,那么以下做法很有用:导入用 Firebase 修订版 SCRYPT 哈希算法进行哈希处理的密码。为此,需要为原始项目确定内部参数。

Firebase 会为每个 Firebase 项目生成独一无二的密码哈希参数。要访问这些参数,请转至 Firebase 控制台中的用户标签,然后从用户表格列表右上角的下拉列表中选择密码哈希参数

为此算法构建哈希选项所需的参数包括:

  • key:通常以 base64 编码形式提供的签名者密钥。
  • saltSeparator:通常以 base64 编码形式提供的盐分隔符(可选)。
  • rounds:对密码进行哈希处理的轮数。
  • memoryCost:此算法所需的内存开销。
admin.auth().importUsers([{
  uid: 'some-uid',
  email: 'user@example.com',
  // Must be provided in a byte buffer.
  passwordHash: Buffer.from('base64-password-hash', 'base64'),
  // Must be provided in a byte buffer.
  passwordSalt: Buffer.from('base64-salt', 'base64')
}], {
  hash: {
    algorithm: 'SCRYPT',
    // All the parameters below can be obtained from the Firebase Console's users section.
    // Must be provided in a byte buffer.
    key: Buffer.from('base64-secret', 'base64'),
    saltSeparator: Buffer.from('base64SaltSeparator', 'base64'),
    rounds: 8,
    memoryCost: 14
  }
}).then(function(results) {
  results.error.forEach(function(indexedError) {
    console.log('Error importing user ' + indexedError.index.toString(), error);
  });
}).catch(function(error) {
  console.log('Error importing users:', error);
});

导入没有密码的用户

您可以导入没有密码的用户。对于没有密码的用户,可以将他们与使用 OAuth 提供方、自定义声明和电话号码等的用户合并在一起导入。

admin.auth().importUsers([{
  uid: 'some-uid',
  displayName: 'John Doe',
  email: 'johndoe@gmail.com',
  photoURL: 'http://www.example.com/12345678/photo.png',
  emailVerified: true,
  phoneNumber: '+11234567890',
  // Set this user as admin.
  customClaims: {admin: true},
  // User with Google provider.
  providerData: [{
     uid: 'google-uid',
     email: 'johndoe@gmail.com',
     displayName: 'John Doe',
     photoURL: 'http://www.example.com/12345678/photo.png',
     providerId: 'google.com'
  }]
}]).then(function(results) {
  results.error.forEach(function(indexedError) {
    console.log('Error importing user ' + indexedError.index.toString(), error);
  });
}).catch(function(error) {
  console.log('Error importing users:', error);
});

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面