обновить токен в signalR после истечения срока действия токена

Я создаю соединение в реальном времени через SignalR от клиента (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...');
      });
  }

это работает нормально, пока не истечет срок действия токена. Согласно моим исследованиям, после получения нового токена с токеном обновления предыдущее соединение должно быть остановлено и должно быть создано новое соединение с новым токеном. Теперь я хочу знать, как мне это сделать? Надо ли постоянно проверять токен? Или это следует решать, отправляя каждый запрос на сервер?


person mahdi rahimzade    schedule 03.06.2020    source источник
comment
ты нашел способ?   -  person Kardon63    schedule 04.03.2021
comment
@ Kardon63 ты тоже нашел способ? xD   -  person Mehdi Benmoha    schedule 06.05.2021
comment
@MehdiBenmoha В событии закрытия вы можете проверить, содержит ли строка ошибки unauthorized, а затем вы можете перезапустить соединение, еще не реализовали его, но я думаю, что это должно быть сделано именно так   -  person Kardon63    schedule 06.05.2021
comment
Я пытаюсь ... сообщу, если он заработает   -  person Mehdi Benmoha    schedule 06.05.2021
comment
@ Kardon63 событие onclose срабатывает, но строка не содержит unauthorized, слушатель получает значение undefined. Мне также было очень сложно возобновить соединение, потому что я использую асинхронный вызов для получения токена, и я оборачиваю всю систему с помощью rxJS, поэтому быстрое и грязное исправление заключалось в перезагрузке страницы при получении события отключения, а также установить агрессивные задержки для автоматического переподключения.   -  person Mehdi Benmoha    schedule 25.05.2021


Ответы (2)


Когда срок действия токена истечет, соединение будет разорвано сервером, и у вас будет ошибка на стороне сервера. Я считаю, что это код ошибки 405 Method now allowed, который вы получите.

Итак, что вам нужно, это поймать эту ошибку истечения срока действия токена и разорвать соединение, чтобы вы могли начать новое с новым токеном.

person Kiril1512    schedule 03.06.2020
comment
Я не получаю сообщение об ошибке по истечении срока действия токена. Ошибка возникает при выполнении метода хаба. Не могли бы вы представить статью или пример, реализованный в этой области? - person mahdi rahimzade; 03.06.2020
comment
У вас есть время истечения срока действия токена, представьте, что вы определяете для своего токена 1 час, а затем определяете на своем концентраторе соединение, действительное только для 1 нашего, используя ConnectionTimeout. - person Kiril1512; 04.06.2020
comment
@ Kiril1512, могу ли я обновить токен в событии при повторном подключении, или мне нужно принудительно создать новое соединение, не могли бы вы привести пример? - person Kardon63; 05.03.2021
comment
@ Kardon63 извини, я не знаю, сможешь ли ты сделать это при повторном подключении - person Kiril1512; 05.03.2021

Что у меня сработало, это БЫСТРОЕ И ГРЯЗНОЕ исправление, так это перезагрузка страницы при закрытии событий:

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

Объяснение

Я оборачиваю процесс подключения с помощью RxJS, поэтому лучшее решение для моего случая - выдать ошибку вместо перезагрузки страницы и отловить ее с помощью оператора retryWhen. Но поскольку это серьезная ошибка (нужно подождать 1 час, пока токен истечет, и локально эмулятор не заботится о токенах ...), я просто предпочел использовать это временное решение.

person Mehdi Benmoha    schedule 25.05.2021