Вход в Spring Security OAuth2 через страницу внешнего входа - PullRequest
0 голосов
/ 11 января 2019

Мне интересно, можно ли настроить 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, чтобы обойти это?

1 Ответ

0 голосов
/ 11 января 2019

Проблема вообще не была в Spring Security; это было с Angular SPA. Мне нужно было отправить файл cookie JSESSION_ID при создании междоменного POST для входа / входа из приложения Angular.

Для этого я создал HttpInterceptor (, как описано здесь ):

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
  constructor() {}

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    request = request.clone({
      withCredentials: true
    });
    return next.handle(request);
  }
}

Бит withCredentials: true является важной частью; это указывает браузеру отправлять куки вместе с запросом XHR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...