Firebase中的批量身份验证更新交易

问题描述

当我们上传新用户的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)
}))

解决方法

如果您试图通过浏览器环境或非安全服务器环境使用admin 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": [])

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...