微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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": [])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?