package kcc.let.uat.uia.web; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.barocert.BarocertException; import com.barocert.kakaocert.KakaocertService; import com.barocert.navercert.NavercertService; import com.fasterxml.jackson.databind.ObjectMapper; import kcc.let.uat.uia.service.CertService; import kcc.let.uat.uia.service.CertVO; import seed.utils.FairnetUtils; import seed.utils.SeedUtils; import seed.utils.kCertDecryptor; import seed.utils.nCertDecryptor; /** * @packageName : kcc.let.uat.uia.web * @fileName : SocialCertController.java * @author : JunHo Lee * @date : 2024.11.21 * @description : 소셜 로그인(네이버, 카카오) * =========================================================== * DATE AUTHOR NOTE * ----------------------------------------------------------- * 2024.11.21 JunHo Lee 최초 생성 */ /** * @packageName : kcc.let.uat.uia.web * @fileName : SocialCertController.java * @author : JunHo Lee * @date : 2024.11.21 * @description : * =========================================================== * DATE AUTHOR NOTE * ----------------------------------------------------------- * 2024.11.21 JunHo Lee 최초 생성 */ @Controller public class SocialCertController { @Autowired private NavercertService navercertService; @Autowired private KakaocertService kakaocertService; @Autowired private CertService certService; @Value("#{NAVER_CONFIG.ClientCode}") private String NaverClientCode; @Value("#{KAKAO_CONFIG.ClientCode}") private String KakaoClientCode; /** * @methodName : nCertStep1 * @author : JunHo Lee * @date : 2024.11.21 * @description : * @param m * @return * @throws Exception */ @RequestMapping(value = "/web/user/cert/nCertStep1.do") public String nCertStep1(Model m) throws Exception { return "uat/uia/NCertStep1"; } /** * @methodName : kCertStep1 * @author : JunHo Lee * @date : 2024.11.21 * @description : * @param m * @return * @throws Exception */ @RequestMapping(value = "/web/user/cert/kCertStep1.do") public String kCertStep1(Model m) throws Exception { return "uat/uia/KCertStep1"; } /** * @methodName : nCertStep2 * @author : JunHo Lee * @date : 2024.11.21 * @description : * @param m * @param certVO * @return * @throws BarocertException */ @RequestMapping(value = "/web/user/cert/nCertStep2.do") public String nCertStep2(Model m, CertVO certVO) throws BarocertException { // 본인인증 요청 정보 객체 com.barocert.navercert.identity.Identity identity = new com.barocert.navercert.identity.Identity(); // 수신자 휴대폰번호 - 11자 (하이픈 제외) identity.setReceiverHP(navercertService.encrypt(certVO.getPhone())); // 수신자 성명 - 80자 identity.setReceiverName(navercertService.encrypt(certVO.getName())); // 수신자 생년월일 - 8자 (yyyyMMdd) identity.setReceiverBirthday(navercertService.encrypt(certVO.getBirth())); // 고객센터 연락처 - 최대 12자 identity.setCallCenterNum("1600-9854"); // 인증요청 만료시간 - 최대 1,000(초)까지 입력 가능 identity.setExpireIn(1000); // AppToApp 인증요청 여부 // true - AppToApp 인증방식, false - 푸시(Push) 인증방식 identity.setAppUseYN(false); try { com.barocert.navercert.identity.IdentityReceipt request = navercertService.requestIdentity(NaverClientCode, identity); m.addAttribute("request", request); } catch (BarocertException ne) { m.addAttribute("Exception", "요청에 실패했습니다."); return "redirect:/web/user/cert/nCertStep1.do"; } return "uat/uia/NCertStep2"; } /** * @methodName : kCertStep2 * @author : JunHo Lee * @date : 2024.11.21 * @description : * @param m * @return * @throws BarocertException */ @RequestMapping(value = "/web/user/cert/kCertStep2.do") public String kCertStep2(Model m, CertVO certVO) throws BarocertException { // 본인인증 요청 정보 객체 com.barocert.kakaocert.identity.Identity identity = new com.barocert.kakaocert.identity.Identity(); // 수신자 휴대폰번호 - 11자 (하이픈 제외) identity.setReceiverHP(kakaocertService.encrypt(certVO.getPhone())); // 수신자 성명 - 80자 identity.setReceiverName(kakaocertService.encrypt(certVO.getName())); // 수신자 생년월일 - 8자 (yyyyMMdd) identity.setReceiverBirthday(kakaocertService.encrypt(certVO.getBirth())); // 인증요청 메시지 제목 - 최대 40자 identity.setReqTitle("분쟁조정사건처리시스템 본인인증"); // 커스텀 메시지 - 최대 500자 identity.setExtraMessage(kakaocertService.encrypt("한국공정거래조정원 분쟁조정사건처리시스템 본인인증 요청입니다.")); // 인증요청 만료시간 - 최대 1,000(초)까지 입력 가능 identity.setExpireIn(1000); // 서명 원문 - 최대 40자 까지 입력가능 identity.setToken(kakaocertService.encrypt("본인인증 요청 원문")); // AppToApp 인증요청 여부 // true - AppToApp 인증방식, false - Talk Message 인증방식 identity.setAppUseYN(false); try { com.barocert.kakaocert.identity.IdentityReceipt request = kakaocertService.requestIdentity(KakaoClientCode, identity); m.addAttribute("request", request); } catch (BarocertException ke) { m.addAttribute("Exception", ke); return "redirect:/web/user/cert/kCertStep1.do"; } return "uat/uia/KCertStep2"; } /** * @methodName : nCertStep3Ajax * @author : JunHo Lee * @date : 2024.11.21 * @description : * @param reqeust * @param repn * @return * @throws BarocertException */ @RequestMapping(value = "/web/user/cert/nCertStep3Ajax.do") public ResponseEntity nCertStep3Ajax(HttpServletRequest reqeust, HttpServletResponse repn, CertVO certVO) { Map returnData = new HashMap(); com.barocert.navercert.identity.IdentityStatus status = null; try { status = navercertService.getIdentityStatus(NaverClientCode, certVO.getReceiptID()); } catch (BarocertException e) { returnData.put("result", "requestFail"); returnData.put("msg", "인증과정에 문제가 발생했습니다. 화면을 새로고침 후 다시 시도해 주세요."); return new ResponseEntity<>(returnData, HttpStatus.OK); } if(status != null && status.getState() == 1) { com.barocert.navercert.identity.IdentityResult result = null; try { result = navercertService.verifyIdentity(NaverClientCode, certVO.getReceiptID()); } catch (BarocertException e) { returnData.put("result", "requestFail"); returnData.put("msg", "인증과정에 문제가 발생했습니다. 화면을 새로고침 후 다시 시도해 주세요."); return new ResponseEntity<>(returnData, HttpStatus.OK); } returnData.put("result", "success"); returnData.put("msg", "인증되었습니다."); //세션 등록 FairnetUtils.setCertSession(reqeust, nDecrypt(result.getReceiverName()), nDecrypt(result.getReceiverHP()), ""); certVO.setPhone(nDecrypt(result.getReceiverHP())); certVO.setName(nDecrypt(result.getReceiverName())); String ori = "ReceiptID: " + result.getReceiptID() + ", ReceiverDay: " + nDecrypt(result.getReceiverDay()) + ", ReceiverEmail: " + nDecrypt(result.getReceiverEmail()) + ", ReceiverForeign: " + nDecrypt(result.getReceiverForeign()) + ", ReceiverGender: " + nDecrypt(result.getReceiverGender()) + ", ReceiverHP: " + nDecrypt(result.getReceiverHP()) + ", ReceiverName: " + nDecrypt(result.getReceiverName()) + ", ReceiverYear: " + nDecrypt(result.getReceiverYear()) // + ", SignedData: " + result.getSignedData() + ", State: " + result.getState() + ", Ci: " + nDecrypt(result.getCi()); certVO.setCertOri(ori); certVO.setCertType("N"); try { //인증 사용자 insert certService.insertCert(certVO); //인증 로그 insert certService.insertCertLog(certVO); } catch (Exception e) { System.out.println("인증 정보 등록 실패!!!!!!!!!"); } return new ResponseEntity<>(returnData, HttpStatus.OK); }else { returnData.put("result", "fail"); returnData.put("msg", "인증 후 다시 클릭해 주세요."); return new ResponseEntity<>(returnData, HttpStatus.OK); } } @RequestMapping(value = "/web/user/cert/kCertStep3Ajax.do") public ResponseEntity kCertStep3Ajax(HttpServletRequest reqeust, HttpServletResponse repn, CertVO certVO) { Map returnData = new HashMap(); com.barocert.kakaocert.identity.IdentityStatus status = null; try { status = kakaocertService.getIdentityStatus(KakaoClientCode, certVO.getReceiptID()); } catch (BarocertException e) { returnData.put("result", "requestFail"); returnData.put("msg", "인증과정에 문제가 발생했습니다. 화면을 새로고침 후 다시 시도해 주세요."); return new ResponseEntity<>(returnData, HttpStatus.OK); } if(status != null && status.getState() == 1) { com.barocert.kakaocert.identity.IdentityResult result = null; try { result = kakaocertService.verifyIdentity(KakaoClientCode, certVO.getReceiptID()); } catch (BarocertException e) { returnData.put("result", "requestFail"); returnData.put("msg", "인증과정에 문제가 발생했습니다. 화면을 새로고침 후 다시 시도해 주세요."); return new ResponseEntity<>(returnData, HttpStatus.OK); } returnData.put("result", "success"); returnData.put("msg", "인증되었습니다."); //세션 등록 FairnetUtils.setCertSession(reqeust, kDecrypt(result.getReceiverName()), kDecrypt(result.getReceiverHP()), ""); certVO.setPhone(kDecrypt(result.getReceiverHP())); certVO.setName(kDecrypt(result.getReceiverName())); String ori = "ReceiptID: " + result.getReceiptID() + ", State: " + result.getState() // + ", SignedData: " + result.getSignedData() + ", Ci: " + kDecrypt(result.getCi()) + ", ReceiverName: " + kDecrypt(result.getReceiverName()) + ", ReceiverYear: " + kDecrypt(result.getReceiverYear()) + ", ReceiverDay: " + kDecrypt(result.getReceiverDay()) + ", ReceiverHP: " + kDecrypt(result.getReceiverHP()) + ", ReceiverGender: " + kDecrypt(result.getReceiverGender()); certVO.setCertOri(ori); certVO.setCertType("K"); try { //인증 사용자 insert certService.insertCert(certVO); //인증 로그 insert certService.insertCertLog(certVO); } catch (Exception e) { System.out.println("인증 정보 등록 실패!!!!!!!!!"); } return new ResponseEntity<>(returnData, HttpStatus.OK); }else { returnData.put("result", "fail"); returnData.put("msg", "인증 후 다시 클릭해 주세요."); return new ResponseEntity<>(returnData, HttpStatus.OK); } } private String nDecrypt(String param){ try { // 복호화 키 String secretKey = "0lOKtGZ_wu"; // 초기화 벡터 String iv = "6C2Syq8tbK3eApue"; // 암호문 String cipherText = SeedUtils.setReplaceNull(param); nCertDecryptor decryptor = new nCertDecryptor(); String decryptedCI = decryptor.decrypt(secretKey, iv, cipherText); return decryptedCI; } catch (Exception e) { System.out.println("복호화 실패!!!"); return param; } } private String kDecrypt(String param) { // 복호화 키 String secretKey = "+EJwVvo37PY1v4zcENdmGezYXwCdmtUlbaNVI0kvrFM="; // 초기화 벡터 String iv = "uG+F70tIcBb3z1lh8RcVDQ=="; // 암호문 String cipherText = SeedUtils.setReplaceNull(param); try { // 복호화 kCertDecryptor decryptor = new kCertDecryptor(); String decryptedCI = decryptor.decrypt(secretKey, iv, cipherText); System.out.println(decryptedCI); return decryptedCI; } catch (Exception e) { e.printStackTrace(); System.out.println("복호화 실패!!!"); return param; } } }