2

我正在编写一个微服务作为尤里卡客户端。我想使用 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?

谢谢你的帮助。

4

0 回答 0