Spring REST api OAuth2 проверяет токен с внешнего сервера авторизации

Я пытаюсь реализовать свой REST API, который является сервером ресурсов, используемым мобильными приложениями в моем потоке OAuth2. У меня есть внешний сервер авторизации, сделанный кем-то другим. В настоящее время я реализовал получение токена доступа в мобильном приложении (я полагаю, клиент в потоке OAuth2?), И теперь, когда я делаю вызовы от клиента на сервер ресурсов (REST API), мне нужен сервер ресурсов для проверки токена из сервер авторизации, прежде чем завершить запрос для клиента. Я попытался найти различные учебники по Spring-security-OAuth2, и мне удалось немного продвинуться. Вот что я придумал на данный момент:

@Configuration
@EnableResourceServer
public class SecurityConfig extends ResourceServerConfigurerAdapter  {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
         .antMatchers("/**").authenticated();
    }

    @Primary
    @Bean
    public RemoteTokenServices tokenService() {
        RemoteTokenServices tokenService = new RemoteTokenServices();
        tokenService.setCheckTokenEndpointUrl(
          end_point_url);
        return tokenService;
    }

}

В настоящее время сервер авторизации end_point_url возвращает только http 200, когда ему предоставлен действительный токен в заголовках запроса как Authorization: Bearer VALID_TOKEN. Прямо сейчас мои пути в REST API «защищены», но все, что нужно, это передать заголовок Authorization: Bearer и вообще не использовать токен или какой-либо токен при выполнении запросов к моему REST API, и он считает его аутентифицированным. Я явно что-то пропустил или не понял. Я думаю, что он вообще не проверяет токен с сервера авторизации или ..? Честно говоря, я не знаю. Есть идеи, что мне нужно делать?

Обновлено:

Как я прокомментировал ниже, я следил за журналами своих внешних серверов авторизации, а также за журналами приложений весеннего отдыха. Я обнаружил, что с этой конфигурацией, которую я представил здесь, приложение Spring не извлекает/использует токен авторизации, который поступает от клиента (мобильного приложения) как Authorization: Bearer VALID_TOKEN, а вместо этого делает вызов на сервер авторизации с такими заголовками, как Authorization: Basic SOME_RANDOM_TOKEN. Почему игнорирует и не использует токен с тегом Bearer из мобильного приложения(клиента)?

вы упустили несколько вещей. Я рекомендую вам прочитать больше о весенних работах по обеспечению безопасности в их справочном руководстве. Также этот учебник может дать вам больше информации. baeldung.com/spring-security-oauth-jwt

Toerktumlare 22.05.2019 14:53

Я читал этот учебник, и я просто не понимаю, что именно мне нужно. По сути, я мог бы реализовать свою собственную версию проверки токена с внешнего сервера аутентификации, проанализировав токен из заголовка и выполнив вызов сервера авторизации с включенным токеном и исключив исключение, если ответ не 200. Но есть ли правильный способ сделать это «автоматически», используя функции spring-security-oauth2?

Clx3 22.05.2019 16:03

ну, это зависит от того, если вы просто используете аутентификацию на основе токенов (не jwt), вы можете определить в своем application.properties, где сервер аутентификации docs.spring.io/spring-boot/docs/current/reference/htmlsingle‌​/…, еще один совет для вас - определить logging.level.org.springframework.security=DEBUG в вашем application.properties, и вы можете точно увидеть, что делает Spring Security в журналах.

Toerktumlare 22.05.2019 17:08

Я слежу за журналами своего сервера авторизации, а также за журналами весенних приложений. Я заметил, что spring делает запрос на авторизацию на сервер авторизации, но теперь он неправильно использует заголовки. Он ставит что-то вроде Authorization: basic $some_random_token, когда он должен взять токен доступа из запроса клиента (мобильное приложение), заголовки которого установлены как Authorization: Bearer $Valid_access_token. Но по какой-то причине он не извлекает его и не использует из мобильного приложения (клиента)...

Clx3 23.05.2019 13:27
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
0
4
1 514
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Итак, я нашел способ сделать именно то, что мне нужно. Я не совсем уверен, что это правильный путь, но он ТОЧНО делает то, что я хотел. Так что в основном вместо использования RemoteTokenServices я использовал UserInfoTokenServices вот так:

@Override
public void configure(final HttpSecurity http) throws Exception {
    http.csrf().disable();
    http.authorizeRequests().anyRequest().authenticated();
}

@Primary
@Bean
public UserInfoTokenServices tokenService() {
    final UserInfoTokenServices tokenService = new UserInfoTokenServices(USER_INFO_ENDPOINT, "");
    return tokenService;
}

Заменив мои предыдущие конфигурации приведенным выше примером, мой API теперь отправляет запрос на мой сервер авторизации при КАЖДОМ запросе к API для получения информации о пользователе с данным токеном доступа. Если он получает информацию о пользователе, мы Gucci, в противном случае мы неавторизованы. Надеюсь, это поможет кому-то!

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