Spring boot 2.0.3 + Security + автоконфигурация Oauth2

Spring boot 2.0.3 + Security + автоконфигурация Oauth2

Я работаю с OAuth2 и микросервисами, я создал микросервис для генерации токенов авторизации и еще один микросервис в качестве клиента. Генерация токенов работает, но когда я пытаюсь использовать этот сгенерированный токен в клиентской службе для аутентификации, он не работает.

Микросервис, генерирующий токены: localhost: 9999

Токен, созданный с помощью url: estrutura: estruturasecret @ localhost: 9999 / oauth / token

   [
       {
          "key":"grant_type",
          "value":"password"
       },
       {
          "key":"username",
          "value":"matheus"
       },
       {
          "key":"password",
          "value":"teste"
       },
       {
          "key":"client_id",
          "value":"estrutura"
       }
    ]

возвращаться:

 {
        "access_token": "2e4c26b3-0fcf-493e-a255-6216b98811c5",
        "token_type": "bearer",
        "refresh_token": "5e33740a-ccb9-4ec1-94be-3a4643b8097a",
        "expires_in": 42479,
        "scope": "read write"
    }

Микросервис клиента: localhost: 9090

@SpringBootApplication
@EnableResourceServer
public class ClientServer {
   public static void main(String[] args) {
      SpringApplication.run(ClientServer.class, args);
   }
}

application.yml:

server:
  port: 9090
  servlet:
    context-path: /client
spring:
  application:
    name: client-server
  security:
    oauth2:
      client:
        client-id: estrutura
        client-secret: estruturasecret
        access-token-uri: localhost:9999/oauth/token
        user-authorization-uri: localhost:9999/oauth/authorize
      resource:
        token-info-uri: localhost:9999/oauth/check_token
logging:
  level:
    org.springframework.security: DEBUG

Ошибка:

<error>invalid_token</error>
<error_description>Invalid access token: 2e4c26b3-0fcf-493e-a255-6216b98811c5</error_description>

Журналы:

2018-06-26 11:24:42.641 DEBUG 18658 --- [nio-9090-exec-2] o.s.security.web.FilterChainProxy        : /alunos at position 5 of 11 in additional filter chain; firing Filter: 'OAuth2AuthenticationProcessingFilter'
2018-06-26 11:24:42.641 DEBUG 18658 --- [nio-9090-exec-2] p.a.OAuth2AuthenticationProcessingFilter : Authentication request failed: error = "invalid_token", error_description = "Invalid access token: 2e4c26b3-0fcf-493e-a255-6216b98811c5"
2018-06-26 11:24:42.645 DEBUG 18658 --- [nio-9090-exec-2] o.s.s.w.header.writers.HstsHeaderWriter  : Not injecting HSTS header since it did not match the requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@1fa75b
2018-06-26 11:24:42.647 DEBUG 18658 --- [nio-9090-exec-2] s.s.o.p.e.DefaultOAuth2ExceptionRenderer : Written [error = "invalid_token", error_description = "Invalid access token: 2e4c26b3-0fcf-493e-a255-6216b98811c5"] as "application/xml;charset=UTF-8" using [org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter@30d6fa45]
2018-06-26 11:24:42.647 DEBUG 18658 --- [nio-9090-exec-2] s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder now cleared, as request processing completed

Документация: https://docs.spring.io/spring-security-oauth2-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-security-oauth2-authorization-server

stackoverflow.com/questions/48761624/…
vaquar khan 26.06.2018 19:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
1
9 241
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я попытался воспроизвести ваш вариант использования: я разрабатываю AuthServer с облачной безопасностью Spring и ResourceServer. Проблема, которую я вижу при использовании стратегии token-info-uri, заключается в том, что весной, чтобы проверить токен, используйте RemoteTokenServices, и он использует OAuth2RestTemplate для получения информации токена, сказал, что если вы хотите использовать свою конфигурацию, вы вставили этот вид конфигурации, как показано ниже:

@EnableOAuth2Client
@EnableResourceServer
@SpringBootApplication
public class HelloOauthServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloOauthServiceApplication.class, args);
    }

    @Bean
    public OAuth2RestTemplate oAuth2RestTemplate(OAuth2ProtectedResourceDetails resource){
        return new OAuth2RestTemplate(resource);
    }
}

Обратите внимание на определение bean-компонентов @EnableOAuth2Client и OAuth2RestTemplate. Эта конфигурация используется весной для проверки и обновления вашего токена.

Однако в этом случае любой сервер ресурсов должен быть также клиентским приложением и, по моему опыту, не масштабируется. Мой личный совет - использовать стратегию user-info-uri. В этом случае Spring будет использовать специальную конечную точку для получения информации о пользователе. конфигурация очень проста на вашем сервере ресурсов, вы определили только @EnableResourceServer, как в вашем примере, в вашем yaml вы можете настроить только часть ресурса, как показано ниже

security:
  oauth2:
    resource:
     user-info-uri: http://localhost:9090/account/userInfo.json
     preferTokenInfo: false

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

@RestController
@RequestMapping("/account")
class UserRestFullEndPoint {

    @GetMapping("/userInfo")
    public Principal userInfo(Principal principal){
        return principal;
    }
}

Я использую этот подход много раз, и я заметил, что он работает очень хорошо и масштабируется, потому что на ваших ресурсных серверах вы не определили его, как и клиентское приложение.

Я надеюсь, что это может быть полезно.

PS: в своей конфигурации вы забыли протокол http:

server:
  port: 9090
  servlet:
    context-path: /client
    spring:
      application:
        name: client-server
      security:
        oauth2:
          client:
            client-id: estrutura
            client-secret: estruturasecret
            access-token-uri: http://localhost:9999/oauth/token
            user-authorization-uri: http://localhost:9999/oauth/authorize
          resource:
            token-info-uri: http://localhost:9999/oauth/check_token
    logging:
      level:
        org.springframework.security: DEBUG

Отличный ответ с подробностями. Можно ли использовать сторонний сервер авторизации (например, Azure AD и т. д.) И при этом придерживаться аналогичного подхода?

Turcia 14.05.2021 12:56

привет, Турсия. Я никогда не пробовал работать с другими провайдерами, но я лично предлагаю попробовать новейшую весеннюю безопасность oauth2. Обсуждаемая в вопросе библиотека основана на весенней облачной безопасности, а возможность единого входа устарела и удалена в последней версии весенней загрузки.

Valerio Vaudi 16.05.2021 16:44

Я имею в виду, что ответ подходит для облачной безопасности Spring и устаревшей библиотеки oauth2, но эта библиотека устарела весной в пользу последней поддержки безопасности Spring для oauth2 и openid connect.

Valerio Vaudi 16.05.2021 16:46

Спасибо Валерио, посмотрю.

Turcia 17.05.2021 18:03

Другие вопросы по теме