web-dev-qa-db-fra.com

Comment obtenir un jeton au porteur de l'en-tête d'une requête en Java boot?

Bonjour à quoi essayer d'obtenir est d'obtenir un jeton au porteur qui a été soumis à partir de l'extrémité frontale dans Java Contrôleur de démarrage Spring Restapi et faire une autre demande en utilisant Feign Client sur un autre microservices? Voici ce que je fais

enter image description here

l'image ci-dessus est la façon dont je fais ma demande de Postman, et voici mon code de contrôleur:

@Operation(summary = "Save new")
@PostMapping("/store")
public ResponseEntity<ResponseRequest<TransDeliveryPlanning>> saveNewTransDeliveryPlanning(
        @Valid @RequestBody InputRequest<TransDeliveryPlanningDto> request) {

    TransDeliveryPlanning newTransDeliveryPlanning = transDeliveryPlanningService.save(request);

    ResponseRequest<TransDeliveryPlanning> response = new ResponseRequest<TransDeliveryPlanning>();

    if (newTransDeliveryPlanning != null) {
        response.setMessage(PESAN_SIMPAN_BERHASIL);
        response.setData(newTransDeliveryPlanning);
    } else {
        response.setMessage(PESAN_SIMPAN_GAGAL);
    }

    return ResponseEntity.ok(response);
}

et voici comment mon service ressemble à:

public TransDeliveryPlanning save(InputRequest<TransDeliveryPlanningDto> request) {
       Future<List<PartnerDto>> initPartners = execs.submit(getDataFromAccount(transDeliveryPlanningDtSoDtoPartnerIdsSets));

}

public Callable<List<PartnerDto>> getDataFromAccount(Set<Long> ids) {

    String tokenString = "i should get the token from postman, how do i get it to here?";
    List<PartnerDto> partnerDtoResponse = accountFeignClient.getData("Bearer " + tokenString, ids);
    
    return () -> partnerDtoResponse;
}

comme vous pouvez le constater, dans "Tokenstring", j'ai mis une chaîne que j'ai interrogée sur, comment puis-je l'obtenir chez Postman?

11
Ke Vin

j'ai eu la réponse, mais je pense que j'attendrai encore une meilleure option, car ma réponse ici est que je dois ajouter @requestheader dans chaque contrôleur pour obtenir la valeur de mon jeton et obtenir le jeton avec String token = headers.getFirst(HttpHeaders.AUTHORIZATION);, Et voici mon contrôleur complet:

@Operation(summary = "Save new")
@PostMapping("/store")
public ResponseEntity<ResponseRequest<TransDeliveryPlanning>> saveNewTransDeliveryPlanning(@RequestHeader HttpHeaders headers, 
        @Valid @RequestBody InputRequest<TransDeliveryPlanningDto> request) {

    String token = headers.getFirst(HttpHeaders.AUTHORIZATION);

    TransDeliveryPlanning newTransDeliveryPlanning = transDeliveryPlanningService.save(token, request);

    ResponseRequest<TransDeliveryPlanning> response = new ResponseRequest<TransDeliveryPlanning>();

    if (newTransDeliveryPlanning != null) {
        response.setMessage(PESAN_SIMPAN_BERHASIL);
        response.setData(newTransDeliveryPlanning);
    } else {
        response.setMessage(PESAN_SIMPAN_GAGAL);
    }

    return ResponseEntity.ok(response);
}

et j'ai lu quelque part il y a quelque chose appelé Interceptor donc nous n'avons pas à taper @Requestheader dans chaque contrôleur, je pense, mais je ne sais pas si cette solution ou comment l'utiliser correctement. Si quelqu'un peut faire cela avec quelque chose de mieux, je vais accepter le vôtre comme réponse

1
Ke Vin

Je pense que la réponse ci-dessous de @staquette est correcte mais aussi je pense que c'est d'une manière ou d'une autre partie incomplète et de manquer le "Comment l'utiliser dans Feign".

Par souci de l'exemple, je vais fournir un cas d'utilisation réel où vous pouvez intercepter le User-Agent de l'appelant à votre service et transmettez cela dans le Feign appel

En supposant que vous utilisiez Feign CLIENTS basé sur les annotations Il s'agit de la manière dont vous pouvez utiliser l'intercepteur dans tous vos clients Feign Clients sans aucun code supplémentaire.

@Configuration
@EnableFeignClients(
    defaultConfiguration = DefaultFeignConfiguration.class
)
public class FeignConfig
{
}
@Configuration
@Import(FeignClientsConfiguration.class)
public class DefaultFeignConfiguration
{
    @Bean
    public RequestInterceptor userAgentHeaderInterceptor() {
        return UserAgentHeaderInterceptor();
    } 
}

Ceci est la classe intercepteur de l'utilisateur utilisateur

public class UserAgentHeaderInterceptor extends BaseHeaderInterceptor
{

    private static final String USER_AGENT = "User-Agent";


    public UserAgentHeaderInterceptor()
    {
        super(USER_AGENT);
    }
}
public class BaseHeaderInterceptor implements RequestInterceptor
{

    private final String[] headerNames;


    public BaseHeaderInterceptor(String... headerNames)
    {
        this.headerNames = headerNames;
    }


    @Override
    public void apply(RequestTemplate template)
    {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

        if (attributes != null)
        {
            HttpServletRequest httpServletRequest = attributes.getRequest();

            for (String headerName : headerNames)
            {
                String headerValue = httpServletRequest.getHeader(headerName);
                if (headerValue != null && !headerValue.isEmpty())
                {
                    template.header(headerName, headerValue);
                }
            }
        }
    }
}

Dans votre cas, il vous suffit de prendre cette classe de base et de créer votre propre intercepteur de la même manière que le UserAgentHeaderInterceptor

0
Randy Hector

Vous pouvez créer cette méthode statique simple dans une classe d'utilité et réutiliser cette méthode directement.

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

public class BearerTokenUtil {

  public static String getBearerTokenHeader() {
    return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getHeader("Authorization");
  }
}

Votre service ressemblerait alors à ceci

public TransDeliveryPlanning save(InputRequest<TransDeliveryPlanningDto> request) {
       Future<List<PartnerDto>> initPartners = execs.submit(getDataFromAccount(transDeliveryPlanningDtSoDtoPartnerIdsSets));
}

public Callable<List<PartnerDto>> getDataFromAccount(Set<Long> ids) {
    List<PartnerDto> partnerDtoResponse = accountFeignClient.getData(BearerTokenUtil.getBearerTokenHeader(), ids);
    return () -> partnerDtoResponse;
}
0
Abhijay