【问题标题】:How to solve race condition for refresh api token during multiple async requests?如何解决多个异步请求期间刷新 api 令牌的竞争条件?
【发布时间】:2020-06-02 11:06:54
【问题描述】:

大约有 5 个异步请求同时运行并达到 401 响应,并且它的默认补偿功能是尝试刷新令牌以查看我们是否可以获得访问权限。

问题在于,如果有 5 次异步调用来刷新令牌端点,那么我们会在会话中以不同步的无效令牌结束。

这是 Redux-Saga 应用,上面有 ReactJS。

【问题讨论】:

  • 创建一个代理对象来协调刷新令牌。如果有请求已经在进行中,请等待。或者,如果您不想等待,让代理发送另一个请求,然后让代理决定使用哪个响应(可能是第一次成功),并使用此响应通知代理的所有调用者。

标签: javascript rest oauth oauth-2.0


【解决方案1】:

当这五个请求完成时,您需要接收某种信号。您可以使用Promise.all 来实现,它接受一系列承诺,并在所有承诺都履行时履行,并在至少有一个履行时拒绝。

const asyncRequest1 = makeAsyncRequestPromise();
const asyncRequest2 = makeAsyncRequestPromise();
const asyncRequest3 = makeAsyncRequestPromise();
const asyncRequest4 = makeAsyncRequestPromise();
const asyncRequest5 = makeAsyncRequestPromise();

const allDone = Promise.all([
    asyncRequest1.then(() => true, () => false),
    asyncRequest2.then(() => true, () => false),
    asyncRequest3.then(() => true, () => false),
    asyncRequest4.then(() => true, () => false),
    asyncRequest5.then(() => true, () => false),
]);


allDone.then((results) => {
    const someHasFailed = results.some(result => result === false);
    if (someHasFailed) {
        // make the refresh token here
    }
});

【讨论】:

  • 虽然你的解决方案可以工作,但这不是我可以在我的应用程序中使用的东西,因为它是一个由 redux saga 样板和 ReactJS 构成的鲸鱼。请求调用分布在应用程序中的各个文件中
  • 然后另一种解决方案是将这些请求的状态直接存储到您的 redux 存储中,这是一个额外的间接但可以工作
猜你喜欢
  • 2019-09-28
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 2019-09-19
  • 2020-06-30
  • 1970-01-01
  • 2021-06-04
相关资源
最近更新 更多