MSA 프로젝트 중 gateway를 통해 다른 서비스를 호출 하는 과정에서 FeignClient를 사용했다.
company 서비스에서 hub 서비스로 호출 중 401 에러가 났다.
{
"resultCode": "ERROR",
"result": "[401] during [GET] to [http://hub-service/api/hubs/3fa85f64-5717-4562-b3fc-2c963f66afa6] [HubClient#findHub(UUID)]: []"
}
권한이... 왜 없지?
생각하다가
hub 서비스를 호출 할 때 토큰이 없어서 접근을 못한다고 생각했다.
- id: hub
uri: lb://hub-service
predicates:
- Path=/api/hubs/**, /api/hub-paths/**
filters:
- SetRequestHeader=Authorization, request.headers.Authorization
gateway routes 쪽에 filter를 넣어봤다.
{
"resultCode": "ERROR",
"result": "java.lang.IllegalArgumentException: CharSequence cannot be null or empty."
}
그랬더니 요런 에러가..
보통 토큰을 안 넣고 돌렸는데 나는 에런데... 토큰이 잘 안 넘어가나보다..!
gateway routes 쪽에 filter를 지우고
@FeignClient(name = "hub-service", url = "${gateway.url}", configuration = FeignConfig.class)
public interface HubClient extends HubService {
configuration을 추가한다.
@Bean
public RequestInterceptor requestInterceptor() {
return requestTemplate -> {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes != null) {
HttpServletRequest request = attributes.getRequest();
String accessToken = request.getHeader("Authorization");
if (accessToken != null && accessToken.startsWith("Bearer ")) {
requestTemplate.header("Authorization", accessToken);
}
}
};
}
헤더에 토큰을 넣는 인터셉터인 FeignConfig를 생성하였더니 호출에 성공하였다!