web-dev-qa-db-fra.com

Comment envoyer un jeton d'autorisation de porteur à l'aide de Spring Boot et @FeignClient

J'utilise Spring Boot pour écrire une application qui interagit avec les serveurs de repos HTTP. L'un des serveurs auxquels je me connecte (Wit.ai) utilise un jeton d'autorisation beaerer. Une demande de boucle qui donne une réponse réussie ressemble à ceci:

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

Les documents wit.ai disent ce qui suit à propos du jeton,

Wit.ai utilise OAuth2 comme couche d'autorisation. En tant que tel, chaque demande d'API doit contenir un en-tête HTTP Authorize avec un jeton Les jetons d'accès sont spécifiques à l'application.

J'essaie d'envoyer une demande GET à ce point de terminaison dans une application Spring Boot en utilisant @FeignClient. Cependant, le point de terminaison ne semble pas accepter mon jeton d'autorisation. Voici mon code 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);
}

Quelle est la bonne façon de passer un tel jeton d'autorisation? J'ai essayé quelques autres choses, mais en vain. Merci pour tout conseil !!!

Soit dit en passant, le code suivant fonctionne à l'aide d'une interface Feign traditionnelle, mais je dois utiliser @FeignClient dans ce cas.

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

(le code ci-dessous est dans un fichier de configuration séparé)

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

}

MODIFIER

Le code d'erreur que j'obtiens lors de l'utilisation du code ci-dessus est:

Exception dans le thread "principal" feign.FeignException: état 400 lecture WitGetter # getWitResponse (String, String); content: {"error": "Bad auth, check token/params", "code": "no-auth"}

6
Trey Bernstien

Lorsque vous utilisez Feign via Spring Cloud, vous pouvez l'utiliser comme vous définiriez un contrôleur Spring MVC standard.

Veuillez consulter mon article ici sur le passage des en-têtes avec Feign: http://blog.arnoldgalovics.com/2018/02/15/passing-headers-with-spring-cloud-feign/

Conseil rapide: vous pouvez ajouter un paramètre @RequestHeader("Authorization") String bearerToken à la définition de la méthode.

Et puis bien sûr, appelez-le comme client.method(..., "Bearer " + token)

12
galovics