Jwt RxJS概念帮助:访问和刷新令牌,非同步刷新

Jwt RxJS概念帮助:访问和刷新令牌,非同步刷新,jwt,rxjs6,Jwt,Rxjs6,我是RxJS的新手,希望获得有关如何实现以下过程的概念性帮助: 后端使用短期JWT访问令牌进行保护。在进行身份验证后,向客户端发出初始访问令牌和长寿命刷新令牌。刷新令牌可用于创建新的访问令牌 客户端可以解码令牌,并知道令牌是否过期。客户端应在访问令牌过期时延迟刷新访问令牌;不重试失败的请求 客户端不得同时发出多个刷新请求 最后一部分,我挣扎着。我想象一个信号灯,或某种“门”: 第一个刷新请求通过闸门并将其锁定在其后面。然后,它启动实际的令牌刷新 其他刷新请求在大门处被阻止,等待通过 令牌刷新完

我是RxJS的新手,希望获得有关如何实现以下过程的概念性帮助:

  • 后端使用短期JWT访问令牌进行保护。在进行身份验证后,向客户端发出初始访问令牌和长寿命刷新令牌。刷新令牌可用于创建新的访问令牌
  • 客户端可以解码令牌,并知道令牌是否过期。客户端应在访问令牌过期时延迟刷新访问令牌;不重试失败的请求
  • 客户端不得同时发出多个刷新请求
  • 最后一部分,我挣扎着。我想象一个信号灯,或某种“门”:

    • 第一个刷新请求通过闸门并将其锁定在其后面。然后,它启动实际的令牌刷新
    • 其他刷新请求在大门处被阻止,等待通过
    • 令牌刷新完成后,存储新的访问令牌并提升门
    • 所有刷新请求都返回新的访问令牌
    我发现它使用redux来实现这个门。有必要吗


    或者,门是否可以由
    行为主体
    实现?

    我找到了一个解决方案!代码是可用的

    gate使用
    行为subject
    使一个singleton持有状态。通过应用过滤器,我得到了一个阻塞闸门,当底层闸门提升时,该闸门将允许通过:

    const gate$ = new BehaviorSubject(true); // open at first
    const openGate$ = gate$.pipe(
        filter(x => x === true),
        take(1)   // take only one event, then complete
    );
    
    // wait for the gate to open
    openGate$.subscribe(() => {
        // do something
    });
    
    // close the gate:
    gate$.next(false);
    
    // and open it again
    gate$.next(true);
    
    通过使用
    行为主题
    ,默认情况下会初始化并打开闸门