对于经过身份验证的 API 调用,我每次都会生成一个 firebaseId 令牌,如下代码所示。但这有时需要长达 2-3 秒来铸造代币,这会增加缓慢的用户体验。是否有任何解决方法,也许可以将令牌存储更长时间甚至无限期?我错过了一些明显的东西吗?
谢谢!
async fetchFromAPIAuthenticatedTimeout(url, params) {
this.fetchStampA = (new Date()).getTime()
try {
const token = await firebase.auth().currentUser.getIdToken(true)
this.fetchStampB = (new Date()).getTime()
const response = await fetch(url,params)
if (response.status != 200) {
throw Error("api-error");
}
var json = null;
try {
json = await response.json();
} catch (error) {
throw Error("api-error")
}
this.fetchStampD = (new Date()).getTime()
console.log(">> token",this.fetchStampB-this.fetchStampA)
console.log(">> fetch",this.fetchStampC-this.fetchStampB)
return json.result
}
catch (error)
{
throw Error(error.message)
}
}
// Prints:
// >> token 2198
// >> fetch 319
根据参考文档,getIdToken(( 如果令牌已过期,将自动刷新令牌。因此,无需对每个调用强制刷新。删除此选项将防止往返并大大加快请求速度,并且还可以使您摆脱配额麻烦 - 随着应用程序的扩展,您将遇到配额麻烦。
更新:此边缘情况已修复。令牌现在会在过期前刷新一小段时间。因此,对于此用例,永远不需要使用强制刷新。请注意,可能仍然存在一种边缘情况,即如果您在过期前几秒钟发送请求并且存在延迟,则服务器可能不会在过期发生之前调用 verifyIdToken((。因此,您可能需要实现重试逻辑或检查过期时间(请参阅 IdTokenResult#expirationTime(,并在非常接近时间戳时强制刷新。但肯定不是每个请求。