用于并行操作的Firebase锁定实时数据库端点-事务?

时间:2019-04-14 10:54:33

标签: firebase firebase-realtime-database

在我的数据库中,每个用户都有一些对第三方的OAuth凭据,例如:

{
  acces_token: "",
  expires_at: "",
  refresh_token: ""
}

当我们需要访问第三者时,如果令牌已过期,则刷新它会生成新的access_tokenrefresh_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

0 个答案:

没有答案