KeyCloakで保護されたアプリケーションのREST APIを消費する必要があります。これは、ブローカからOAUTH2プロバイダへの役割を果たします。OAUTH2プロバイダのブローカとしてKeycloakでREST APIを使用する
この目的のために、私はOAuth2RestTemplateとResourceOwnerPasswordDetailsを使用します。 第三者プロバイダから問題なくアクセストークンを取得できますが、それをどのように利用すればよいのでしょうか。ベアラとしてヘッダーでそれを使用することは役に立ちません。
提案がありますか?アクセストークン
@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.
を得る
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;
}
サービス
KeycloakではAuthorizaion URLも使用していますが、ResourceOwnerPasswordResourceDetailsで使用することはできないようです。それはまた、私の意見によると、それは動作しません。
これはうまく動作しますか? – Dineshmohan
途中で...少なくとも、私はこの問題を解決していませんでした。あなたが同じ問題を抱えているなら、最も速いが、残念なことに安全な解決策ではなく、基本認証を使用してそれを使用することができます...私はそうしました... – user3467471
私はそれを稼働させることができました。明日、コードを共有します。 – Dineshmohan