2
votes

spring boot récupère le jeton du porteur à partir de la demande et appelle un autre microservice

J'ai un microservice Spring Boot qui agit comme une passerelle et qui a besoin d'obtenir l'en-tête d'autorisation de la requête, de l'attacher à une nouvelle requête et de transmettre la requête à un autre microservice. Je fais actuellement ce qui suit et cela fonctionne, mais je me demande s'il existe une meilleure façon de le faire.

@GetMapping
public List<Task> getTasks(HttpServletRequest request, HttpServletResponse httpresponse) {

    String bearerToken = request.getHeader("Authorization");

    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.set("Authorization", bearerToken);

    HttpEntity<String> httpEntity = new HttpEntity <String> (httpHeaders);

    String getTasksURL = "http://localhost:8082/tasks";
    ResponseEntity<List<Task>> response = restTemplate.exchange(
            getTasksURL,
            HttpMethod.GET,
            httpEntity,
            new ParameterizedTypeReference<List<Task>>(){});
    List<Task> taskslist = response.getBody();
    return taskslist;
}

S'il existe des exemples de code autour de l'utilisation de jwt, veuillez fournir des liens. La plupart des exemples de code ne montrent que la configuration de jwt dans un seul microservice, mais n'ont pas vu de projet qui finit par appeler un autre microservice, passant les jetons dans les deux sens


2 commentaires

que voulez-vous dire est-ce la meilleure façon?


Avec Spring Boot, il existe de nombreuses façons de faire les choses. Je ne suis pas au courant de tous les moyens, alors je me demandais s'il y avait une meilleure solution.


3 Réponses :


1
votes

Je ne vois rien de mal à la façon dont vous le faites. Cependant, si vous implémentez une passerelle qui ne fait que transmettre les demandes (peut-être avec une limitation de débit ou une sécurité, mais pas vraiment une logique métier), je vous recommande de consulter http://spring.io/projects/spring-cloud-netflix - la partie proxy Zuul. Vous pouvez avoir une passerelle API entièrement fonctionnelle en seulement quelques classes et un total de <200 lignes de code, configuration comprise. C'est plutôt sympa!


0 commentaires

0
votes

Il est préférable d'utiliser le proxy zuul comme passerelle. Mais gardez à l'esprit qu'il ne transfère pas votre en-tête d'autorisation par défaut au service externe. Et si vous voulez le faire, cela peut être simplement fait par une seule configuration de ligne. Vous pouvez regarder Comment obtenir le nom d'utilisateur du jeton JWT lors de la demande d'un autre service après l'authentification?


0 commentaires

1
votes

Peut-être vaut-il mieux encapsuler le code traitant de l'autorisation dans un intercepteur séparé. De cette façon, votre code devient plus simple et plus clair.

Un tel intercepteur peut ressembler à:

@Bean
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory());
    restTemplate.setInterceptors(Collections.singletonList(new RestTemplateHeaderModifierInterceptor()));
    return restTemplate;
}

Vous devez maintenant ajouter cet intercepteur à votre restTemplate lors de sa création

class RestTemplateHeaderModifierInterceptor implements  ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(
  HttpRequest request, 
  byte[] body, 
  ClientHttpRequestExecution execution) throws IOException {
    // Set your new Header here...
    // ...
    ClientHttpResponse response = execution.execute(request, body);
    return response;
}}


1 commentaires

Mais d'où vient le jeton porteur dans ce code ??