首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Firebase Admin错误"TOO_MANY_ATTEMPTS_TRY_LATER“

Firebase Admin错误"TOO_MANY_ATTEMPTS_TRY_LATER“
EN

Stack Overflow用户
提问于 2019-02-15 06:20:27
回答 3查看 7.3K关注 0票数 2

我在我的云函数中使用了firebase,在试图通过uid获取用户时,我在一些执行过程中随机地得到了错误。

let userRecord = await admin.auth().getUser(userId);

错误的详细信息如下:

代码语言:javascript
运行
复制
{"error":{"code":400,"message":"TOO_MANY_ATTEMPTS_TRY_LATER",
 "errors":[{ "message":"TOO_MANY_ATTEMPTS_TRY_LATER",
             "domain":"global","reason":"invalid"}]
 }
}

我的云功能在实时数据库write上执行,可以为多个用户触发。在一次执行中总共有4个函数调用,第一个是上面的函数调用,第二个调用是通过uidemail再次获得用户,第三个调用是generateEmailVerificationLink,最后一个调用是generatePasswordResetLink

我已经检查了auth文件中的利率限制,但是没有提到这些操作的利率限制。另外,REST中只提到了错误TOO_MANY_ATTEMPTS_TRY_LATER,以便注册电子邮件密码。

如果此错误是由于速率限制造成的,那么如果这4个调用对于数据库写入所需的操作是必需的,那么我应该更改什么来防止此错误?

编辑:

我已经确定了实际的调用,它抛出了太多的尝试错误。当调用次数过多时,auth().generateEmailVerificationLink()auth().generatePasswordResetLink()调用会抛出此错误。

我用100个迭代调用了这两个in循环,并等待承诺。第一次执行完成时没有任何错误,即200个请求。但是,第一次执行结束后立即启动第二次执行会引发太多尝试的错误。所以我觉得这两个电话是有限度的。现在,我试图减少这些调用,并重用链接信息。其他调用(如getUserByEmail )运行良好。

代码语言:javascript
运行
复制
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)
    });
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-20 09:31:33

错误是在操作auth.createEmailLink中特别出现的。该函数有以下限制:20 QPS /I.P地址,其中QPS是(每秒查询)。可以通过向Firebase提交用例来增加此限制。

在提交我的问题后,我从火力支援处得到了这个信息。

链接到我的github问题:https://github.com/firebase/firebase-admin-node/issues/458

票数 2
EN

Stack Overflow用户

发布于 2020-09-09 04:13:37

我当时还不到20 was,但却收到了这一例外。实际上,它总是在第二次尝试时抛出TOO_MANY_ATTEMPTS_TRY_LATER异常。

结果是使用了FirebaseAuth.DefaultInstance,而不是这样实例化一个静态实例:

在类定义中:private readonly FirebaseApp _firebase;

类构造函数:_firebase = FirebaseAdmin.FirebaseApp.Create();

职能:

代码语言:javascript
运行
复制
var auth = FirebaseAuth.GetAuth(_firebase);
var actionCodeSettings = new ActionCodeSettings()
{
    ...
};
var link = await auth.GenerateEmailVerificationLinkAsync(email, actionCodeSettings);
return link;
票数 1
EN

Stack Overflow用户

发布于 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)。这会是问题吗?

我对这个问题的解决办法是增加一次重试。例如:

代码语言:javascript
运行
复制
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。这是一些奇怪的谷歌利率限制会计规则。所以我的解决方案就是增加一次重试。

缺点是,它调用了两次,所以如果调用是可计费的,那么它可能是两次计费。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54703649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档