From 7785fc220b9ee5ce845778a33fed110a20115bf4 Mon Sep 17 00:00:00 2001 From: bjkim Date: Wed, 15 Oct 2025 15:54:40 +0900 Subject: [PATCH] =?UTF-8?q?[ADD]=20=EC=99=B8=EB=B6=80=20Edge=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EA=B2=80=EC=83=89=20API=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20ExternalAuthController,=20Service=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/ExternalAuthController.java | 25 ++++- .../autoflow/service/ExternalAuthService.java | 94 +++++++++++++------ src/main/resources/application.properties | 2 +- 3 files changed, 88 insertions(+), 33 deletions(-) diff --git a/src/main/java/kr/re/etri/autoflow/controllers/ExternalAuthController.java b/src/main/java/kr/re/etri/autoflow/controllers/ExternalAuthController.java index bd6a533..ef3fec8 100644 --- a/src/main/java/kr/re/etri/autoflow/controllers/ExternalAuthController.java +++ b/src/main/java/kr/re/etri/autoflow/controllers/ExternalAuthController.java @@ -7,6 +7,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.Map; + @RestController @RequestMapping("/api/external-auth") @Tag(name = "ExternalAuthController", description = "외부 백엔드 로그인 및 Bearer 토큰 조회 API") @@ -15,14 +17,27 @@ public class ExternalAuthController { private final ExternalAuthService externalAuthService; - @Operation(summary = "외부 로그인 후 Bearer 토큰 조회", description = "외부 Spring 백엔드에 로그인 요청 후 Bearer 토큰을 반환합니다.") + @Operation(summary = "외부 로그인 후 사용자 정보 조회", description = "외부 Spring 백엔드에 로그인 요청 후 id, name, token을 반환합니다.") @PostMapping("/signin") - public ResponseEntity signin( - @RequestBody SigninRequest request + public ResponseEntity signin(@RequestBody SigninRequest request) { + try { + Map userInfo = externalAuthService.getUserInfo(request.id(), request.password()); + return ResponseEntity.ok(ApiResponse.success(userInfo)); + } catch (Exception e) { + return ResponseEntity.ok(ApiResponse.failure(e.getMessage())); + } + } + + + @Operation(summary = "Edge 패키지 목록 조회", description = "로그인 후 받은 id와 token을 사용해 외부 Edge 패키지 검색 API를 호출합니다.") + @GetMapping("/edge-search") + public ResponseEntity edgeSearch( + @RequestParam String id, + @RequestParam String token ) { try { - String token = externalAuthService.getBearerToken(request.id(), request.password()); - return ResponseEntity.ok(ApiResponse.success(token)); + Map edgeResult = externalAuthService.getEdgePackageList(id, token); + return ResponseEntity.ok(ApiResponse.success(edgeResult)); } catch (Exception e) { return ResponseEntity.ok(ApiResponse.failure(e.getMessage())); } diff --git a/src/main/java/kr/re/etri/autoflow/service/ExternalAuthService.java b/src/main/java/kr/re/etri/autoflow/service/ExternalAuthService.java index d1c771a..a8e891f 100644 --- a/src/main/java/kr/re/etri/autoflow/service/ExternalAuthService.java +++ b/src/main/java/kr/re/etri/autoflow/service/ExternalAuthService.java @@ -1,45 +1,62 @@ package kr.re.etri.autoflow.service; +import jakarta.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.*; -import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; +import org.springframework.http.client.SimpleClientHttpRequestFactory; import javax.net.ssl.*; import java.security.cert.X509Certificate; +import java.util.HashMap; import java.util.Map; - @Service public class ExternalAuthService { + private RestTemplate restTemplate; + @Value("${external.auth.signin-url}") private String signinUrl; - private final RestTemplate restTemplate; + @Value("${external.auth.edge-search-url}") + private String edgeSearchUrl; + + @PostConstruct + public void init() { + this.restTemplate = createUnsafeRestTemplate(); + } - public ExternalAuthService() throws Exception { - // SSLContext 생성 (모든 인증서 허용) - SSLContext sslContext = SSLContext.getInstance("TLS"); - sslContext.init(null, new TrustManager[]{new X509TrustManager() { - public void checkClientTrusted(X509Certificate[] chain, String authType) {} - public void checkServerTrusted(X509Certificate[] chain, String authType) {} - public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } - }}, new java.security.SecureRandom()); + /** SSL 무시용 RestTemplate 생성 */ + private RestTemplate createUnsafeRestTemplate() { + try { + TrustManager[] trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } + public void checkClientTrusted(X509Certificate[] certs, String authType) { } + public void checkServerTrusted(X509Certificate[] certs, String authType) { } + } + }; - HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); - HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true); + SSLContext sslContext = SSLContext.getInstance("TLS"); + sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); - this.restTemplate = new RestTemplate(new SimpleClientHttpRequestFactory()); - } + HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); + HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true); + + SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); + return new RestTemplate(requestFactory); - public String getBearerToken(String id, String password) { + } catch (Exception e) { + throw new RuntimeException("Failed to create unsafe RestTemplate", e); + } + } - Map body = Map.of( - "id", id, - "password", password - ); + /** Bearer 토큰 발급 */ + public Map getUserInfo(String id, String password) { + // 요청 본문 + Map body = Map.of("id", id, "password", password); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); @@ -47,19 +64,42 @@ public class ExternalAuthService { HttpEntity> request = new HttpEntity<>(body, headers); ResponseEntity response = restTemplate.exchange( - signinUrl, - HttpMethod.POST, - request, - Map.class - ); + signinUrl, HttpMethod.POST, request, Map.class); if (response.getStatusCode() == HttpStatus.OK) { Map respBody = response.getBody(); if (respBody != null && respBody.get("data") instanceof Map dataMap) { - return (String) dataMap.get("token"); + Map result = new HashMap<>(); + result.put("id", dataMap.get("id")); + result.put("name", dataMap.get("name")); + result.put("token", dataMap.get("token")); + return result; } } - throw new RuntimeException("Failed to get Bearer token"); + throw new RuntimeException("Failed to get user info from external server"); + } + + /** + * Edge 패키지 검색 API 호출 + */ + public Map getEdgePackageList(String id, String token) { + // URL 구성 + String url = String.format("%s?sw_group=-1&sw_type=-1&searchType=&searchText=&pageNum=1&pageSize=10&auth_id=%s&user_id=", + edgeSearchUrl, id); + + HttpHeaders headers = new HttpHeaders(); + headers.setBearerAuth(token); + headers.setAccept(java.util.List.of(MediaType.APPLICATION_JSON)); + + HttpEntity request = new HttpEntity<>(headers); + + ResponseEntity response = restTemplate.exchange(url, HttpMethod.GET, request, Map.class); + + if (response.getStatusCode() == HttpStatus.OK) { + return response.getBody(); + } + + throw new RuntimeException("Failed to fetch edge package list"); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 11c364d..2f7804c 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -71,5 +71,5 @@ spring.servlet.multipart.enabled=true #OTA?? external.auth.signin-url=https://cuuva.com:24443/api/datamanager/user/signin - +external.auth.edge-search-url=https://cuuva.com:24443/api/datamanager/edge-pkg/search