проблема сеанса 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 широковещательного канала для трансляции события выхода из системы между вкладками.