проблема сеанса iframe в клиенте OIDC

Я использую клиент OIDC и WSO2 API Manager 3.2.0 в своем угловом приложении для аутентификации. Все работает нормально, пока я не выйду из системы.

Сначала я вхожу в приложение с одной вкладки, а затем дублирую эту вкладку после успешного входа. После этого, когда я выхожу из одной вкладки, другие вкладки тоже должны выйти, но этого не происходит. Я создал iframe и постоянно проверяю сеанс, как показано ниже.

.ts-файл:

        baseUrl = new URL(window.location.href);
  callbackURI = this.baseUrl.origin + '/slate/dashboard';

  checkSessionURL = this.sanitizer.bypassSecurityTrustResourceUrl('https://localhost:9443/oidc/checksession' + '?client_id='
            + localStorage.getItem('client_id') + '&redirect_uri=' + this.callbackURI);

  constructor(private sanitizer: DomSanitizer, private authService: AuthService) {
  }

  ngOnInit(): void {
  }

  ngAfterViewInit(): void {
    if (this.authService.isLoggedUser()) {
      this.checkSession();
    }
  }

  isIFrame = (input: HTMLElement | null): input is HTMLIFrameElement =>
    input !== null && input.tagName === 'IFRAME'

  /**
   * Invoke check session OIDC endpoint.
   */
  checkSession(): void {
    setInterval(() => {
      const msg = localStorage.getItem('client_id') + ' ' + localStorage.getItem('sessionState');
      const frame = document.getElementById('iframeOP');
      if (this.isIFrame(frame) && frame.contentWindow) {
        frame.contentWindow.postMessage(msg, 'https://localhost:9443/oidc/checksession');
      }
    }, 3000);
  }

.HTML-файл:

      <iframe
  title='iframeOP'
  id='iframeOP'
  [src]="checkSessionURL"
></iframe>

После обновления вкладки дубликатов я получаю это.

https://localhost:9443/authenticationendpoint/oauth2_error.do?oauthErrorCode=access_denied&oauthErrorMsg=Ошибка+возникла+во время+извлечения+данных+из+id+токена.

Но выход из дублированных вкладок должен происходить автоматически. Я ценю, если кто-нибудь может помочь.

2 ответа

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

В качестве ответа вы можете получить «изменено», «без изменений» или «ошибка». Если вы получаете «ошибку», вам необходимо выйти из системы.

Если вы получаете «изменено», вам нужно отправить вызов авторизации в другом iframe с дополнительным параметром запроса.prompt=none.

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

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

Если в сообщении написано «без изменений», вам не нужно ничего делать.

Чтобы все упростить, вы можете использовать наш Angular SDK , который позаботится об этих вещах прямо из коробки.

Вам нужно поделитьсяlogoutсобытие (и вызвать функцию выхода) между вкладками. Предлагаемая реализация: ваш SPA (каждая вкладка) должен следить заexternal-logoutлогическая настройка в локальном хранилище с использованием API хранилища браузера (ссылка ). Более современная реализация может использовать API широковещательного канала для трансляции события выхода из системы между вкладками.

Другие вопросы по тегам