Spring Boot 2 + OAuth2: настройка обмена кодом аутентификации для токена

Я следил за этим Spring Boot OAuth2 руководство по настройке клиента OAuth2. К сожалению, как только «пользователь» аутентифицируется с помощью Idp (Okta), происходит перенаправление с «кодом», что приводит к циклу перенаправления: /login -> /authorize... -> /login... -> /login

Firefox обнаружил, что сервер перенаправляет запрос на этот адрес так, что никогда не будет завершен.

Кто-нибудь знает, в чем проблема или может быть проблема и как ее решить? Подробности следуют далее.

Конфигурация Okta:

URI перенаправления входа: http://localhost:8080/auth/login

URI перенаправления выхода из системы: http://localhost:8080/auth/logout

Вход инициирован: Только приложение

Инициировать URI входа в систему: http://localhost:8080/auth/login

Свойства конфигурации:

okta:
  oauth2:
    client:
      client-id: clientId
      client-secret: clientSecret
      scope: openid profile email
      client-authentication-scheme: form
      access-token-uri: https://mydomain.oktapreview.com/oauth2/myapp/v1/token
      user-authorization-uri: https://mydomain.oktapreview.com/oauth2/myapp/v1/authorize
    resource:
      user-info-uri: https://mydomain.oktapreview.com/oauth2/myapp/v1/userinfo

Фильтр:

  private Filter filter() {
    OAuth2ClientAuthenticationProcessingFilter filter = new OAuth2ClientAuthenticationProcessingFilter(
        "/login");
    OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(oktaClient(), oauth2ClientContext);
    filter.setRestTemplate(restTemplate);
    UserInfoTokenServices tokenServices = new UserInfoTokenServices(oktaResource().getUserInfoUri(),
        oktaClient().getClientId());
    tokenServices.setRestTemplate(restTemplate);
    filter.setTokenServices(tokenServices);

    return filter;
  }

Конфигурация WebSecurityConfigurerAdapter:

  @Configuration
  @EnableOAuth2Client
  public class WebSecConfig extends WebSecurityConfigurerAdapter {
  ....
  @Override
  public void configure(HttpSecurity http) throws Exception {
    http.antMatcher("/**").authorizeRequests()
        .antMatchers("/", "/login**", "/logout**", "/v2/api-docs", "/configuration/ui",
            "/configuration/security", "/swagger-resources/**", "/swagger-ui.html", "/webjars/**")
        .permitAll()
        .anyRequest().authenticated().and().exceptionHandling()
        .authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login")).and().csrf()
        .csrfTokenRepository(
            CookieCsrfTokenRepository.withHttpOnlyFalse()).and().addFilterBefore(filter(),
        BasicAuthenticationFilter.class);
  }
  ....
  }

Обновление. Решением было изменить LoginUrlAuthenticationEntryPoint("/login") на LoginUrlAuthenticationEntryPoint("/") и заново создать сервер авторизации.


person Ari    schedule 16.03.2018    source источник
comment
Пожалуйста, обновите свой вопрос, указав основной класс   -  person Pawan Patil    schedule 16.03.2018


Ответы (1)


Вам следует использовать сервер авторизации по умолчанию или созданный вами. Если вы используете значение по умолчанию, это должно выглядеть примерно так:

https://mydomain.oktapreview.com/oauth2/default
person Matt Raible    schedule 16.03.2018
comment
Я создал новый сервер аутентификации, и теперь проблема заключается в цикле перенаправления. Есть идеи по проблеме / решению? - person Ari; 17.03.2018
comment
Я бы посоветовал использовать учебник по Okta, чтобы решить вашу проблему. Я написал несколько, так что, возможно, смогу помочь. Какой у вас вариант использования? Вы просто хотите войти в приложение Spring Boot с помощью Spring Boot 2 / Spring Security 5? - person Matt Raible; 18.03.2018
comment
Конечная цель состоит в том, чтобы API на основе Spring Boot 2 (с использованием Spring Security + OAuth2) аутентифицировали / авторизовали пользователей одностраничного приложения. При аутентификации я хотел бы, чтобы JWT вернулся в SPA. И с каждым запросом я хотел бы, чтобы API (-ы) проверяли JWT и проверяли авторизацию через утверждение групп, которое включено в JWT. Когда срок действия JWT истечет, я хочу, чтобы токен был обновлен с помощью токена обновления. - person Ari; 19.03.2018
comment
Я использовал одно из ваших руководств с простое руководство по Spring, чтобы аутентификация работала через @EnableOAuth2Sso. Когда я выполняю GET запрос к корневому пути, т.е. /, я получаю все содержимое Principal класса, ожидая токена обновления, даже если он настроен на сервере авторизации Okta. Мне еще предстоит выяснить, как проверить JWT и проверить авторизацию с помощью утверждения групп, которое включено в JWT, или как обновить. - person Ari; 19.03.2018
comment
Spring Security (и средство запуска Spring Boot от Otka) предназначены для обработки отправки токена обновления, чтобы вы могли получить новый токен доступа. Что касается заявлений групп, вы могли бы сделать это так же, как и мы в JHipster: github.com/mraible/jhipster-oidc-example/blob/master/src/main/ - person Matt Raible; 20.03.2018
comment
Чтобы уточнить, Spring Security (OAuth2) и Okta Spring Boot независимо обрабатывают получение нового токена (ов) доступа через токен обновления? В настоящее время объект Principal, возвращенный согласно вашему руководству выше, не включает в себя какой-либо ключ групп - даже если сервер аутентификации Okta настроен для включения этого утверждения. Это ожидаемое поведение? Что касается утверждения групп, можно ли его извлечь в фильтре и добавить в контекст роли Spring Security, чтобы к нему можно было получить доступ через hasRole? Вы случайно знаете такой пример? - person Ari; 20.03.2018