我在云函数中使用firebase admin sdk,尝试通过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个auth函数调用,第一个是上述调用,第二个调用是通过uid
或email
再次获得用户,第三个调用是generateEmailVerificationLink
,最后一个调用是generatePasswordResetLink
。
我已经检查了auth的速率限制,但没有提及这些操作的速率限制。此外,错误TOO_MANY_ATTEMPTS_TRY_LATER
仅在REST API中提到,用于使用电子邮件密码进行注册。
如果此错误是由于速率限制引起的,那么鉴于这4个调用对于数据库写入所需的操作是必需的,我应如何更改以防止此错误?
编辑:
我已经确定了引发过多尝试错误的实际调用。多次调用时,调用auth().generateEmailVerificationLink()
和auth().generatePasswordResetLink()
会引发此错误。
我以100次迭代的方式调用了这两个循环,并等待了promises。第一次执行完成,没有任何错误,即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)
});
答案 0 :(得分:0)
该错误专门发生在操作auth.createEmailLink
中。此功能有以下限制: 20QPS / IP地址,其中QPS是(每秒查询)。可以通过将用例提交给Firebase来增加此限制。
提交问题后,我从firebase支持部门获得了此信息。
链接到我的github问题:https://github.com/firebase/firebase-admin-node/issues/458
答案 1 :(得分:0)
我目前的速度不到20QPS,但是正在接收此异常。实际上,它总是在第二次尝试时抛出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;