[ADD] 외부 차량 SW 패키지 검색 API 추가, 관련 Service 및 Controller 로직 구현, application.properties에 SW 검색 URL 설정

main
bjkim 8 months ago
parent 0db1ab6d2c
commit 6e3827df09

@ -110,6 +110,20 @@ public class ExternalAuthController {
}
}
@Operation(summary = "차량관리 SW 패키지 목록 조회", description = "로그인 후 받은 id와 token을 사용해 외부 차령SW 패키지 검색 API를 호출합니다.")
@GetMapping("/sw-search")
public ResponseEntity<ApiResponse> swSearch(
@RequestParam String id,
@RequestParam String token
) {
try {
Map<String, Object> edgeResult = externalAuthService.getSWPackageList(id, token);
return ResponseEntity.ok(ApiResponse.success(edgeResult));
} catch (Exception e) {
return ResponseEntity.ok(ApiResponse.failure(e.getMessage()));
}
}
// @Operation(
// summary = "S3 업로드 + 외부 DB 등록",
// description = "파일을 S3에 업로드하고 외부 DB에 등록합니다.",

@ -35,8 +35,8 @@ public class ExternalAuthService {
@Value("${external.auth.edge-search-url}")
private String edgeSearchUrl;
@Value("${external.edge.add-url:https://cuuva.com:24443/api/datamanager/edge-pkg/add}")
private String edgeAddUrl;
@Value("${external.auth.sw-search-url}")
private String swSearchUrl;
@PostConstruct
public void init() {
@ -127,7 +127,6 @@ public class ExternalAuthService {
URI uri = URI.create(url);
// 추가 안전권장(선택) : 실제 호출되는 호스트가 설정한 base URL의 호스트와 동일한지 확인
// (내부망 차단을 원치 않으셨으므로 private IP 검사 코드는 제외)
URI baseUri = URI.create(edgeSearchUrl);
if (!uri.getHost().equalsIgnoreCase(baseUri.getHost())) {
throw new SecurityException("요청 호스트가 허용된 서비스와 일치하지 않습니다.");
@ -156,4 +155,55 @@ public class ExternalAuthService {
throw new RuntimeException("외부 Edge API 호출 중 오류가 발생했습니다.");
}
}
/**
* Edge API
*/
public Map<String, Object> getSWPackageList(String id, String token) {
try {
// 1) 입력 검증: id에 URL/공격 문자열 포함 금지
if (id == null || id.isBlank()) {
throw new IllegalArgumentException("잘못된 사용자 ID입니다.");
}
if (id.contains("http://") || id.contains("https://")) {
throw new IllegalArgumentException("ID에 URL을 포함할 수 없습니다.");
}
// 2) 안전하게 파라미터 인코딩 및 URL 구성 (base URL은 외부 입력에서 분리)
String safeId = URLEncoder.encode(id, StandardCharsets.UTF_8);
String url = String.format("%s?sw_group=-1&sw_type=-1&searchType=&searchText=&pageNum=1&pageSize=10&auth_id=%s&user_id=",
swSearchUrl, safeId);
// 3) URI 생성 (edgeSearchUrl이 올바른 형식인지 확인)
URI uri = URI.create(url);
// 추가 안전권장(선택) : 실제 호출되는 호스트가 설정한 base URL의 호스트와 동일한지 확인
URI baseUri = URI.create(swSearchUrl);
if (!uri.getHost().equalsIgnoreCase(baseUri.getHost())) {
throw new SecurityException("요청 호스트가 허용된 서비스와 일치하지 않습니다.");
}
// 4) 요청 헤더 구성
HttpHeaders headers = new HttpHeaders();
headers.setBearerAuth(token);
headers.setAccept(java.util.List.of(MediaType.APPLICATION_JSON));
HttpEntity<Void> request = new HttpEntity<>(headers);
// 5) 요청 수행
ResponseEntity<Map> response = restTemplate.exchange(uri, HttpMethod.GET, request, Map.class);
if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) {
return response.getBody();
} else {
throw new RuntimeException("외부 Edge 패키지 조회 실패");
}
} catch (IllegalArgumentException iae) {
// 입력 검증 실패는 호출자에게 명확히 알릴 수 있음
throw iae;
} catch (Exception e) {
// 내부 상세 예외는 래핑하여 외부에 노출하지 않음
throw new RuntimeException("외부 Edge API 호출 중 오류가 발생했습니다.");
}
}
}

@ -74,6 +74,7 @@ spring.servlet.multipart.enabled=true
#OTA??
external.auth.signin-url=https://a659120d3e2ff43ff94087b29396fd96-1057696791.ap-northeast-2.elb.amazonaws.com/api/datamanager/user/signin
external.auth.edge-search-url=https://a659120d3e2ff43ff94087b29396fd96-1057696791.ap-northeast-2.elb.amazonaws.com/api/datamanager/edge-pkg/search
external.auth.sw-search-url=https://a659120d3e2ff43ff94087b29396fd96-1057696791.ap-northeast-2.elb.amazonaws.com/api/datamanager/advehicle-pkg/search
cloud.aws.region.static=ap-northeast-2
cloud.aws.credentials.access-key=AKIA2UC3EPERDDR4UOWN

Loading…
Cancel
Save