Как отправить токен авторизации на предъявителя с помощью Spring Boot и @FeignClient

Я использую Spring Boot для написания приложения, которое взаимодействует с серверами HTTP rest. Один из серверов, к которым я подключаюсь (Wit.ai), использует токен авторизации beaerer. Запрос curl, дающий успешный ответ, выглядит так:

GET /message?q=sample message HTTP/1.1
Host: api.wit.ai
Authorization: Bearer XXXXXXXXXXXXX
Cache-Control: no-cache
Postman-Token: 526c3a11-8e61-4552-aa19-e913f6473753

Документы wit.ai говорят о токене следующее:

Wit.ai uses OAuth2 as an authorization layer. As such, every API request must contain an Authorize HTTP header with a token Access tokens are app specific.

Я пытаюсь отправить запрос GET на эту конечную точку в приложении Spring Boot с помощью @FeignClient. Однако конечная точка, похоже, не принимает мой токен авторизации. Вот мой код FeignClient

@FeignClient(name = "witGetter", url = "${wit.url}")
    public interface WitGetter {
        @RequestMapping(method = RequestMethod.GET, value = "/message?v=20180507q = {text}",
            headers = {"Authorization: Bearer XXXXXXXXXXXXX"})
        WitResponse getWitResponse(@PathVariable("text") final String text);
}

Как правильно передать такой токен авторизации? Я пробовал еще несколько вещей, но безуспешно. Спасибо за любой совет !!!

Кстати, следующий код работает с использованием традиционного интерфейса Feign, но в этом случае мне нужно использовать @FeignClient.

public interface WitGetter {
    @Headers("Authorization: Bearer XXXXXXXXXXXXX")
    @RequestLine("GET /message?q = {text}")
    WitResponse getWitResponse(@Param("text") String text);
}

(код ниже находится в отдельном файле конфигурации)

@Bean
    public WitGetter defaultWitGetter(@Value("https://api.wit.ai") final String witUrl){
        return Feign.builder().decoder(new GsonDecoder()).target(WitGetter.class, witUrl);

}

РЕДАКТИРОВАТЬ

Код ошибки, который я получаю при использовании приведенного выше кода:

Exception in thread "main" feign.FeignException: status 400 reading WitGetter#getWitResponse(String,String); content: { "error" : "Bad auth, check token/params", "code" : "no-auth" }

10
0
19 250
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При использовании Feign через Spring Cloud вы можете использовать его, как если бы вы определяли стандартный контроллер Spring MVC.

Пожалуйста, ознакомьтесь с моей статьей о передаче заголовков с помощью Feign: https://arnoldgalovics.com/passing-headers-with-spring-cloud-feign/

Подсказка: вы можете добавить параметр @RequestHeader("Authorization") String bearerToken в определение метода.

И тогда, конечно, назовите это как client.method(..., "Bearer " + token)

Я хочу получить этот bearerToken из файла application properties. У меня они постоянны для прокси-интерфейса, но изменяются в производственных и промежуточных средах. Как лучше всего это сделать? Интерфейс прокси-сервера Feign не позволяет мне использовать @Value, и я не хочу жестко кодировать этот токен в своем коде.

krozaine 23.06.2020 15:36

Есть ли способ сделать это возможным с помощью фильтров? Просто сделать это в одном простом фильтре, а не на каждый запрос симуляционного клиента ..

Carlos Cruz 29.09.2020 01:21

@CarlosCruz да, обратитесь к этому: arnoldgalovics.com/…

galovics 29.09.2020 22:44

Другие вопросы по теме