带功能区+尤里卡的OAuth2RestTemplate [英] OAuth2RestTemplate with Ribbon + Eureka
问题描述
我正在使用Spring Cloud和Netflix OSS Eureka和Ribbon开发微服务.我有另一项服务作为提供OAuth2令牌的oauth-server运行.我所有的微服务都已向Eureka注册,包括oauth-server. 如果我使用oauth-server的硬编码url作为"clientCredentialsResourceDetails.setAccessTokenUri("http://localhost:9000/oauth/token"); 但是当我尝试使用Eureka发现的oauth-server的url,例如"clientCredentialsResourceDetails.setAccessTokenUri("http://oauth-server/oauth/token");我收到错误消息: java.net.UnknownHostException:oauth服务器
I am working on microservices with Spring Cloud and Netflix OSS Eureka and Ribbon. I have another service running as oauth-server which provides OAuth2 token. All my microservices are registered with Eureka including oauth-server. My whole solution works if I use hardcoded url of oauth-server as "clientCredentialsResourceDetails.setAccessTokenUri("http://localhost:9000/oauth/token");" but when I try to use Eureka Discovered url of oauth-server like "clientCredentialsResourceDetails.setAccessTokenUri("http://oauth-server/oauth/token");" I get error: java.net.UnknownHostException: oauth-server
MyConfig.java
MyConfig.java
@Bean(name = "myOauth2RestTemplate")
@LoadBalanced
public OAuth2RestOperations restTemplate(RestTemplateCustomizer customizer,
ClientCredentialsResourceDetails resourceDetails) {
OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(resourceDetails);
ClientCredentialsAccessTokenProvider provider = new ClientCredentialsAccessTokenProvider();
restTemplate.setAccessTokenProvider(provider);
customizer.customize(restTemplate);
return restTemplate;
}
@Bean
public ClientCredentialsResourceDetails resourceDetails() {
ClientCredentialsResourceDetails clientCredentialsResourceDetails = new ClientCredentialsResourceDetails();
clientCredentialsResourceDetails.setAccessTokenUri("http://oauth-server/oauth/token");
clientCredentialsResourceDetails.setId("1");
clientCredentialsResourceDetails.setClientId("candy");
clientCredentialsResourceDetails.setClientSecret("123");
clientCredentialsResourceDetails.setScope(Arrays.asList("read", "write"));
clientCredentialsResourceDetails.setGrantType("client_credentials");
return clientCredentialsResourceDetails;
}
MyController.java
MyController.java
@Autowired
@Qualifier("myOauth2RestTemplate")
@LoadBalanced
private OAuth2RestTemplate myOauth2RestTemplate;
@GetMapping("/secure/hello")
public String getSecureData() {
String result = myOauth2RestTemplate.getForObject("http://securems/secure/hello", String.class);
return result;
}
我搜索了很多文档和在线帮助,但是这些解决方案没有用. 我以为这本来应该是一个简单的配置问题,但是我花了两天的时间才把它吃光.
I have searched through a lot of documentation and online help, but those solutions didn't work. I thought this should have been an easy configuration issue has now eaten up my two days of effort.
推荐答案
我终于能够使它与以下代码一起使用:
I was finally able to make it work with following code:
@Bean
@LoadBalanced
public OAuth2RestTemplate restTemplate(SpringClientFactory clientFactory) {
OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(resourceDetails());
RibbonLoadBalancerClient ribbonLoadBalancerClient = new RibbonLoadBalancerClient(clientFactory);
LoadBalancerInterceptor loadBalancerInterceptor = new LoadBalancerInterceptor(ribbonLoadBalancerClient);
ClientCredentialsAccessTokenProvider accessTokenProvider = new ClientCredentialsAccessTokenProvider();
accessTokenProvider.setInterceptors(Arrays.asList(loadBalancerInterceptor));
restTemplate.setAccessTokenProvider(accessTokenProvider);
return restTemplate;
}
这篇关于带功能区+尤里卡的OAuth2RestTemplate的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!