#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;
Или очень просто добавить перехватчик
@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));
}
}
}