Firebase Admin SDK身份验证错误“ TOO_MANY_ATTEMPTS_TRY_LATER”

时间:2019-02-15 06:20:27

标签: firebase firebase-authentication firebase-admin

我在云函数中使用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函数调用,第一个是上述调用,第二个调用是通过uidemail再次获得用户,第三个调用是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)
    });

2 个答案:

答案 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;