Интеграция Spring Cloud Gateway с Keycloak для веб-приложений

Spring Cloud Gateway, выступая в роли BFF (Backend for Frontend), обеспечивает безопасную аутентификацию и авторизацию для веб-приложений, перенося логику OAuth 2.0/OIDC на бэкенд. Вместо хранения токенов на фронтенде, токены access, refresh и id хранятся в http-сессии на стороне шлюза, а веб-приложение использует cookie для идентификации сессии. Такой подход делает шлюз приватным OAuth клиентом, что повышает безопасность.
Интеграция Spring Cloud Gateway с Keycloak для веб-приложений
Изображение носит иллюстративный характер

Для интеграции необходимы spring-boot-starter-oauth2-client, spring-cloud-starter-gateway, spring-session-data-redis, spring-session-core. Шлюз настраивается как OAuth2 клиент с использованием WebFlux spring security, обеспечивая поддержку PKCE для защиты. Для хранения OAuth2AuthorizedClient, объектов авторизации, используется WebSessionServerOAuth2AuthorizedClientRepository, который сохраняет их в веб-сессии. Разлогин реализован через OidcClientInitiatedServerLogoutSuccessHandler (для oidc) и DelegatingServerLogoutHandler, который удаляет SecurityContext, очищает сессию и удаляет cookie.

Конфигурация application.yaml включает настройки провайдера Keycloak, client-id, client-secret, тип авторизации и scopes. Шлюз добавляет фильтр TokenRelay для перенаправления запросов с access токеном на защищенные ресурсы, включая CORS настройки. Контроллеры AuthInfoController обеспечивают получение токенов access и id по cookie из сессии.

Защищенный ресурс, например тестовое приложение, настраивается как oauth2 ресурсный сервер, проверяющий JWT токены. После аутентификации через шлюз, запросы к защищенному ресурсу успешны, а сессии в keycloak регистрируются. Разлогин корректно удаляет сессию как на стороне шлюза, так и в keycloak, удаляя cookie. Важно правильно настроить время жизни сессии и рефреш токена и убедиться, что сессии keycloak и шлюза согласованы по времени жизни, чтобы исключить зависание сессий.


Новое на сайте

5563Как правильно выбирать полосу движения в городе: экзамен по пдд? 5562Разработка резервной утилиты ReBack на Rust: ключевые решения и архитектура 5561Нужен ли RabbitMQ в контейнерной среде? 5560Может ли один человек изменить ситуацию в условиях катастрофы? 5559Сколько стоят ваши идеи? Как оценить интеллектуальную собственность? 5558Как дизайн стал драйвером бизнеса: трансформация роли дизайнера? 5557Как сохранить неповторимую красоту сельской местности Суррея: ваш голос имеет значение? 5556Сердце приюта: невероятная история Анн Чард и ее любви к животным 5555Зимняя тревога на Харкерли-роуд: более 150 лебедей под угрозой на дороге 5554Какие песни русского рока покорили слушателей? 5553Не станет ли лондонская система общественного транспорта ещё удобнее? 5552Как посчитать стоимость забора вокруг садовых участков? 5551Как встроить фронтенд в JAR-файл: практическое руководство 5549Due Diligence: зачем нужны «шпионские игры» перед покупкой IT-продукта?