#spring #cookies #oauth #oauth-2.0 #okta
#spring #файлы cookie #oauth #oauth-2.0 #okta
Вопрос:
Как правильно реализовать авторизацию на основе http-сеансов с использованием простого серверного интерфейса (например, Spring) и интерфейса SPA и поставщика аутентификации OAuth2?
Под термином «правильный» я подразумеваю способ выдавать себя за пользователя для серверной части для получения файла cookie сеанса.
К сожалению, вокруг JWT существует шумиха вокруг «scallable, restful, без состояния». Но мое приложение будет использоваться очень небольшим количеством пользователей, и ему просто требуется старая добрая безопасность, которая обеспечивается http-сеансами из коробки. Текущее решение, «предлагаемое» Okta, заставляет проверять каждый запрос к API, поэтому каждый вызов имеет значительные накладные расходы, что приводит к низкой производительности.
Предположим, что у нас есть приложение SPA, доступное на myapp.com и его серверная часть доступна через прокси-сервер myapp.com/api.
О чем я думаю, так это о реализации этого сценария:
- пользователь посещает SPA (Angular, React, что угодно)
- SPA вызывает серверную часть для получения сведений о пользователе, 403
- SPA перенаправляет на поставщика oauth, например. Okta
- пользователь входит в систему с помощью поставщика oauth
- поставщик oauth предоставляет токен на предъявителя и перенаправляет обратно в SPA
- SPA вызывает серверную часть для получения сведений о пользователе, но теперь с предъявителем
- spring получает токен, предоставленный oauth2, проверяет это в поставщике oauth, создает http-сеанс и предоставляет файл cookie сеанса (JSESSIONID)
- Вызовы SPA на серверную часть автоматически заполняются cookie (мы говорим с прокси, так что это тот же домен)
или, может быть:
- пользователь посещает SPA (Angular, React, что угодно)
- SPA вызывает серверную часть для получения сведений о пользователе, 403, поэтому серверная часть перенаправляет на поставщика oauth, например. Okta
- пользователь входит в систему с помощью поставщика oauth
- oauth перенаправляет обратно на серверную часть с токеном oauth2
- spring получает предоставленный токен oauth2, проверяет это в поставщике oauth, создает http-сеанс и предоставляет cookie сеанса (JSESSIONID) и перенаправляет в SPA
- SPA вызывает серверную часть для получения сведений о пользователе (автоматически заполняется файлом cookie), 200
Существует ли готовая конфигурация, доступная из коробки? Похоже, что оба сценария требуют большой работы и настройки на стороне безопасности spring. К сожалению, трудно найти какие-либо ресурсы, связанные с файлами cookie сеанса http, в сочетании с поставщиками SPA и oauth2.
Или, может быть, я что-то упускаю?
Ответ №1:
JHipster реализует (более безопасный) второй сценарий (также известный как поток кода авторизации). Его реализация основана на поддержке OAuth в Spring Security.
Мы протестировали все с Keycloak и Okta, но это должно работать с любым IDP, совместимым с OIDC.
Комментарии:
1. Спасибо! Мне пришлось удалить все вредоносные программы jhipster, но они работают как по маслу!
2. @MGorgon это именно то, что я ищу… Я почти уверен, что это будет работать в производственной среде, поскольку все находится за «одним хостом», но как вы справляетесь с разработкой, где они находятся на «разных хостах»?
3. @Giovane вы также можете использовать прокси для среды разработки — например, с помощью npm