Angular 令牌过期后在信号器中续订令牌

Angular 令牌过期后在信号器中续订令牌,angular,asp.net-core,signalr,refresh-token,Angular,Asp.net Core,Signalr,Refresh Token,我从客户端(angular 9)和服务器(asp.net core 3.1)通过信号器创建实时连接,并通过JWT令牌授权集线器,如以下代码: private createConnection() { this.hubConnection = new HubConnectionBuilder().withUrl(`${this.appConfig.hubEndpoint}/Hubs`, { accessTokenFactory: () => jwtToken }

我从客户端(angular 9)和服务器(asp.net core 3.1)通过信号器创建实时连接,并通过JWT令牌授权集线器,如以下代码:

 private createConnection() {
      this.hubConnection = new HubConnectionBuilder().withUrl(`${this.appConfig.hubEndpoint}/Hubs`,
        { accessTokenFactory: () => jwtToken })
        .withAutomaticReconnect()
        .build();
  }

  private startConnection(): void {
    this.hubConnection
      .start()
      .then(() => {
        this.connectionIsEstablished = true;
        this.connectionEstablished.emit(true);
      })
      .catch(err => {
        console.log('Error while establishing connection, retrying...');
      });
  }
在令牌过期之前,这一切正常。根据我的研究,在收到带有刷新令牌的新令牌后,应该停止以前的连接,并使用新令牌创建新连接。
现在我想知道我该怎么做?我必须经常检查代币吗?还是应该通过向服务器发送每个请求来解决这个问题?

当令牌过期时,服务器将断开连接,服务器端将出现错误。我相信405错误代码
方法现在是允许的
,您将得到


因此,您需要的是捕获此令牌过期错误并断开连接,这样您就可以使用新令牌启动一个新的连接。

对我有效的是,这是一个快速而肮脏的修复,是在关闭事件时重新加载页面:

this.hubConnection.onclose(() =>{
  window.location.reload()
})
解释


我正在用RxJS包装连接过程,因此对于我的情况,更好的修复方法是抛出一个错误,而不是重新加载页面,然后使用
retryWhen
操作符捕获它。但由于这是一个硬错误(需要等待1小时,等待令牌过期,并且本地模拟器不关心令牌…),因此我更愿意使用这个临时解决方案。

令牌过期时,我没有收到错误。执行中心的方法时会发生错误。您能介绍一篇文章或一个在该领域实现的示例吗?您有令牌过期时间,假设您为令牌定义了1小时,然后在集线器上使用
ConnectionTimeout
@Kiril1512在重新连接事件中我能刷新令牌吗,或者我需要为连接强制创建一个新的连接,你能举个例子吗?@Kardon63抱歉,我不知道你是否能在重新连接时这样做你找到方法了吗?@Kardon63你也找到方法了吗?xD@MehdiBenmoha在关闭事件中,您可以检查错误字符串是否包含未经授权的
,然后您可以重新启动连接,虽然尚未实现,但我认为应该这样做。我正在尝试。。如果我得到它,我会通知你的working@Kardon63onclose事件被触发,但字符串不包含unauthorized,侦听器将获得一个
undefined
值。对我来说,更新连接也非常困难,因为我使用异步调用来获取令牌,并且我正在用rxJS包装整个系统,因此快速而肮脏的修复方法是在收到断开连接的事件时重新加载页面,同时还设置自动重新连接的严重延迟。