【发布时间】: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