====== 디지털원패스 ====== ===== 개요 ===== - 디지털원패스는 하나의 아이디로 본인이 선택한 인증수단을 사용하여 안전하고 편리하게 여러 전자정부 서비스를 이용할 수 있는 인증서비스이다. - 전자정부 서비스 이용 시 웹사이트마다 아이디를 일일이 기억할 필요없이 하나의 디지털원패스 아이디를 통해 여러 전자정부 서비스를 이용할 수 있다. - 디지털원패스는 모바일인증(지문/안면/공인인증서/간편번호(PIN)/패턴), 공인인증서, 문자(SMS)인증의 인증수단을 지원한다. - 디지털원패스는 행정안전부(디지털안전정책과), 한국지역정보개발원(정보인증부)로 공문을 통해 신청 후 연계모듈을 제공받아야 한다. * 디지털원패스 [[https://www.onepass.go.kr/|홈페이지]] * 디지털원패스 [[https://www.onepass.go.kr/cnguide|연계 안내페이지]] - 표준프레임워크는 연계모듈을 이용한 애플리케이션 개발에 활용할 수 있는 예제를 제공한다. ===== 설명 ===== ==== 관련소스 ==== ^유형^대상소스명^비고^ |연계용 환경설정|onepass.properties|디지털원패스 환경설정 파일| |연계용 모듈|egovframework/onepass/onepass.jks|디지털원패스 SSL 인증서 키 체인 스토어(연계모듈에 포함)| |연계용 모듈|egovframework/onepass/pubkey_share.der|디지털원패스 서명검증 파일(공개키)(연계모듈에 포함)| |연계용 모듈|WEB-INF/lib/onepass-client-2.0.0.jar|디지털원패스 라이브러리(연계모듈에 포함)| |Controller|egovframework.com.uss.umt.onepass.web.EgovOnepassController.java|디지털원패스 연동 처리| |Controller|egovframework.com.uss.umt.web.EgovMberManageController.java|디지털원패스 연동해지 처리| |Controller|egovframework.com.uss.umt.web.EgovEntrprsManageController.java|디지털원패스 연동해지 처리| |Service|egovframework.com.uss.umt.onepass.service.EgovOnepassService.java|디지털원패스 연동 처리| |ServiceImpl|egovframework.com.uss.umt.onepass.serviceImpl.EgovOnepassServiceImpl.java|디지털원패스 연동 처리| |DAO|egovframework.com.uss.umt.onepass.serviceImpl.EgovOnepassDAO.java|디지털원패스 연동 처리| |Property|egovframework/message/com/uss/umt/onepass/message_en.properties|디지털원패스 메시지처리| |Property|egovframework/message/com/uss/umt/onepass/message_ko.properties|디지털원패스 메시지처리| |XML|egovframework/mapper/com/uat/uia/EgovOnepass_SQL_altibase.xml|디지털원패스 인증 회원 조회| |XML|egovframework/mapper/com/uat/uia/EgovOnepass_SQL_cubrid.xml|디지털원패스 인증 회원 조회| |XML|egovframework/mapper/com/uat/uia/EgovOnepass_SQL_maria.xml|디지털원패스 인증 회원 조회| |XML|egovframework/mapper/com/uat/uia/EgovOnepass_SQL_mysql.xml|디지털원패스 인증 회원 조회| |XML|egovframework/mapper/com/uat/uia/EgovOnepass_SQL_oracle.xml|디지털원패스 인증 회원 조회| |XML|egovframework/mapper/com/uat/uia/EgovOnepass_SQL_postgres.xml|디지털원패스 인증 회원 조회| |XML|egovframework/mapper/com/uat/uia/EgovOnepass_SQL_tibero.xml|디지털원패스 인증 회원 조회| |JSP|WEB-INF/jsp/egovframework/com/cmm/error/onepassAccessDenied.jsp|디지털원패스 에러페이지| |JSP|WEB-INF/jsp/egovframework/com/uat/uia/EgovLoginUsr.jsp|로그인 화면| |JSP|WEB-INF/jsp/egovframework/com/uss/umt/onepass/onepassLogin.jsp|디지털원패스 로그인/로그아웃 모듈| |JSP|WEB-INF/jsp/egovframework/com/uss/umt/onepass/onepassResult.jsp|디지털원패스 결과 메시지 출력 후 메인화면으로 이동| |JSP|WEB-INF/jsp/egovframework/com/uss/umt/EgovEntrprsMberSelectUpdt.jsp|디지털원패스 연동해지 처리| |JSP|WEB-INF/jsp/egovframework/com/uss/umt/EgovMberSelectUpdt.jsp|디지털원패스 연동해지 처리| |CSS|css/egovframework/com/com.css|디지털원패스 에러페이지 css 추가| |Image|images/egovframework/com/uat/uia/onepass.png|디지털원패스 로그인 이미지| ==== 환경설정 ==== - 위키가이드의 [[egovframework:dev4.0:imp:editor:common_component|공통컴포넌트 시작하기]]를 참고하여 공통컴포넌트를 설치한다. - 디지털원패스 신청 후 받은 연계모듈 중 디지털원패스 SSL 인증서 키 체인 스토어(onepass.jks) 및 서명검증 파일(pubkey_share.der)을 공통컴포넌트 프로젝트에 추가한다. * 추가할 위치는 위의 관련소스 부분을 참고한다. - onepass.properties 파일에 개발환경에 맞게 환경설정한다. ### 표준프레임워크 onepass.properties 예제 ### # Site URL : 사이트의 URL onepass.site.url=https://10.211.55.3:9443/egovframework-all-in-one/ # Site ID : 사이트의 ID(디지털원패스에서 발급) onepass.site.id=********** # AES secretKey(length:16) : AES 암호화 키(디지털원패스에서 발급) aes.secretKey=********** # PublicKey path(절대경로) keys.public.path=C:\\eGovFrameDev-4.0.0-64bit\\workspace\\allinone\\src\\main\\resources\\egovframework\\onepass\\pubkey_share.der # SSL jks path(상대경로) ssl.keystore=egovframework/onepass/onepass.jks # ACS path : SAML로그인 요청 후 응답처리 경로(사이트의 로그인 처리를 위한 경로) onepass.site.path.acs=/uat/uia/onepass/onepassCallback.do # IDP URL : 디지털원패스 IDP URL onepass.idp.url=https://saml.egaf2017.com # Potal URL : API 서버 URL onepass.potal.url=https://www.egaf2017.com ==== 연계 구성 ==== - 프로젝트의 로그인 화면에 디지털원패스 연동 버튼을 추가한 후 표준프레임워크의 예제를 참고하여 연동모듈을 구성한다. - 디지털원패스를 이용한 연동 프로세스는 연계순서도를 통해 확인할 수 있다 {{:egovframework:com:v4.0:uat:uia:onepass-flowchart.png?740|}} ===== 관련 기능 ===== ==== 사용자 인증 처리 ==== === 비즈니스 규칙 === 디지털원패스 사용자 인증 화면으로 이동한다. === 관련코드 === @RequestMapping(value="/uat/uia/onepass/onepassLogin.do", method=RequestMethod.POST) public String onepassLogin(HttpServletRequest request, HttpServletResponse response, ModelMap model) { String serviceType = request.getParameter("serviceType"); String action = null; String inputName = null; String inputValue = null; String pageType = OnepassRequestHandler.pageType(request); try { if ("LOGIN".equals(serviceType)) { action = OnepassRequestHandler.LOGIN_DEST; inputName = OnepassRequestHandler.LOGIN_INPUT_NAME; inputValue = OnepassRequestHandler.login(); } else if ("LOGOUT".equals(serviceType)) { action = OnepassRequestHandler.logoutDest(request); inputName = OnepassRequestHandler.LOGOUT_INPUT_NAME; inputValue = OnepassRequestHandler.logout(request); } else { action = request.getContextPath()+"/index.do"; inputName = ""; inputValue = ""; } } catch (Exception e) { return "egovframework/com/cmm/error/onepassAccessDenied"; } model.addAttribute("redirectUrl", action); model.addAttribute("inputName", inputName); model.addAttribute("inputValue", inputValue); model.addAttribute("pageType", pageType); return "egovframework/com/uat/uia/onepass/onepassLogin"; } * 공통컴포넌트 디지털원패스 인증 버튼 예 {{:egovframework:com:v4.0:uat:uia:onepass-01.jpg?700|}} * 디지털원패스 인증 연계 예1 {{:egovframework:com:v4.0:uat:uia:onepass-02.jpg?700|}} * 디지털원패스 인증 연계 예2 {{:egovframework:com:v4.0:uat:uia:onepass-03.jpg?700|}} ==== 인증 완료 후 응답 처리 ==== === 비즈니스 규칙 === 디지털원패스 인증 완료 후 응답받는 callback 메소드로 인증된 사용자 정보를 처리한다. === 관련코드 === @RequestMapping(value="/uat/uia/onepass/onepassCallback.do", method=RequestMethod.POST) public String onepassCallback(HttpServletRequest request, HttpServletResponse response, ModelMap model) throws Exception { // 인증체크 OnepassResponse onepassResponse = OnepassResponseHandler.check(request); // 인증 성공 if (onepassResponse.getStatus() == STATUS.SUCCESS && onepassResponse.getResultCode() == RESULT_CODE.SUCCESS) { // type 이 LOGIN if (onepassResponse.getType() == TYPE.LOGIN) { String userKey = onepassResponse.getUserKey(); String intfToken = onepassResponse.getIntfToken(); // 인증 후 사용자 정보 조회 ApiSendHandler apiSendHandler = new ApiSendHandler(); OnepassUserResponse findOnepassUser = apiSendHandler.findUser(userKey, intfToken); // 사용자 정보 조회 성공 if (findOnepassUser != null && findOnepassUser.getStatus() == USER_STATUS.USE) { // 디지털원패스 사용자 정보 - 신규회원일 경우 이 정보를 이용할 수 있음 LOGGER.info("getId:{}", findOnepassUser.getId()); // 사용자의 ID (최대 30자) LOGGER.info("getName:{}", findOnepassUser.getName()); // 사용자의 이름 (최대 70자) LOGGER.info("getUserKey:{}", findOnepassUser.getUserKey()); // 사용자 유일값인 user key 가 전달된다. (최대 50자) LOGGER.info("getCi:{}", findOnepassUser.getCi()); // 사용자의 CI (최대 255자) LOGGER.info("getBirth:{}", findOnepassUser.getBirth()); // 사용자의 생년월일 (최대 8자) LOGGER.info("getPhone:{}", findOnepassUser.getPhone()); // 사용자의 휴대전화번호 (최대 14자) LOGGER.info("getEmail:{}", findOnepassUser.getEmail()); // 사용자의 E-mail (최대 70자) LOGGER.info("getSex:{}", findOnepassUser.getSex()); // 사용자의 성별 (남:M, 여:F) LOGGER.info("getNation:{}", findOnepassUser.getNation()); // 내외국인 구분(내국인:L, 외국인:F) // 기관 아이디 조회 int usedCnt = egovOnepassService.onePassCheckIdDplct(findOnepassUser.getId()); // 기관 아이디 조회 성공 if (usedCnt > 0) { // 디지털원패스에서 받은 아이디로 회원정보 조회 후 세션 저장 LoginVO resultVO = loginService.onepassLogin(findOnepassUser.getId()); resultVO.setOnepassUserkey(userKey); resultVO.setOnepassIntfToken(intfToken); request.getSession().setAttribute("loginVO", resultVO); // 로그인 인증세션 추가 request.getSession().setAttribute("accessUser", resultVO.getUserSe().concat(resultVO.getId())); model.addAttribute("resultMessage", egovMessageSource.getMessageArgs("digital.onepass.connect.success", new Object[]{resultVO.getId()})); model.addAttribute("redirectUrl", request.getContextPath()+"/index.do"); return "egovframework/com/uat/uia/onepass/onepassResult"; } // 기관 아이디 조회 실패 else { model.addAttribute("resultMessage", egovMessageSource.getMessage("digital.onepass.connect.join.failure")); model.addAttribute("redirectUrl", request.getContextPath()+"/index.do"); return "egovframework/com/uat/uia/onepass/onepassResult"; } } // 사용자 정보 조회 실패 else { model.addAttribute("resultMessage", egovMessageSource.getMessage("digital.onepass.connect.user.infomation.failure")); model.addAttribute("redirectUrl", request.getContextPath()+"/index.do"); return "egovframework/com/uat/uia/onepass/onepassResult"; } } // type 이 LOGIN 이 아님 else { model.addAttribute("resultMessage", egovMessageSource.getMessage("digital.onepass.connect.athentication.failure")); model.addAttribute("redirectUrl", request.getContextPath()+"/index.do"); return "egovframework/com/uat/uia/onepass/onepassResult"; } } // 인증 실패 else { model.addAttribute("resultMessage", egovMessageSource.getMessage("digital.onepass.connect.athentication.failure")); model.addAttribute("redirectUrl", request.getContextPath()+"/index.do"); return "egovframework/com/uat/uia/onepass/onepassResult"; } } ==== 연동 해제 ==== === 비즈니스 규칙 === 디지털원패스와의 연동을 해제한다. === 관련코드 === @RequestMapping(value="/uat/uia/onepass/onepassCancel.do", method=RequestMethod.POST) public String onepassCancel(HttpServletRequest request, HttpServletResponse response, ModelMap model) throws Exception { ApiSendHandler apiSendHandler = new ApiSendHandler(); String userKey = request.getParameter("userKey"); String intfToken = request.getParameter("intfToken"); OnepassUserResponse onepassUser = apiSendHandler.InterLockRelease(userKey, intfToken); if (Objects.isNull(onepassUser)) { onepassUser = new OnepassUserResponse(); model.addAttribute("resultMessage", egovMessageSource.getMessage("digital.onepass.connect.athentication.failure")); model.addAttribute("redirectUrl", request.getContextPath()+"/uat/uia/actionLogout.do"); return "egovframework/com/uat/uia/onepass/onepassResult"; } else { if (onepassUser.getProcess_result() == PROCESS_RESULT.SUCESS) { model.addAttribute("resultMessage", egovMessageSource.getMessage("digital.onepass.disconnect.success")); model.addAttribute("redirectUrl", request.getContextPath()+"/uat/uia/actionLogout.do"); return "egovframework/com/uat/uia/onepass/onepassResult"; } else { model.addAttribute("resultMessage", egovMessageSource.getMessage("digital.onepass.connect.user.infomation.failure")); model.addAttribute("redirectUrl", request.getContextPath()+"/uat/uia/actionLogout.do"); return "egovframework/com/uat/uia/onepass/onepassResult"; } } }