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
разрешил проблему для меня.