2015-04-03 19 views
3

Я пытаюсь реализовать Feign Clients, чтобы получить информацию о пользователе из сервиса пользователя, в настоящее время я запрашиваю с oAuth2RestTemplate, он работает. Но теперь я хочу перейти на Feign, но я получаю код ошибки 401, вероятно, потому, что он не несет токены пользователя, поэтому есть способ настроить, если Spring Support для Feign использует RestTemplate, поэтому я могу использовать мой собственный Бин?Spring Cloud Feign with OAuth2RestTemplate

Сегодня я реализую таким образом

Службы клиента

@Retryable({RestClientException.class, TimeoutException.class, InterruptedException.class}) 
@HystrixCommand(fallbackMethod = "getFallback") 
public Promise<ResponseEntity<UserProtos.User>> get() { 
    logger.debug("Requiring discovery of user"); 
    Promise<ResponseEntity<UserProtos.User>> promise = Broadcaster.<ResponseEntity<UserProtos.User>>create(reactorEnv, DISPATCHER) 
      .observe(Promises::success) 
      .observeError(Exception.class, (o, e) -> Promises.error(reactorEnv, ERROR_DISPATCHER, e)) 
      .filter(entity -> entity.getStatusCode().is2xxSuccessful()) 
      .next(); 
    promise.onNext(this.client.getUserInfo()); 
    return promise; 

} 

И клиентские

@FeignClient("account") 
public interface UserInfoClient { 

    @RequestMapping(value = "/uaa/user",consumes = MediaTypes.PROTOBUF,method = RequestMethod.GET) 
    ResponseEntity<UserProtos.User> getUserInfo(); 
} 

ответ

7

Feign не использует RestTemplate так что вы Мне нужно найти другой способ. Если вы создадите @Bean типа feign.RequestInterceptor, он будет применяться ко всем запросам, поэтому, возможно, одним из тех, у кого есть OAuth2RestTemplate (просто для управления приобретением токена), будет лучшим вариантом.

+0

Благодаря @ Dave, создавая боб 'RequestInterceptor' и установив маркер однонаправленного от oauth на обработанном заголовке RequestTemplate –

+0

Отлично. Может быть, вы могли бы внести свой вклад в весеннюю облачную безопасность? –

+0

Да, конечно, я подниму билет на GitHub, поэтому мы можем обсудить его там. –

3

это мое решение, только в качестве дополнения к другому ответу с исходным кодом, который реализует интерфейс feign.RequestInterceptor

@Bean 
public RequestInterceptor requestTokenBearerInterceptor() { 
    return new RequestInterceptor() { 
     @Override 
     public void apply(RequestTemplate requestTemplate) { 
      OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) 
        SecurityContextHolder.getContext().getAuthentication().getDetails(); 

      requestTemplate.header("Authorization", "bearer " + details.getTokenValue()); 
     } 
    }; 
} 
+0

Я использовал конкретную реализацию, поэтому я мог избежать нулевых указателей и отправки токена незащищенному ресурсу в случае, если запрос не содержит токен или аутентифицированный пользователь, так как пока мы не можем настроить клиентский перехватчик. Если вас это интересует, вы можете проверить его здесь: https://github.com/crly/commons/blob/master/src/main/java/io/curly/commons/config/feign/OAuth2FeignRequestInterceptor.java –

+0

хорошее решение !. в моем пейзаже (один сервер ресурсов запрашивает другой) всегда требуется аутентифицированный пользователь/токен. Спасибо за акцию! –

+0

Просто добавьте мои два цента: важно настроить sessionCreationPolicy как минимум на «IF_REQUIRED», поскольку SecurityContext будет пустым иначе =) Спасибо за это решение, наконец, получил реле токена с feign –