Как следует обрабатывать случай выхода из системы, когда открыты несколько вкладок браузера
Я использую angular-oauth2-oidc с Identity Server 4.
Пользователям необходимо войти через OpenId Connect Implicit Flow. Мой идентификатор и токен доступа хранятся в веб-браузере localStorage.
Когда пользователь открывает несколько вкладок браузера, а затем выходит из одной из вкладок, как мне обрабатывать остальные вкладки?
Я попытался перехватить события session_terminated, и они пытаются выйти из системы. Однако он не перенаправляет пользователя обратно на страницу входа.
this.oauthService.events.filter(e => e.type ==='session_terminated')
.subscribe(e => {this.oauthService.logout();})
какие-либо предложения? Спасибо
4 ответа
Интересно. Это было в моем списке дел, чтобы посмотреть, как это работает с библиотекой в любом случае.
Я уже создал специальный репозиторий на игровой площадке, который идеально подходит для тестирования. Я обнаружил, что есть два разных сценария:
- Пользователь заходит на IdentityServer и нажимает кнопку "Выйти".
- Пользователь делает единый выход через наше собственное приложение
Только в первом сценарии вы получаете session_terminated
событие. Во втором сценарии (который у вас, кажется, есть) вы получаете session_error
событие во второй вкладке, потому что первая вкладка:
- Очищает ваши сохраненные токены
- Перенаправляет вас на страницу выхода (где вы все еще должны нажать кнопку выхода)
Вы можете увидеть столько же в этих скриншотах:
Сценарий 1: явный выход из системы на третьей вкладке
Сценарий 2: выйти из приложения
Поэтому я думаю, что ваше решение также заключается в session_error
или что-то подобное.
Сноска: подумав немного о вышесказанном, я считаю, что другие обходные пути также могут быть возможны при прослушивании localStorage
события, и обратите внимание, когда access_token
очищается другой вкладкой.
У меня возникла похожая проблема: использование angular-oauth2-oidc
с хранилищем по умолчанию (sessionStorage) приводит к тому, что если пользователь открывает новую вкладку (вкладка B), он снова входит в систему с новым токеном. Когда он выходит из системы на вкладке A, токен, сохраненный в sessionStorage вкладки B, конечно же, все еще там.
Недостатком использования localStorage является то, что токен сохраняется, даже если браузер закрыт (вроде "держите меня в системе").
Чтобы преодолеть это, я использовал собственный OAuthStorage, который внутренне использует sessionStorage, но если пользователь выходит из системы, он отправляет событие на все другие открытые вкладки браузера и запускает очистку там хранилищ сессии.
Смотрите суть
В этом и заключается спецификация управления сеансами OIDC. Вы можете получать уведомления на стороне клиента, когда их сеанс IDP изменяется / заканчивается, и затем реагировать соответствующим образом.
http://openid.net/specs/openid-connect-session-1_0.html
Работает хорошо, не перегружает сеть и дает вам полный контроль над тем, что делать при обнаружении состояния.
Вы можете проверить, недействителен ли access_token в localstorage или sessionStorage.