Клиент Spring Security Oauth2 не может получить токен доступа с неверным кодом запроса = 415, сообщение = неподдерживаемJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Клиент Spring Security Oauth2 не может получить токен доступа с неверным кодом запроса = 415, сообщение = неподдерживаем

Сообщение Anonymous »

Используя Spring Boot, я настроил bean-компонент Oauth2RestTemplate в классе конфигурации и соответствующие свойства в файле свойств. Я использовал кодовый генератор Swagger для создания заглушки клиента. Когда я пытаюсь вызвать RESTful API, Spring не удается получить токен доступа, основной причиной которого является «неподдерживаемый тип носителя». Ниже приведена трассировка стека, моя конфигурация клиента Spring Security и мои попытки исправить. Будем очень признательны за любую помощь!
Получение токена из https://dev-api.some-domain.com/auth/oauth2/v1/token
ClientCredentialsAccessTokenProvider.doWithRequest — Форма кодирования и отправки:
{grant_type=[client_credentials],scope=[read], client_id=[val from props], client_secret=[значение из реквизита]}

error="access_denied", error_description="Токен доступа запрещен.
в org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport.retrieveToken( OAuth2AccessTokenSupport.java:142)
на org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsAccessTokenProvider.obtainAccessToken(ClientCredentialsAccessTokenProvider.java:44)
на org.springframework.security.oauth2.client.token.AccessTokenProviderChain.obtainNewAccessTokenInternal(AccessTokenProviderChain.java:148)
на org.springframework.security.oauth2.client.token.AccessTokenProviderChain.obtainAccessToken(AccessTokenProviderChain.java:121)
в org.springframework.security.oauth2.client.OAuth2RestTemplate.acquireAccessToken(OAuth2RestTemplate.java:221)
в org.springframework.security.oauth2.client.OAuth2RestTemplate.getAccessToken(OAuth2RestTemplate.java:173)
в org.springframework.security.oauth2.client.OAuth2RestTemplate.createRequest(OAuth2RestTemplate.java:105)
в org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:735)
на org.springframework.security.oauth2.client.OAuth2RestTemplate.doExecute(OAuth2RestTemplate.java:128)
на org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:651)
на com.my.co.service.holidays.client.invoker.ApiClient.invokeAPI(ApiClient.java:518)
в com.my.co.service.holidays.client.api.HolidaysApi.getHolidays(kHolidaysApi.java:183)
на com.my.co.service.holiday.HolidaysApiTest.getHolidaysTest(HolidaysApiTest.java:66) в sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
на java.lang.reflect.Method.invoke(Method.java:498)
на org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686)
на org.junit.jupiter.engine.execution.MethodInvocate.proceed(MethodInvocate.java:60)
на org.junit.jupiter.engine.execution.InvoctionInterceptorChain$ValidatingInvocate.proceed(InvoctionInterceptorChain.java:131)
по адресу org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
в org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
на org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
на org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
на org.junit.jupiter.engine.execution.InvocateInterceptorChain$InterceptedInvoke.proceed(InvokeInterceptorChain.java:106)
в org.junit.jupiter.engine.execution.InvoctionInterceptorChain.proceed(InvoctionInterceptorChain.java:64)
на org.junit.jupiter.engine.execution.InvoctionInterceptorChain.chainAndInvoke(InvoctionInterceptorChain.java:45)
на org.junit.jupiter.engine.execution.InvoctionInterceptorChain.invoke(InvoctionInterceptorChain.java:37)
на org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
на org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
на org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:212)
в org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
на org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:208)
в org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
на org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71)
на org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursily$5(NodeTestTask.java:135)
на org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java: 73)
в org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursivity$7(NodeTestTask.java:125)
на org.junit.platform.engine.support.hierarchical.Node.around(Node.java: 135)
в org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursily$8(NodeTestTask.java:123)
на org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java: 73)
в org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursically(NodeTestTask.java:122)
на org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) в java.util.ArrayList.forEach(ArrayList.java:1257)
на org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
на org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursily$5(NodeTestTask.java:139)
на org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java: 73)
в org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursivity$7(NodeTestTask.java:125)
на org.junit.platform.engine.support.hierarchical.Node.around(Node.java: 135)
в org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursivity$8(NodeTestTask.java:123)
на org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java: 73)
в org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursily(NodeTestTask.java:122)
на org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) в java.util.ArrayList.forEach(ArrayList.java:1257)
на org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
на org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursily$5(NodeTestTask.java:139)
на org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java: 73)
в org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursivity$7(NodeTestTask.java:125)
на org.junit.platform.engine.support.hierarchical.Node.around(Node.java: 135)
в org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursily$8(NodeTestTask.java:123)
на org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java: 73)
в org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursically(NodeTestTask.java:122)
на org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) в org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
на org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) в org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
в org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248)
в org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211)
на org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226)
в org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199)
на org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132)
на com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69)
на com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
на com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
на com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
**Причина: error="invalid_request", error_description="{code=415, message=Неподдерживаемый тип носителя}"**
в org.springframework.security.oauth2.common.Exceptions.OAuth2ExceptionJackson2Deserializer.deserialize(OAuth2ExceptionJackson2Deserializer.java:119)
в org.springframework.security.oauth2.common.Exceptions.OAuth2ExceptionJackson2Deserializer.deserialize(OAuth2ExceptionJackson2Deserializer.java:33)
на com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4524)
на com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3519)
на org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:269)
на org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readInternal(AbstractJackson2HttpMessageConverter.java:249)
на org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:199)
на org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport$AccessTokenErrorHandler.handleError(OAuth2AccessTokenSupport.java:237)
в org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
в org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:782)
на org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:740)
на org.springframework.web.client.RestTemplate.execute(RestTemplate.java:695)
в org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport.retrieveToken(OAuth2AccessTokenSupport.java:137)
. .. еще 75

