Мне нужно использовать REST API приложения, защищенного Keycloak, которое выступает в роли брокера для OAUTH2-Provider.Использование API REST, защищенного Keycloak как брокер для OAUTH2-провайдера
Для этой цели я использую OAuth2RestTemplate и ResourceOwnerPasswordDetails. Я могу получить токен доступа у поставщика третьей части без каких-либо проблем, но как использовать его дальше, это вопрос. Использование его в заголовке как носитель не помогает.
Любые предложения?
OAuthConfig.java
@Bean
public ResourceOwnerPasswordResourceDetails resource(){
ResourceOwnerPasswordResourceDetails resource = new ResourceOwnerPasswordResourceDetails();
resource.setClientAuthenticationScheme(AuthenticationScheme.form);
resource.setAccessTokenUri(env.getProperty("access.token.uri"));
resource.setClientId(env.getProperty("access.client.id"));
resource.setGrantType("password");
resource.setClientSecret(env.getProperty("access.client.secret"));
resource.setUsername(env.getProperty("access.client.username"));
resource.setPassword(env.getProperty("access.client.password"));
resource.setScope(Arrays.asList(env.getProperty("access.client.scope")));
return resource;
}
Service для получения маркера доступа
@Autowired
private OAuthConfig authConfig;
@Override
public OAuth2AccessToken getAccessToken(){
ResourceOwnerPasswordAccessTokenProvider provider = new ResourceOwnerPasswordAccessTokenProvider();
OAuth2AccessToken accessToken = provider.obtainAccessToken(authConfig.resource(), new DefaultAccessTokenRequest());
return accessToken;
}
OAuth2RestTemplate
@Autowired private ProdAuthService authService;
OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(authConfig.resource(), new DefaultOAuth2ClientContext(authService.getAccessToken()));
restTemplate.setRequestFactory(requestFactory);
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_JSON);
header.set("Authorization", "Bearer " + authService.getAccessToken());
HttpEntity<String> request = new HttpEntity<String>(header);
ResponseEntity <ProcessInstanceLogWrapper> response = restTemplate.exchange(uri, HttpMethod.GET, request, new ParameterizedTypeReference<ProcessInstanceLogWrapper>(){});
ProcessInstanceLogWrapper json = response.getBody();
ошибка я получаю
Caused by: org.springframework.security.oauth2.client.http.AccessTokenRequiredException: OAuth2 access denied.
В Keycloak мы также используем URL авторизации, но использовать его с ResourceOwnerPasswordResourceDetails не представляется возможным. Это также может быть, по моему мнению, так, это не сработает.
Удалось ли вам это сделать? – Dineshmohan
никак ... По крайней мере, я не разрешил эту проблему. Если у вас есть одна и та же проблема, самое быстрое, но, к сожалению, не самое безопасное решение может состоять в том, чтобы включить базовый auth в подходе и использовать его ... Я сделал так ... – user3467471
Мне удалось заставить его работать. Поделитесь кодом завтра. – Dineshmohan