spring-boot - OAuth2RestTemplate 与 Ribbon + Eureka
问题描述
我正在使用 Spring Cloud 和 Netflix OSS Eureka 和 Ribbon 开发微服务。我有另一个作为 oauth-server 运行的服务,它提供 OAuth2 令牌。我所有的微服务都在 Eureka 注册,包括 oauth-server。如果我将 oauth-server 的硬编码 url 用作“clientCredentialsResourceDetails.setAccessTokenUri("http://localhost:9000/oauth/token");”,我的整个解决方案就可以工作。但是当我尝试使用 oauth-server 的 Eureka Discovered url 时,例如 "clientCredentialsResourceDetails.setAccessTokenUri("http://oauth-server/oauth/token");" 我收到错误:java.net.UnknownHostException: oauth-server
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
@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;
}
我搜索了很多文档和在线帮助,但这些解决方案都不起作用。我认为这应该是一个简单的配置问题,现在已经耗尽了我两天的努力。
解决方案
我终于能够使用以下代码使其工作:
@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;
}
推荐阅读
- vb.net - 为 ListView 项分配多个标签
- python - GUI 的更新计数器,用于来自 GPIO 的每个高信号
- discord.js - TypeError:无法读取未定义 Discord Bot js 的属性“执行”
- django - Django用for循环过滤奇怪的行为
- numbers - 千里马。如何防止度数计算
- nativescript-vue - NativeScript-vue 条码创建
- microsoft-graph-api - 为团队会议的录制视频生成 URL
- r - 增加 geom_line() 堆栈之间的距离
- ruby-on-rails - 我应该把神社 image_uploader 文件放在哪里?
- javascript - 使用点击图片上的 URL 更新现有页面