【发布时间】:2016-10-11 03:24:41
【问题描述】:
我必须使用受 Keycloak 保护的应用程序的 REST API,它充当 OAUTH2-Provider 的代理。
为此,我使用 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;
}
获取访问令牌的服务
@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 中,我们也使用 Authorizaion URL,但似乎无法将其与 ResourceOwnerPasswordResourceDetails 一起使用。根据我的观点,它也可能是这种情况,它不起作用。
【问题讨论】:
-
你成功了吗?
-
没办法...至少,我还没有解决这个问题。如果您有同样的问题,最快但不幸的是不是最安全的解决方案可能是启用基本身份验证并使用它......我已经做到了......
-
我设法让它工作。明天分享代码。
-
听起来不错!我期待您的解决方案!
标签: java spring rest oauth2 keycloak