Как использовать Eureka Names с OAuth2RestTemplate - PullRequest
0 голосов
/ 28 сентября 2018

Я использую OAuth2RestTemplate для передачи oauth-токена с запросами REST.Однако теперь мне нужно жестко закодировать мои URL-адреса, такие как

restTemplate.postForLocation("http://localhost:5555/other-service2/message", "Message")

, тогда как когда я использовал самостоятельно созданный bean-аннотированный (используя @LoadBalanced) компонент RestTemplate, я могу сделать что-то вроде

 restTemplate.postForLocation("http://service1/other-service2/message", "Message")

Это связано с тем, что при использовании LoadBalanced он автоматически становится шаблоном отдыха ленты, который позволяет использовать функции обнаружения служб или Eureka, но когда вы аннотируете компонент OAuth2RestTemplate с @Loadbalanced, это вызовет какую-то ошибку ввремя выполнения при попытке использовать OAuth2RestTemplate, который говорит, что

  o.s.b.a.s.o.r.UserInfoTokenServices      : Could not fetch user details: class java.lang.IllegalStateException, No instances available for localhost

My OAuth2RestTemplate создание выглядит как

@LoadBalanced
@Bean
public OAuth2RestTemplate restTemplate(final UserInfoRestTemplateFactory factory) {
    final OAuth2RestTemplate userInfoRestTemplate = factory.getUserInfoRestTemplate();
    return userInfoRestTemplate;
}

Как я могу использовать функции обнаружения служб, а также функции балансировки нагрузки ленты Eureka, на OAuth2RestTemplate?

1 Ответ

0 голосов
/ 02 октября 2018

Я думаю, это то, что вы можете попробовать.

В моем проекте мы также используем OAuth2, Eureka, Ribbon для микросервисов, чтобы общаться друг с другом.Чтобы использовать Ribbon с OAuth2, мы выбрали несколько иной подход.

Сначала оставим restTemplate без изменений.

  @LoadBalanced
  @Bean
  public RestTemplate restTemplate() {

Однако мы создали FeignClientIntercepter, реализующий RequestIntercepter, который устанавливает токены авторизации дляOAuth при отправке запроса через restTemplate.

  @Component
  public class UserFeignClientInterceptor implements RequestInterceptor {

    private static final String AUTHORIZATION_HEADER = "Authorization";
    private static final String BEARER_TOKEN_TYPE = "Jwt";

    @Override
    public void apply(RequestTemplate template) {
      SecurityContext securityContext = SecurityContextHolder.getContext();
      Authentication authentication = securityContext.getAuthentication();

      if (authentication != null && authentication
          .getDetails() instanceof OAuth2AuthenticationDetails) {
        OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) authentication
          .getDetails();
        template.header(AUTHORIZATION_HEADER,
            String.format("%s %s", BEARER_TOKEN_TYPE, details.getTokenValue()));
      }
    }
  }

И если вы попытаетесь создать весенний проект msa, я бы предпочел использовать Feign-client вместо restTemplate.

@FeignClient("your-project-name")
public interface YourProjectClient {

  @GetMapping("your-endpoint")
  JsonObject getSomething();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...