Ниже приведена моя конфигурация для клиента Oauth2
application.properties:
spring.security.oauth2.holiday.client.clientId=valid_key_is_here
spring.security.oauth2.holiday.client.clientSecret=valid_secret_is_here
spring.security.oauth2.holiday.client.accessTokenUri=https://dev-api.some-domain.com/auth/oauth2/v1/token
spring.security.oauth2.holiday.client.clientAuthenticationScheme=form
spring.security.oauth2.holiday.client.grantType=client_credentials
spring.security.oauth2.holiday.client.scope=read

@Configuration
@EnableOAuth2Client
public class SpringOauthRestClientConfig {

@Bean
@ConfigurationProperties("spring.security.oauth2.holiday.client")
public OAuth2ProtectedResourceDetails oAuthDetails() {
return new ClientCredentialsResourceDetails();
}

@Bean
public RestTemplate restTemplate() {
OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(oAuthDetails());

for (HttpMessageConverter converter : restTemplate.getMessageConverters()) {
if (converter instanceof AbstractJackson2HttpMessageConverter) {
ObjectMapper mapper = ((AbstractJackson2HttpMessageConverter) converter).getObjectMapper();
mapper.registerModule(new JavaTimeModule());
}
}
// This allows us to read the response more than once - Necessary for debugging.
restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(restTemplate.getRequestFactory()));
return restTemplate;
}
}

Я попытался расширить класс Spring ClientCredentialsAccessTokenProvider, чтобы предоставить свою собственную реализацию метода getAccessToken(), чтобы я мог установить Content-Type в заголовке. Затем я добавляю свой собственный класс в RestTemplate. По-прежнему возникает та же ошибка, когда Spring пытается получить токен доступа.
public class ClientCredentialsCustomAccessTokenProvider extends ClientCredentialsAccessTokenProvider {

@Override
public OAuth2AccessToken obtainAccessToken(OAuth2ProtectedResourceDetails details, AccessTokenRequest request) throws UserRedirectRequiredException, AccessDeniedException, OAuth2AccessDeniedException {
ClientCredentialsResourceDetails resource = (ClientCredentialsResourceDetails)details;

HttpHeaders headers1 = new HttpHeaders();
headers1.add("Content-Type", "application/x-www-form-urlencoded");

return retrieveToken(request, resource, this.getParametersForTokenRequest(resource), headers1);
}

Если я использую Postman для доступа к серверу авторизации, я успешно получаю обратно токен
{
"tokenType": "BearerToken",
"expiresIn": "899",
"accessToken": "dv6fnhBALtNzlhjMyCRfa9JDYodd"
}

используя эти настройки в Postman
POST request,
Authorization - Basic with my client_id/secret as username/password,
Headers - Content-Type = application/x-www-form-urlencoded,
Body - grant_type = client_credentials

В тесте JUnit я могу установить значение токена (и обойти внедрение RestTemplate Spring), используя ответ Postman, и без проблем вызвать службу.
HolidaysApi api = new HolidaysApi();
OAuth oAuth2 = (OAuth) api.getApiClient().getAuthentication("OAuth2");
oAuth2.setAccessToken("dv6fnhBALtNzlhjMyCRfa9JDYodd");


Подробнее здесь: https://stackoverflow.com/questions/638 ... est-code-4
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»