我在我的云函数中使用了firebase,在试图通过uid获取用户时,我在一些执行过程中随机地得到了错误。
let userRecord = await admin.auth().getUser(userId);
错误的详细信息如下:
{"error":{"code":400,"message":"TOO_MANY_ATTEMPTS_TRY_LATER",
"errors":[{ "message":"TOO_MANY_ATTEMPTS_TRY_LATER",
"domain":"global","reason":"invalid"}]
}
}
我的云功能在实时数据库write
上执行,可以为多个用户触发。在一次执行中总共有4个函数调用,第一个是上面的函数调用,第二个调用是通过uid
或email
再次获得用户,第三个调用是generateEmailVerificationLink
,最后一个调用是generatePasswordResetLink
。
我已经检查了auth文件中的利率限制,但是没有提到这些操作的利率限制。另外,REST中只提到了错误TOO_MANY_ATTEMPTS_TRY_LATER
,以便注册电子邮件密码。
如果此错误是由于速率限制造成的,那么如果这4个调用对于数据库写入所需的操作是必需的,那么我应该更改什么来防止此错误?
编辑:
我已经确定了实际的调用,它抛出了太多的尝试错误。当调用次数过多时,auth().generateEmailVerificationLink()
和auth().generatePasswordResetLink()
调用会抛出此错误。
我用100个迭代调用了这两个in循环,并等待承诺。第一次执行完成时没有任何错误,即200个请求。但是,第一次执行结束后立即启动第二次执行会引发太多尝试的错误。所以我觉得这两个电话是有限度的。现在,我试图减少这些调用,并重用链接信息。其他调用(如getUserByEmail
)运行良好。
let promises = [];
let auth = admin.auth();
let hrstart = process.hrtime()
for (let i = 0; i < 100; i++) {
promises.push(auth.getUserByEmail("user email"));
promises.push(auth.generateEmailVerificationLink("user email", {url: `https://app.firebaseapp.com/path`}));
promises.push(auth.generatePasswordResetLink("user email", {url: `https://app.firebaseapp.com/path`}));
}
Promise.all(promises)
.then(value => {
let hrend = process.hrtime(hrstart);
console.log(hrend);
// console.log(value)
});
发布于 2019-02-20 09:31:33
错误是在操作auth.createEmailLink
中特别出现的。该函数有以下限制:20 QPS /I.P地址,其中QPS是(每秒查询)。可以通过向Firebase提交用例来增加此限制。
在提交我的问题后,我从火力支援处得到了这个信息。
链接到我的github问题:https://github.com/firebase/firebase-admin-node/issues/458
发布于 2020-09-09 04:13:37
我当时还不到20 was,但却收到了这一例外。实际上,它总是在第二次尝试时抛出TOO_MANY_ATTEMPTS_TRY_LATER
异常。
结果是使用了FirebaseAuth.DefaultInstance
,而不是这样实例化一个静态实例:
在类定义中:private readonly FirebaseApp _firebase;
类构造函数:_firebase = FirebaseAdmin.FirebaseApp.Create();
职能:
var auth = FirebaseAuth.GetAuth(_firebase);
var actionCodeSettings = new ActionCodeSettings()
{
...
};
var link = await auth.GenerateEmailVerificationLinkAsync(email, actionCodeSettings);
return link;
发布于 2022-09-20 22:54:52
除了https://stackoverflow.com/a/54782967/5515861中提到的答案之外,如果您在尝试创建自定义电子邮件验证时发现了此问题,我还想添加另一个解决方案。
受此GitHub isssue https://github.com/firebase/firebase-admin-node/issues/458#issuecomment-933161448中的响应的启发。
我也看到了这个问题。我已经超过24小时没有运行admin.auth().generateEmailVerificationLink了(来自其他任何地方或任何用户),现在只调用了一次(部署在prod函数环境中),并得到了这个400 TOO_MANY_ATTEMPTS_TRY_LATER错误.但是,客户端也在同一时间调用了Firebase.auth.currentUser.sendEmailVerification()方法(明显不同的IP)。这会是问题吗?
我对这个问题的解决办法是增加一次重试。例如:
exports.sendWelcomeEmail = functions.runWith({failurePolicy: true}).auth.user().onCreate(async (user) => {
functions.logger.log("Running email...");
const email = user.email;
const displayName = user.displayName;
const link = await auth.generateEmailVerificationLink(email, {
url: 'https://mpj.io',
});
await sendWelcomeEmail(email, displayName, link);
});
.runWith({failurePolicy: true})
是关键。
这会给您一个错误,因为您的云函数/后端调用了generateEmailVerificationLink
,同时Firebase的默认行为也在执行,它被计算为20 and。这是一些奇怪的谷歌利率限制会计规则。所以我的解决方案就是增加一次重试。
缺点是,它调用了两次,所以如果调用是可计费的,那么它可能是两次计费。
https://stackoverflow.com/questions/54703649
复制相似问题