Мне интересно, можно ли настроить Spring Security для использования внешней страницы входа в систему во время процесса входа в OAuth. Не берите в голову, что это не очень хорошая идея, и она побеждает одну из целей OAuth (отделение проблем входа в систему / учетных данных / аутентификации от клиентов и серверов ресурсов).
У меня есть следующие настройки:
- Клиентское SPA-приложение, в котором находится страница входа, которую я хочу использовать
- Сервер аутентификации OAuth (с использованием Spring Security OAuth /
@EnableAuthorizationServer
)
- Один или несколько серверов ресурсов OAuth
Поток OAuth, который я ищу, выглядит следующим образом:
- Пользователь пытается получить доступ к защищенному маршруту в SPA
- Клиент перенаправляет пользователя на страницу авторизации сервера OAuth (с параметрами, включая состояние, одноразовые номера и т. Д.)
- OAuth-сервер не обнаруживает токен и перенаправляет на страницу входа SPA
- Пользователь входит в систему; сообщения для входа в систему (URL входа в систему живет на сервере OAuth; для разрешения отправки сообщений из SPA на сервер OAuth требуется конфигурация CORS)
- Войти успешно; Spring перенаправляет на первоначально запрошенную страницу авторизации с параметрами, которые изначально присутствовали
- авторизовать перенаправления на токен; пользователь получает токен; SPA обнаруживает, что у пользователя теперь есть токен, и разрешает доступ к защищенному маршруту
Я могу настроить Spring Security для указания абсолютного URL-адреса, чтобы обеспечить перенаправление на страницу входа в мой SPA:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors()
.and()
... config ...
.and()
.formLogin()
.loginPage("http://angular-spa-app/login")
.loginProcessingUrl("/login")
.permitAll();
}
Когда я прохожу этот поток, я вижу первый запрос на oauth/authorize?state=...&nonce=...&etc...
, затем перенаправление на http://angular-spa-app/login
. Но когда я вхожу в систему, Spring не может обнаружить, что он должен перенаправить обратно на URL oauth/authorize
, который был сохранен в сеансе.
Продолжая эту тему, я обнаружил, что при первом запросе к oauth/authorize
полный URL-адрес с параметрами сохраняется в сеансе (HttpSessionRequestCache.saveRequest(...)
.
Когда форма входа в систему отправлена и аутентификация прошла успешно, Spring пытается получить сохраненный запрос, чтобы получить URL-адрес перенаправления для отправки в качестве заголовка 302 Location. Но когда это происходит, сеанс становится пустым, и поэтому Spring не может получить сохраненный запрос. Почему это? Нужно ли изменять настройки сеанса Spring, чтобы обойти это?