我正在编写一个微服务作为尤里卡客户端。我想使用 Oauth2 保护它们,所以我将其配置为资源服务器。
@SpringBootApplication
@EnableEurekaClient
@EnableResourceServer
public class CustomerServiceApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(CustomerServiceApplication.class, args);
}
这是 yml 配置。
security:
oauth2:
resource:
user-info-uri: https://api.github.com/user
到目前为止,它运行良好,我可以毫无问题地访问受保护的端点。现在我正在尝试将访问令牌中继到也配置为 ResourceServers 的其他一些微服务。为此,我创建了一个 OAuth2RestTemplate Bean。
@LoadBalanced
@Bean
public OAuth2RestTemplate oAuth2RestTemplate(UserInfoRestTemplateFactory factory) {
return factory.getUserInfoRestTemplate();
}
它使用@LoadBalanced 进行注释,因为我想在我调用的端点中使用 eureka 服务 ID。这是我的控制器映射之一:
@Autowired
private OAuth2RestTemplate oAuth2RestTemplate;
@GetMapping("/{customerId:\\d+}")
public @ResponseBody Customer getCustomer(@PathVariable long customerId) throws Exception{
Customer customer = this.oAuth2RestTemplate.getForObject(new URI("http://hbase-customer-reader/"+Long.toString(customerId)), Customer.class);
return customer;
}
这是问题所在:由于我使用的是功能区客户端,因此在调用底层微服务时,url ai.github.com 似乎被解释为服务 id,从而导致此错误:
UserInfoTokenServices : Could not fetch user details: class java.lang.IllegalStateException, No instances available for api.github.com
并在程序初始化:
Client: api.github.com instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=api.github.com,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null
如何使 UserInfoTokenServices 使用 github url(或我将在生产中使用的授权服务器 url)作为真实 URL,同时保持 eureka 客户端处于激活状态,以便我可以在我的 restTemplate 调用中使用服务 ID?
谢谢你的帮助。