добавить токен авторизации с помощью симулированного клиента

#java #spring #jwt #jhipster #feign

#java #spring #jwt #jhipster #симулировать

Вопрос:

У меня есть две службы, подключенные к реестру, одной из них необходимо запросить некоторые данные у другой, токен необходимо передать конечной точке.

Я пробовал следующее, но это не сработало, конечная точка действует так, как будто токен не предоставлен.

     @GetMapping("/api/users/find")
    @Headers("Authorization: Bearer {token}")
    Optional<UserDTO> findUserByEmail(
        @Param("token") String token, @RequestParam("email") String email);
  
     @GetMapping("/api/users/find")
    Optional<UserDTO> findUserByEmail(
        @RequestHeaders("Authorization") String token, @RequestParam("email") String email);
  
     @GetMapping("/api/users/find")
    Optional<UserDTO> findUserByEmail(
        @HeaderMap Map<String, Object> headers , @RequestParam("email") String email);
  

Комментарии:

1. В вашем заголовке говорится о FeignClient, но вы показываете только код с сервера. Почему вы изменили код конечной точки получателя, конфигурация безопасности по умолчанию из JHipster должна требовать JWT, никаких изменений не требуется; Только вызывающий должен быть изменен. Как вы извлекаете токен в вызывающем, с SecurityUtils.getCurrentUserJWT() ? Вы тестировали свою конечную точку с помощью swagger или curl?

Ответ №1:

Должно работать примерно так @RequestHeader(value = "Authorization") String authorization , но убедитесь, что вы передаете правильное значение, должно быть что-то вроде Bearer token .

Ответ №2:

Ваш этот код абсолютно правильный.

     @GetMapping("/api/users/find")
    Optional<UserDTO> findUserByEmail(
    @RequestHeaders("Authorization") String token, @RequestParam("email") String email);
  

Просто когда вы вызываете этот конкретный метод, добавьте «Bearer» перед значением токена

 token = "Bearer "   token;
findUserByEmail(token,email);
  

Комментарии:

1. Спасибо, это то, чего мне не хватало

Ответ №3:

Создайте заголовок, подобный этому, и передайте его вашему симулированному клиенту

 private HttpHeaders getHeaders(final HttpServletRequest httpServletRequest) {
        final HttpHeaders headers = new HttpHeaders();
        headers.add("authorization", httpServletRequest.getHeader("authorization"));
        return headers;
  

Пример 1

Или очень просто добавить перехватчик

 @Component
public class AuthFeignInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate template) {
        final RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        if (requestAttributes != null) {
            final HttpServletRequest httpServletRequest = ((ServletRequestAttributes) requestAttributes).getRequest();
            template.header(HttpHeaders.AUTHORIZATION, httpServletRequest.getHeader(HttpHeaders.AUTHORIZATION));
        }
    }
}
  

Пример 2