Мы хотим настроить наш сервис с аутентификацией OIDC на сервере keycloak.
Мы используем Spring Security 5.2.0 с Spring Boot 2.2.0.
Существует несколько экземпляров нашего сервиса, и мы не хотим делить между ними какие-либо состояния с центральным хранилищем (например, базы данных, распределенные кэши, ...) и не использовать липкие сеансы. Вот почему мы уже реализовали два пользовательских репозитория на основе файлов cookie для информации авторизации, которая обычно находится в сеансе на стороне сервера. (CookieBasedRequestCache
и CookieBasedAuthorizationRequestRepository
). Таким образом, поток перенаправления oidc работает, за исключением последнего шага, когда пользователь перенаправляется на исходный URL:
После успешного входа в систему keycloak перенаправляет обратно в наш экземпляр с кодом. Этот экземпляр (назовем его 'A') проверяет OAuth2AuthorizationResponse
по первоначальному запросу авторизации keycloak. Он получает информацию из файла cookie, который мы сохранили ранее в процессе входа в систему, чтобы избежать управления сеансами Spring Security.
Теперь, если ответ на авторизацию успешно подтвержден, экземпляр «A» отправляет окончательное перенаправление на исходный URL-адрес, запрошенный пользователем перед входом в систему. Если на этот запрос отвечает тот же экземпляр «A», всеработает отлично. Но если другой экземпляр (скажем, «B») отвечает на запрос, он не работает, потому что B ничего не знает о состоянии аутентификации пользователя.
Вопросы:
Существует ли репозиторий JWT на основе файлов cookie, который мы могли бы использовать для сохранения токена доступа между экземплярами? Или как его реализовать?
Где в коде Spring Security (цепочка фильтров?) Проверяется, прошел ли аутентификация пользователя? Это было бы полезно для ответа на окончательный редирект на исходный URL.