Вопросы

Как выполнить тихое обновление через неявный поток в Angular?

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

У нас есть следующая конфигурация авторизации (более-менее):

export const authConfig: AuthConfig = {
    issuer: '[censored]',
    redirectUri: window.location.origin + '/',
    silentRefreshRedirectUri: window.location.origin + '/assets/login-sources/silent-refresh.html',
    tokenEndpoint: '[censored]',
    loginUrl: '[same as tokenEndpoint]',
    clientId: '[censored]',
    scope: '[censored]',
    clearHashAfterLogin: true,
    oidc: true,
};

А еще у нас есть loginService, который onInit выполняет примерно следующее:

this.oauthService.configure(authConfig);
this.oauthService.tokenValidationHandler = new JwksValidationHandler();
// this.oauthService.setupAutomaticSilentRefresh(); - didn't work
this.oauthService.loadDiscoveryDocument([censored]).then((doc) => {
  // Subscribe to expiration event to refresh token.
  this.oauthService.events
    .pipe(filter(element => element.type === 'token_expires'))
    .subscribe(
      (a) => {
        console.log("Token is about to expire! Refreshing!");
        this.oauthService.silentRefresh().then(result => console.log(result)).catch(error => console.error(error));
      }
    );
  if (this.userid == null) {
    this.oauthService.tryLoginImplicitFlow().then((loggedIn) => {
      if (!loggedIn) {
        this.oauthService.initLoginFlow();
      }
    });
  }
});

Проблема: всякий раз, когда срок действия токена истекает, происходят следующие вещи:

  • Весь веб-сайт клонирует свой экземпляр, поэтому два экземпляра работают параллельно (согласно консоли) = ›это еще хуже, если мы используем automaticSilentRefresh без всех этих прослушивателей событий. Там он клонирует себя на неопределенный срок, пока не закончит ОЗУ.
  • Через несколько секунд мы получаем ошибку тайм-аута обновления в консоли без трассировки стека.
Читать:
Как создать проект Visual Studio с манифестом приложения из Qt?

Итак, я изучил код silentRefresh () и, похоже, он работает с iframe. В указанном iframe ДОЛЖЕН быть простой код, который используется для обновления токена и связи с основным приложением см. здесь. Мы даже реализовали refresh.html как здесь. Однако в нашем случае у нас есть iframe, в котором зеркалируется весь веб-сайт. Значит, у нас есть что-то вроде этого:

html
  head /head
  body
    app-root /app-root
    iframe
      app-root /app-root
    /iframe
  /body
/html

Поскольку для каждого silentRefresh () iframe удаляется и повторно добавляется в DOM, каждый раз, когда создается новый экземпляр всего веб-сайта. Что я сделал не так и как это исправить?

Версии: Angular 9 + angular-oauth2-oidc: ^ 9.0.1, angular-oauth2-oidc-jwks: ^ 9.0.0.

Похожие записи

Alpine.js — отображение поля ввода и одновременное добавление к нему фокуса

admin

Tomcat 9 запускается на терминале [ubuntu 18.04], но не загружается в браузере

admin

Как отменить изменения в Git?

admin

Почему git не может видеть мое удаленное репо, которое, как я уверен, существует?

admin

Ссылка на Условия использования Woocommerce — оформление заказа

admin

flutter: как получить полезную нагрузку push-уведомления из источника, отличного от firebase

admin