Spring -Security-Oauth2: для доступа к этому ресурсу требуется полная аутентификация

Я пытаюсь использовать spring-security-oauth2.0 с конфигурацией на основе Java. Моя конфигурация выполняется, но когда я развертываю приложение на tomcat и нажимаю на /oauth/token url для токена доступа, Oauth генерирует следующую ошибку:

<oauth>
<error_description>Full authentication is required to access this resource</error_description>
<error>unauthorized</error>
</oauth>

Моя конфигурация находится на Git концентраторе, нажмите на ссылку

Код большой, поэтому обратитесь к git. Я использую хром-почтальон-клиент для отправки запроса. Это моя просьба.

POST /dummy-project-web/oauth/token HTTP/1.1
Host: localhost:8081
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials&client_id=abc%40gmail.com&client_secret=12345678 

Ошибка аналогична, URL-адрес защищен Oauth, но в конфигурации я предоставляю все разрешения для доступа к этому URL-адресу. Какова фактическая проблема?

Ответы

Ответ 1

client_id и client_secret, по умолчанию, должны находиться в заголовке авторизации, а не в элементе form-urlencoded.

  • Совместите ваши client_id и client_secret с двоеточием между ними: [email protected]:12345678.
  • База 64 кодирует результат: YWJjQGdtYWlsLmNvbToxMjM0NTY3OA==
  • Задайте заголовок авторизации: Authorization: Basic YWJjQGdtYWlsLmNvbToxMjM0NTY3OA==

Ответ 2

По умолчанию Spring OAuth требует базовой HTTP-аутентификации. Если вы хотите отключить его с помощью Java-конфигурации, вы должны разрешить проверку подлинности для таких клиентов следующим образом:

@Configuration
@EnableAuthorizationServer
protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter {
  @Override
  public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
    oauthServer.allowFormAuthenticationForClients();
  }
}

Ответ 3

Причина в том, что по умолчанию /oauth/token точка /oauth/token защищена с помощью /oauth/token аутентификации доступа.

Все, что вам нужно сделать, это добавить заголовок Authorization к вашему запросу.

Вы можете легко проверить это с помощью такого инструмента, как curl, выполнив следующую команду:

curl.exe --user [email protected]:12345678 http://localhost:8081/dummy-project-web/oauth/token?grant_type=client_credentials

Ответ 4

С Spring OAuth 2.0.7-RELEASE для меня работает следующая команда

curl -v -u [email protected]:12345678 -d "grant_type=client_credentials" http://localhost:9999/uaa/oauth/token

Он также работает с Chrome POSTMAN, просто убедитесь, что вы клиент и секрет на вкладке "Basic Auth", установите метод "POST" и добавьте тип гранта на вкладке "данные формы".

Ответ 5

Вы должны предварительно аутентифицировать токен apis "/oauth/token"

расширить ResourceServerConfigurerAdapter и переопределить configure function чтобы сделать это.

например:

http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests().antMatchers("/oauth/token").permitAll().
anyRequest().authenticated();

Ответ 6

@EnableWebSecurity полную аутентификацию. Проверьте, используете ли вы его. Пожалуйста, поделитесь, если ваше исправление было другим.

Ответ 7

настройка management.security.enabled=false в application.properties разрешил проблему для меня.