在我的数据库中,每个用户都有一些对第三方的OAuth凭据,例如:
{
acces_token: "",
expires_at: "",
refresh_token: ""
}
当我们需要访问第三者时,如果令牌已过期,则刷新它会生成新的access_token
和refresh_token
。
如果针对同一用户同时触发多个firebase函数,并且访问令牌已过期,则每个函数都会尝试刷新令牌。
是否有一种方法可以将用户对象锁定在数据库中(如user/{userKey}
),并且在需要更新令牌之前不允许进行任何读取?
编辑:我已经尝试过的内容:
我将事务视为一种选择,但是我找不到一种使事务等待令牌刷新的方法,也无法使代码等待事务。
// Must refresh token in a transaction, to prevent multiple simultaneous refreshes
await tokenRef.transaction(async aToken => {
console.log("got token", aToken);
if (aToken) { // Make sure the token was not deleted
let tokenObj = this.client.accessToken.create(aToken);
console.log("token object", tokenObj);
console.log("expired", expired(tokenObj));
if (expired(tokenObj)) { // Re-check expiry
try {
const newToken = await this.getAccessToken(token.token.refresh_token, 'refresh_token');
console.log('Refresh Token Result', newToken.token);
console.log('Expires At', newToken.token.expires_at);
return newToken;
} catch (e) {
console.warn("Failed to refresh token", e);
return null; // Failed to refresh
}
}
console.log("not expired, not modifying", aToken);
return aToken;
}
return null;
});
打印出:
获得令牌
已过期null
得到了令牌{some_token_here}
令牌对象{some object}
true
,然后在代码的后半部分中,使用访问令牌获得401错误(尝试访问第三方)。它永远不会到达refresh token result
。