【问题标题】:Firebase Admin SDK Auth error "TOO_MANY_ATTEMPTS_TRY_LATER"Firebase Admin SDK 身份验证错误“TOO_MANY_ATTEMPTS_TRY_LATER”
【发布时间】:2019-07-09 06:16:58
【问题描述】:

我在我的云功能中使用 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 个身份验证函数调用,第一个是上面的那个,第二个调用是通过uid 或email 再次获取用户,第三个调用是generateEmailVerificationLink,最后一个调用是generatePasswordResetLink。

我已经检查了 auth 文档中的速率限制,但没有提及这些操作的速率限制。此外,错误TOO_MANY_ATTEMPTS_TRY_LATER 仅在 REST API 中提及,用于使用电子邮件密码注册。

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

编辑:

我已经确定了引发太多尝试错误的实际调用。调用auth().generateEmailVerificationLink() 和auth().generatePasswordResetLink() 调用次数过多时会引发此错误。

我用 100 次迭代循环调用这两个并等待承诺。第一次执行完成时没有任何错误,即 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)
    });

【问题讨论】:

  • 你提到有四个电话。请出示整批代码。
  • 嗨 Umar,您能否提供有关哪个 API 调用引发错误的信息?是第四次打电话给generatePasswordResetLink吗?
  • 我目前正在更多地调查这个问题,在 2 个不同的 firebase 函数执行中调用了 auth 操作,所以我会得到更多信息。关于错误,它出现在第一次 getUser 调用中。我认为第一次执行到达第 3 次或第 4 次调用,然后第二次执行在 getUser 调用上失败,可能是因为执行是并行的。
  • 我会在必要时提供更多信息和代码。
  • 您还需要优化您的通话。为什么需要先通过 uid 查找用户,然后再通过电子邮件查找?至于电子邮件验证与密码重置,为什么需要同时调用同一用户?我相信密码重置链接也应该验证用户。

标签: firebase firebase-authentication firebase-admin


【解决方案1】:

错误具体出现在操作auth.createEmailLink 中。此函数有以下限制:20QPS/IP 地址,其中 QPS 为(每秒查询次数)。可以通过将用例提交到 Firebase 来增加此限制。

我在提交问题后从 firebase 支持获得了此信息。

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

【讨论】:

    【解决方案2】:

    我的速度低于 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;
    

    【讨论】:

    • 我不确定我是否遵循,您能否详细说明这里的实际问题和解决方案是什么?我有同样的问题,我不能完全解决这个问题
    猜你喜欢
    • 2019-09-01
    • 2023-03-14
    • 2020-07-25
    • 1970-01-01
    • 2017-10-16
    • 2017-06-18
    • 2021-08-03
    • 2017-01-25
    相关资源
    最近更新 更多