【问题标题】:Bulk Auth update transaction in FirebaseFirebase 中的批量身份验证更新事务
【发布时间】:2021-01-17 08:21:12
【问题描述】:

当我们上传新用户的 CSV 文件时,我们希望使用自定义声明为该用户创建一个 Firebase 帐户。目前,我们在尝试上传包含许多用户的 CSV 时超出了配额限制。不完全确定这是哪个配额限制,但怀疑可能是以下 -

  • 新帐户创建 100 个帐户/IP 地址/小时

错误信息:

超过更新帐户信息的配额。

我们目前使用createUser,然后是setCustomUserClaims,在Promise.all() 中同时创建每个用户。这托管在云功能中。有没有办法以批量操作的形式执行此操作,这样我们就不会达到配额限制?

调查importUsers,似乎绕过了对电子邮件地址和uid重复的检查;维护我们数据的完整性至关重要。

  • 此操作针对批量导入进行了优化,将忽略对 uid 的检查,
  • email 和其他可能导致重复的标识符唯一性。

有什么优雅的解决方案吗?

await Promise.all(items.map(async user => {
  const userParams = {
    displayName: `${user.firstNames} ${user.lastNames}`,
    phoneNumber: user.mobileNumber,
    email: user.email || ''
  }

  this.logger.debug({ user, role }, 'Creating a new firebase user')
  const member = await this.auth.createUser(userParams)

  this.logger.debug({ member }, 'Attempting to set custom claims for user')
  await this.auth.setCustomUserClaims(member.uid, { role })

  const resetOptions = {
    url: `https://some-url`
  }

  const resetLink = await this.auth.generatePasswordResetLink(user.email, resetOptions)
  const passwordResetData = {
    role,
    link: resetLink,
    firstNames: user.firstNames,
    companyName: 'company name'
  }

  this.logger.debug({ user, passwordResetData }, 'Sending password reset link to user')
  return await this.notificationService.sendPasswordResetLink([user.email], passwordResetData)
}))

【问题讨论】:

  • 请编辑问题以明确您达到的限制。如果有错误消息,请分享其确切内容。如果你也展示你正在使用的代码,它也会有所帮助。

标签: javascript node.js firebase firebase-authentication firebase-admin


【解决方案1】:

如果您尝试在浏览器环境或非安全服务器环境中使用管理 SDK,那就是您遇到了限制。但是,如果您从安全环境中运行它,则适用以下情况:

Firebase Admin SDK 提供了一个 API,用于管理具有提升权限的 Firebase 身份验证用户。管理员用户管理 API 使您能够以编程方式从安全的服务器环境中完成以下任务:

  • 在没有任何限制或速率限制的情况下创建新用户。

https://firebase.google.com/docs/auth/admin/manage-users

可能的解决方案

最简单的方法是使用cloud function。它们是无服务器功能,您可以通过 https 或在您的应用程序中调用它们。 你可以创建一个callable function

exports.createUsers = functions.https.onCall((data, context) => {
  const users = data.user
  // ...
});

并通过调用在您的前端传递数据:

functions.httpsCallable("createUsers").call(["users": [])

【讨论】:

  • 目前,这是在云功能中运行的。我相信限制是专门针对 setCustomUserClaims 调用的,但我可能错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 2017-07-25
  • 2020-09-25
相关资源
最近更新 更多