Поток кода авторизации и несколько вкладок

Мне нужно понять, как избежать или как управлять липкой сессией во время OAuth2 — Предоставление потока кода авторизации, в частности во время: GET /uaa/oauth/authorize, POST /uaa/login и еще раз GET /uaa/oauth/authorize

Наша служба аутентификации будет обслуживать только два принадлежащих нам веб-приложения, каждое из которых является ресурсным сервером с проверкой токена и валидности. Если токена нет или он недействителен, они будут перенаправлены непосредственно на страницу входа в систему Auth Server (правда, говоря о первом вызове, GET /oauth/authorize).

Для предоставления кода авторизации Flow Grant необходимо выполнить следующие шаги:

-Первый вызов для регистрации клиентского запроса GET /uaa/oauth/authorize, сохранение в сеансе (в моем случае Spring Redis) некоторой информации, например callbackurl клиента

-Второй вызов для входа в систему с помощью учетных данных пользователя POST /login

-Третий вызов для получения ACCESS_CODE GET /uaa/oauth/authorize, получение URL-адреса обратного вызова из сеанса.

Но что, если я подделаю два запроса от двух разных клиентов, открыв в одном браузере две разные вкладки?

Например, с:

http://localhost:9191/uaa/oauth/authorize?response_type=code&client_id=client-one&scope=auth&redirect_uri=http://localhost:8080/client-one

а другой с:

localhost:9191/uaa/oauth/authorize?response_type=code&client_id=client-two&scope=auth&redirect_uri=http://localhost:8080/client-two

Весенняя сессия становится грязной. Например:

  • Открытие WebApp1 на Tab1, а затем WebApp2 на Tab2.
  • Вход в Tab1 приведет к перенаправлению на URI перенаправления WebApp2.
  • Затем вход в Tab2 вернется к /uaa/, что приведет к ошибке 404.

Я безуспешно пытался настроить SessionRepository, но, используя другие сервисы с Oauth2, я начинаю верить, что мне понадобится хотя бы одна страница в каждом веб-приложении, прокси перед первым вызовом GET/oauth/authorize.

Есть ли какие-либо рекомендации, чтобы избежать липкого сеанса с этим потоком?

Или какой-то способ управлять несколькими вкладками без html-страницы? Spring-Security по умолчанию использует липкую сессию.

Спасибо за уделенное время.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
285
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В итоге я реализовал что-то вроде nonce, по умолчанию не поддерживаемого Spring Security (насколько мне известно, Весенняя безопасность GitHub).

Если пользователь пытается аутентифицироваться с одноразовым номером, отличным от последнего, я выкидываю его на страницу с ошибкой с сообщением типа «сеанс входа в систему истек» со ссылкой на веб-приложение.

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

Как условно завершить приложение Spring Boot при запуске на основе свойства
Leadtools.RasterException: собственная библиотека Ltkrnx.dll уже загружена в другой загрузчик классов
Результат немедленного возврата Spring boot не может выполнить функцию
Как читать с конца темы, независимо от зафиксированного смещения группы
Переменная ссылки на текущее местоположение проекта в application.properties
Не удалось получить конструктор для org.hibernate.persister.entity.SingleTableEntityPersister. Исключение нулевого указателя
Невозможно удалить дочернюю сущность без удаления родительской сущности, независимо от CascadeTypes?
Не удалось создать экземпляр класса HeroController; конструктор выдал исключение; вложенным исключением является java.lang.NullPointerException
Разверните приложение Spring Batch в Spring Cloud Data Flow, запустив пакетный микросервис отдельно
Приложение Spring Boot работает как автономное, но класс не найден при развертывании в Tomcat