问题描述
当我们上传新用户的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": [])