package nlib.user.web; import java.util.HashMap; import java.util.Map; import javax.annotation.Resource; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.web.savedrequest.HttpSessionRequestCache; import org.springframework.security.web.savedrequest.RequestCache; import org.springframework.security.web.savedrequest.SavedRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import egovframework.com.ext.oauth.service.OAuthConfig; import egovframework.com.ext.oauth.service.OAuthLogin; import egovframework.com.ext.oauth.service.OAuthUniversalUser; import egovframework.com.ext.oauth.service.OAuthVO; import nlib.cmm.service.NlibProperty; import nlib.cmm.session.SessionConfig; import nlib.user.service.LoginService; import nlib.user.service.NlibLoginVO; import nlib.util.StringUtil; /** *
 * @Class Name : LoginController.java
 * 
 * @Description : 스프링 시큐리티를 이용한 로그인 처리 컨트롤러 
 * 
 * 
 * @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021)
 *
 * 
* * @ ------------ -------- --------------------------- * @ 수정일 수정자 수정내용 * @ ------------ -------- --------------------------- * @ 2021. 7. 9. KNKIM 최초 생성 * @ 2021. 8.18. KNKIM RESTful -> DB접속 방식으로 변경 처리 * @ 2021. 8.19. KNKIM 지방문화원별 다른 도메인 호스트 접속 처리를 위한 Spring Security 변경 작업, 네이버 전자정보 프레임워크 기반으로 변경 * @ 2021. 8.24. KNKIM 테이블 변경에 따른 항목명 변경 및 코드 정리작업 * * * @author 이씨플라자 * DIGITALSHIP KNKIM * @since 2021. 7. 9. * @version 1.0 * */ @Controller public class LoginController { public LoginController() { super(); log.debug("==========================> LoginController Create : !!!! " + (new java.util.Date())); } private static final Logger log = LoggerFactory.getLogger(LoginController.class); //------------------------------------------- // SNS 연동 환경설정 정보 : context-oauth.xml 참고 //------------------------------------------- @Inject private OAuthVO naverAuthVO; /* 네이버 */ @Inject private OAuthVO googleAuthVO; /* 구글 */ @Inject private OAuthVO kakaoAuthVO; /* 카카오 */ //------------------------------------------- @Resource(name = "loginService") private LoginService loginService; /** * 각 지방문화원 사이트에서 로그인을 위해서 최초 접속한다. * 지방문화원 정보를 확인하여 로그인처리가 진행될 수 있도록 한다. * * @param req * @param res * @param session * @param returnUrl * @param model * @return * @throws Exception */ @RequestMapping("/login/loginCouncil.do") public String loginCouncil( HttpServletRequest req, HttpServletResponse res, HttpSession session, @RequestParam(required = false) String logout, @RequestParam(required = false) String returnUrl, @RequestParam(required = false) String callType, ModelMap model) throws Exception { String url = req.getRequestURL().toString(); String councilHomeUrl = url.replaceAll(req.getRequestURI(), "") + req.getContextPath(); String councilReturnUrl = councilHomeUrl + (StringUtil.isEmpty(returnUrl) ? "/" : returnUrl); String councilDnsHost = StringUtil.getHostName(url); // 캐쉬된 요청URL인 존재하는 경우, 리턴URL로 설정 RequestCache cache = new HttpSessionRequestCache(); SavedRequest savedRequest = cache.getRequest(req, res); if (savedRequest != null) { councilReturnUrl = savedRequest.getRedirectUrl(); log.debug("loginCouncil > HttpSessionRequestCache에서 획득 councilReturnUrl = " + councilReturnUrl); } // 지방문화원 코드 확인 HashMap councilInfo = loginService.selectCouncilInfoByDnsHost(councilDnsHost); String councilCd = (councilInfo == null ? null : councilInfo.get("councilCd")); String councilNm = (councilInfo == null ? null : councilInfo.get("councilNm")); session.setAttribute("councilReturnUrl", councilReturnUrl); session.setAttribute("councilHomeUrl", councilHomeUrl); session.setAttribute("councilDnsHost", councilDnsHost); session.setAttribute("councilCd", councilCd); session.setAttribute("councilNm", councilNm); session.setAttribute("callType", callType); log.debug("loginCouncil > sessionid=" + session.getId()); log.debug("loginCouncil > REQ URL = " + url); log.debug("loginCouncil > councilJsessionId = " + session.getId()); log.debug("loginCouncil > councilDnsHost = " + councilDnsHost); log.debug("loginCouncil > councilReturnUrl = " + councilReturnUrl); log.debug("loginCouncil > councilHomeUrl = " + councilHomeUrl); log.debug("loginCouncil > councilCd = " + councilCd); log.debug("loginCouncil > councilNm = " + councilNm); log.debug("loginCouncil > callType = " + callType); model.addAttribute("url" , NlibProperty.getString("nculture.login.preset.redirect.url")); model.addAttribute("councilJsessionId", session.getId()); model.addAttribute("councilDnsHost" , councilDnsHost); model.addAttribute("councilCd" , councilCd); model.addAttribute("councilNm" , StringUtil.encodeBase64(councilNm)); model.addAttribute("councilHomeUrl" , StringUtil.encodeBase64(councilHomeUrl)); model.addAttribute("councilReturnUrl" , StringUtil.encodeBase64(councilReturnUrl)); model.addAttribute("logout" , StringUtil.getString(logout, "")); model.addAttribute("callType" , StringUtil.getString(callType, "")); return "nlib/login/loginPreSet"; } /** * 로그인 콜백을 위한 설정을 처리한 후, 로그인 페이지로 전환한다. * * @param req * @param error * @param logout * @param model * @return */ @RequestMapping("/login/loginPreSet.do") public String loginPreSet(HttpServletRequest req, @RequestParam(required = false) String error, @RequestParam(required = false) String message, @RequestParam(required = false) String logout, RedirectAttributes redirectAttrs, @RequestParam Map paramMap, Model model, HttpSession session) { //---------------------------------------------- // 지방문화원 사이트에서 접속한 경우, 지방문화원 정보 확인 //---------------------------------------------- String councilJsessionId = paramMap.get("councilJsessionId"); String councilDnsHost = paramMap.get("councilDnsHost"); String councilReturnUrl = StringUtil.decodeBase64(paramMap.get("councilReturnUrl")); String councilHomeUrl = StringUtil.decodeBase64(paramMap.get("councilHomeUrl")); String councilCd = paramMap.get("councilCd"); String councilNm = StringUtil.decodeBase64(paramMap.get("councilNm")); String callType = paramMap.get("callType"); log.debug("loginPreSet > sessionid=" + session.getId()); log.debug("loginPreSet > councilJsessionId = " + councilJsessionId); log.debug("loginPreSet > councilDnsHost = " + councilDnsHost); log.debug("loginPreSet > councilReturnUrl = " + councilReturnUrl); log.debug("loginPreSet > councilHomeUrl = " + councilHomeUrl); log.debug("loginPreSet > councilCd = " + councilCd); log.debug("loginPreSet > councilNm = " + councilNm); log.debug("loginPreSet > callType = " + callType); session.setAttribute("councilJsessionId", councilJsessionId); session.setAttribute("councilReturnUrl", councilReturnUrl); session.setAttribute("councilHomeUrl" , councilHomeUrl); session.setAttribute("councilDnsHost", councilDnsHost); session.setAttribute("councilCd" , councilCd); session.setAttribute("councilNm" , councilNm); session.setAttribute("callType" , callType); String redirect = null; if(OAuthLogin.CALL_TYPE_MEMBER.equalsIgnoreCase(callType)) { redirect = councilHomeUrl + NlibProperty.getString("nculture.member.redirect.uri"); } else { redirect = councilHomeUrl + NlibProperty.getString("nculture.login.redirect.uri"); redirect = StringUtil.addWebParamOfUrl(redirect, "logout", logout); } return "redirect:" + redirect; } /** * 로그인 정보 입력 화면을 출력한다. * * @param req * @param error * @param logout * @param model * @return */ @RequestMapping("/login/loginForm.do") public String loginForm(HttpServletRequest req, @RequestParam(required = false) String error, @RequestParam(required = false) String message, @RequestParam(required = false) String logout, RedirectAttributes redirectAttrs, @RequestParam Map paramMap, Model model, HttpSession session) { //---------------------------------------------- // 지방문화원 사이트에서 접속한 경우, 지방문화원 정보 확인 //---------------------------------------------- String councilJsessionId = (String)session.getAttribute("councilJsessionId"); String councilDnsHost = (String)session.getAttribute("councilDnsHost"); String councilReturnUrl = (String)session.getAttribute("councilReturnUrl"); String councilHomeUrl = (String)session.getAttribute("councilHomeUrl"); String councilCd = (String)session.getAttribute("councilCd"); String councilNm = (String)session.getAttribute("councilNm"); log.debug("loginForm > sessionid=" + session.getId()); log.debug("loginForm > councilJsessionId = " + councilJsessionId); log.debug("loginForm > councilDnsHost = " + councilDnsHost); log.debug("loginForm > councilReturnUrl = " + councilReturnUrl); log.debug("loginForm > councilHomeUrl = " + councilHomeUrl); log.debug("loginForm > councilCd = " + councilCd); log.debug("loginForm > councilNm = " + councilNm); //---------------------------------------------- // SNS 연동 URL 생성 //---------------------------------------------- OAuthLogin naverLogin = new OAuthLogin(naverAuthVO, OAuthLogin.CALL_TYPE_LOGIN); log.debug("naverLogin.getOAuthURL() = "+naverLogin.getOAuthURL()); model.addAttribute("naverUrl", naverLogin.getOAuthURL()); OAuthLogin googleLogin = new OAuthLogin(googleAuthVO, OAuthLogin.CALL_TYPE_LOGIN); log.debug("googleLogin.getOAuthURL() = "+googleLogin.getOAuthURL()); model.addAttribute("googleUrl", googleLogin.getOAuthURL()); OAuthLogin kakaoLogin = new OAuthLogin(kakaoAuthVO, OAuthLogin.CALL_TYPE_LOGIN); log.debug("kakaoLogin.getOAuthURL() = "+kakaoLogin.getOAuthURL()); model.addAttribute("kakaoUrl", kakaoLogin.getOAuthURL()); model.addAttribute("error", error); model.addAttribute("message", message); if(StringUtil.equalsIgnoreCase(logout, "logout")) { model.addAttribute("message", "로그아웃되었습니다. 감사합니다."); } return "nlib/login/loginForm"; } /** * SNS 로그인 후, 콜백으로 호출되며 회원가입된 사용자가 존재하는 지 확인하여 로그인 처리가 진행될 수 있도록 한다. * 정상 회원가입자인 경우, 해당 지방문화원 도메인(호스트)주소로 loginCouncilSSO(..)가 재호출되어 실제 세션 로그인 처리 마무리가 이루어진다. * * @param req * @param oauthServiceName * @param paramMap * @param model * @param session * @return * @throws Exception */ @RequestMapping(value = {"/{callType}/{oauthServiceName}/callback.do"}) // /login/{oauthServiceName}/callback.do, /member/{oauthServiceName}/callback.do public String loginOauthCallback( HttpServletRequest req, @PathVariable String callType, @PathVariable String oauthServiceName, @RequestParam(required = false) String code, @RequestParam(required = false) String error, Model model, HttpSession session) throws Exception { String councilJsessionId = (String)session.getAttribute("councilJsessionId"); String councilCd = (String)session.getAttribute("councilCd"); String councilHomeUrl = (String)session.getAttribute("councilHomeUrl"); String redirectUrl = NlibProperty.getString("home.uri"); // "/index.do"; if(StringUtil.isNotEmpty(error)) { // 구글 정보 제공 동의 거절한 경우 // https://nlib-dev.nculture.org/member/google/callback.do?error=access_denied if(StringUtil.equalsIgnoreCase("access_denied", error)) { if(OAuthLogin.CALL_TYPE_LOGIN.equalsIgnoreCase(callType)) { // 로그인인 경우 redirectUrl = councilHomeUrl + NlibProperty.getString("nculture.login.post.login.redirect.uri"); } else { // 회원가입인 경우 redirectUrl = councilHomeUrl + NlibProperty.getString("nculture.login.post.member.redirect.uri"); } model.addAttribute("url", redirectUrl); model.addAttribute("message", StringUtil.encodeUrl("서비스를 이용하시려면 정보제공 동의가 필요합니다.")); return "nlib/login/loginPreSet"; } } log.debug("loginOauthCallback > sessionid=" + session.getId()); log.debug("oauthLoginCallback: code = ", code); // SNS 클라이언트 설정 정보 할당 OAuthVO oauthVO = null; if (StringUtil.equalsIgnoreCase(OAuthConfig.NAVER_SERVICE_NAME, oauthServiceName)) oauthVO = naverAuthVO; else if (StringUtil.equalsIgnoreCase(OAuthConfig.GOOGLE_SERVICE_NAME, oauthServiceName)) oauthVO = googleAuthVO; else if (StringUtil.equalsIgnoreCase(OAuthConfig.KAKAO_SERVICE_NAME, oauthServiceName)) oauthVO = kakaoAuthVO; else { throw new Exception("SNS 연동 콜백정보가 올바르지 않습니다."); } //----------------------------------------------- // 1. code를 이용해서 Access Token 받기 // 2. Access Token을 이용해서 사용자 제공 정보 가져오기 //----------------------------------------------- OAuthLogin oauthLogin = new OAuthLogin(oauthVO, callType); OAuthUniversalUser oauthUser = oauthLogin.getUserProfile(code); // 1,2번 동시 log.debug("oauthLoginCallback > Profile ===>>" + oauthUser.getSnsId() + ", " + oauthUser.getSnsName()); // oAuth를 통한 SNS연동이 실패한 경우 if(oauthUser == null || !oauthUser.isValid()) { redirectUrl = NlibProperty.getString("member.new.url"); // "/member/insertMemberInfoForm.do" model.addAttribute("url", redirectUrl); model.addAttribute("message", StringUtil.encodeUrl("먼저 회원가입하신 후, 이용하여 주시기 바랍니다.")); return "nlib/login/loginPreSet"; } //----------------------------------------------- // 해당 처리기로 전환 //----------------------------------------------- if(OAuthLogin.CALL_TYPE_LOGIN.equalsIgnoreCase(callType)) { // 로그인인 경우 SessionConfig.setLoginInfo(councilJsessionId, oauthUser); redirectUrl = councilHomeUrl + NlibProperty.getString("nculture.login.post.login.redirect.uri"); } else { // 회원가입인 경우 SessionConfig.setNewMemberInfo(councilJsessionId, oauthUser); redirectUrl = councilHomeUrl + NlibProperty.getString("nculture.login.post.member.redirect.uri"); } model.addAttribute("url", redirectUrl); return "nlib/login/loginPreSet"; } /** * ID, PW를 입력받아 로그인을 처리한다. * (스프링 시큐리티 로그인 수행) * * @param req * @param res * @param username * @param password * @param model * @return */ @RequestMapping("/login/login.do") public String login(HttpServletRequest req, HttpServletResponse res, @RequestParam(required = false) String username, @RequestParam(required = false) String password, ModelMap model) { String loginResult = loginService.login(req, username, password); String redirectUrl = NlibProperty.getString("home.uri"); // 정상적으로 로그인된 경우 if (StringUtil.isEmpty(loginResult)) { RequestCache cache = new HttpSessionRequestCache(); SavedRequest savedRequest = cache.getRequest(req, res); if (savedRequest != null) { redirectUrl = savedRequest.getRedirectUrl(); } } // 로그인 실패 else { redirectUrl = NlibProperty.getString("login.back.url") + "?error=" + loginResult; } log.debug("login.do > loginResult = " + loginResult); log.debug("login.do > redirectUrl = " + redirectUrl); return "redirect:" + redirectUrl; } /** * 정상적인 사용자의 로그인 요청이 검증된 후, 실제 해당 지방문화원 사이트 URL로 호출되는 함수로써 로그인 최종 처리를 진행한다. * * @param req * @param res * @param session * @param model * @return * @throws Exception */ @RequestMapping("/login/loginCouncilSSO.do") public String loginCouncilSSO( HttpServletRequest req, HttpServletResponse res, HttpSession session, ModelMap model) throws Exception { String jsessionId = session.getId(); String councilCd = (String)session.getAttribute("councilCd"); String councilReturnUrl = (String)session.getAttribute("councilReturnUrl"); OAuthUniversalUser oauthUser = SessionConfig.getLoginInfo(jsessionId); if(oauthUser == null || !oauthUser.isValid()) { throw new Exception("잘못된 접근입니다."); } //----------------------------------------------- // 로그인 처리 //----------------------------------------------- String loginResult = loginService.loginCouncilSSO(req, councilCd, oauthUser); // 정상 SNS 연동 로그인 if(loginResult == null) { SessionConfig.removeLoginInfo(jsessionId); // 세션에 설정된 redirect 주소 확인 return "redirect:" + councilReturnUrl; } // 휴면계좌 if(StringUtil.equalsIgnoreCase(loginResult, loginService.WRN_CODE_DORMANT)) { return "redirect:" + NlibProperty.getString("login.dormant.url"); } // SNS 로그인은 정상적이나, NLIB 시스템에 등록되지 않은 사용자 : 회원가입으로 전환 model.addAttribute("error", loginResult); if(StringUtil.equalsIgnoreCase(loginResult, loginService.ERR_CODE_REQ_MEMBERSHIP)) { SessionConfig.setNewMemberInfo(jsessionId, oauthUser); SessionConfig.removeLoginInfo(jsessionId); model.addAttribute("message", "회원가입하신 후, 이용 가능합니다."); return "redirect:" + NlibProperty.getString("member.new.url"); } else if(StringUtil.equalsIgnoreCase(loginResult, loginService.ERR_CODE_REQ_SNSLOGIN)) { SessionConfig.removeLoginInfo(jsessionId); model.addAttribute("message", "먼저 로그인할 SNS를 선택하여 로그인 바랍니다."); return "redirect:" + NlibProperty.getString("login.back.url"); } // 잘못된 접근 또는 기타 오류 SessionConfig.removeLoginInfo(jsessionId); model.addAttribute("message", "기타 문제로 인하여 로그인에 실패하였습니다. : " + loginResult); return "redirect:" + NlibProperty.getString("login.back.url"); } /** * 로그아웃 후의 처리를 담당한다. 스프링 시큐리티에서 로그아웃이 수행된 후, 호출된다. * * @param req * @return */ @RequestMapping("/login/logout.do") public String logout(HttpServletRequest req) { return null; } /** * 휴면계좌 안내 및 해지 선택 화면을 표출한다. * * @param req * @param error * @param message * @param logout * @param redirectAttrs * @param paramMap * @param model * @param session * @return */ @RequestMapping("/login/activateDormantAccForm.do") public String activateDormantAccForm( HttpServletRequest req, RedirectAttributes redirectAttrs, @RequestParam Map paramMap, Model model, HttpSession session) { //---------------------------------------------- // 지방문화원 사이트에서 접속한 경우, 지방문화원 정보 확인 //---------------------------------------------- String councilJsessionId = (String)session.getAttribute("councilJsessionId"); String councilDnsHost = (String)session.getAttribute("councilDnsHost"); String councilReturnUrl = (String)session.getAttribute("councilReturnUrl"); String councilHomeUrl = (String)session.getAttribute("councilHomeUrl"); String councilCd = (String)session.getAttribute("councilCd"); String councilNm = (String)session.getAttribute("councilNm"); log.debug("activateDormantAccForm > sessionid=" + session.getId()); log.debug("activateDormantAccForm > councilJsessionId = " + councilJsessionId); log.debug("activateDormantAccForm > councilDnsHost = " + councilDnsHost); log.debug("activateDormantAccForm > councilReturnUrl = " + councilReturnUrl); log.debug("activateDormantAccForm > councilHomeUrl = " + councilHomeUrl); log.debug("activateDormantAccForm > councilCd = " + councilCd); log.debug("activateDormantAccForm > councilNm = " + councilNm); OAuthUniversalUser oauthUser = SessionConfig.getLoginInfo(session.getId()); model.addAttribute("oauthUser", oauthUser); return "nlib/login/activateDormantAccForm"; } /** * 휴면계좌 안내 및 해지 선택 화면을 표출한다. * * @param req * @param error * @param message * @param logout * @param redirectAttrs * @param paramMap * @param model * @param session * @return */ @RequestMapping("/login/activateDormantAcc.do") public String activateDormantAcc( HttpServletRequest req, @RequestParam Map paramMap, Model model, HttpSession session) { String mbInfoId = StringUtil.getString(paramMap.get("mbInfoId"), ""); //---------------------------------------------- // 지방문화원 사이트에서 접속한 경우, 지방문화원 정보 확인 //---------------------------------------------- String councilDnsHost = (String)session.getAttribute("councilDnsHost"); String councilReturnUrl = (String)session.getAttribute("councilReturnUrl"); String councilHomeUrl = (String)session.getAttribute("councilHomeUrl"); String councilCd = (String)session.getAttribute("councilCd"); String councilNm = (String)session.getAttribute("councilNm"); log.debug("activateDormantAcc > sessionid=" + session.getId()); log.debug("activateDormantAcc > councilDnsHost = " + councilDnsHost); log.debug("activateDormantAcc > councilReturnUrl = " + councilReturnUrl); log.debug("activateDormantAcc > councilHomeUrl = " + councilHomeUrl); log.debug("activateDormantAcc > councilCd = " + councilCd); log.debug("activateDormantAcc > councilNm = " + councilNm); OAuthUniversalUser oauthUser = SessionConfig.getLoginInfo(session.getId()); NlibLoginVO loginVO = oauthUser.getNlibVO(); if(loginVO == null || !mbInfoId.equals(loginVO.getMbInfoId())) { model.addAttribute("code", "TIMEOUT"); model.addAttribute("message", "잘못된 접근입니다. 장시간 대기로 다시 로그인 하신 후, 이용해 주시기 바랍니다."); return "nlib/login/activateDormantAccForm"; } int ret = loginService.activateDormantAcc(loginVO); if(ret < 1) { model.addAttribute("code", "NO_TARGET"); model.addAttribute("message", "휴면사용자가 아닙니다. 다시 로그인하시거나 관리자에게 문의하여 주시기 바랍니다."); return "nlib/login/activateDormantAccForm"; } model.addAttribute("oauthUser", oauthUser); return "nlib/login/activateDormantAcc"; } @RequestMapping("/login/agreeProvInfoForm.do") public String agreeProvInfoForm( HttpServletRequest req, RedirectAttributes redirectAttrs, @RequestParam Map paramMap, Model model, HttpSession session) { //---------------------------------------------- // 지방문화원 사이트에서 접속한 경우, 지방문화원 정보 확인 //---------------------------------------------- String councilJsessionId = (String)session.getAttribute("councilJsessionId"); String councilDnsHost = (String)session.getAttribute("councilDnsHost"); String councilReturnUrl = (String)session.getAttribute("councilReturnUrl"); String councilHomeUrl = (String)session.getAttribute("councilHomeUrl"); String councilCd = (String)session.getAttribute("councilCd"); String councilNm = (String)session.getAttribute("councilNm"); log.debug("activateDormantAccForm > sessionid=" + session.getId()); log.debug("activateDormantAccForm > councilDnsHost = " + councilDnsHost); log.debug("activateDormantAccForm > councilReturnUrl = " + councilReturnUrl); log.debug("activateDormantAccForm > councilHomeUrl = " + councilHomeUrl); log.debug("activateDormantAccForm > councilCd = " + councilCd); log.debug("activateDormantAccForm > councilNm = " + councilNm); OAuthUniversalUser oauthUser = SessionConfig.getLoginInfo(session.getId()); model.addAttribute("oauthUser", oauthUser); model.addAttribute("councilCd", councilCd); model.addAttribute("councilNm", councilNm); return "nlib/login/agreeProvInfoForm"; } @RequestMapping("/login/agreeProvInfo.do") public String agreeProvInfo( HttpServletRequest req, RedirectAttributes redirectAttrs, @RequestParam Map paramMap, ModelMap model, HttpSession session) throws Exception { //---------------------------------------------- // 지방문화원 사이트에서 접속한 경우, 지방문화원 정보 확인 //---------------------------------------------- String councilJsessionId = (String)session.getAttribute("councilJsessionId"); String councilDnsHost = (String)session.getAttribute("councilDnsHost"); String councilReturnUrl = (String)session.getAttribute("councilReturnUrl"); String councilHomeUrl = (String)session.getAttribute("councilHomeUrl"); String councilCd = (String)session.getAttribute("councilCd"); String councilNm = (String)session.getAttribute("councilNm"); String pCouncilCd = paramMap.get("councilCd"); if(StringUtil.isEmpty(pCouncilCd) || StringUtil.isEmpty(councilCd) || !StringUtil.equalsIgnoreCase(councilCd, pCouncilCd)) { throw new Exception("잘못된 접근입니다."); } log.debug("agreeProvInfo > sessionid=" + session.getId()); log.debug("agreeProvInfo > councilDnsHost = " + councilDnsHost); log.debug("agreeProvInfo > councilReturnUrl = " + councilReturnUrl); log.debug("agreeProvInfo > councilHomeUrl = " + councilHomeUrl); log.debug("agreeProvInfo > councilCd = " + councilCd); log.debug("agreeProvInfo > councilNm = " + councilNm); // 지방문화원 추가 OAuthUniversalUser oauthUser = SessionConfig.getLoginInfo(session.getId()); NlibLoginVO nlibLoginVO = oauthUser.getNlibVO(); nlibLoginVO.setJoinCouncilCd(pCouncilCd); nlibLoginVO.setJoinType(oauthUser.getSnsType()); int resultCount = loginService.agreeProvInfo(nlibLoginVO); model.addAttribute("resultCount", resultCount); model.addAttribute("oauthUser", oauthUser); model.addAttribute("councilCd", councilCd); model.addAttribute("councilNm", councilNm); return "nlib/login/agreeProvInfo"; } // // 구글 로그인 콜백 // @RequestMapping(value = "/login/googleCallback.do") // public String googleCallback(@RequestParam(value = "code") String authCode, HttpSession session, Model model, // HttpServletRequest request) throws Exception { // // String code = request.getParameter("code"); // HttpHeaders headers = new HttpHeaders(); // RestTemplate restTemplate = new RestTemplate(); // headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); // // MultiValueMap parameters = new LinkedMultiValueMap<>(); // parameters.add("code", code); // parameters.add("client_id", "879126511006-jro7bld7b2epl3n5mkksp0p24k2inbpu.apps.googleusercontent.com"); // parameters.add("client_secret", "F6T-ZV9jibLhKtcugxPUtBlN"); // parameters.add("redirect_uri", "http://nlib.nculture.org/nlib/login/googleCallback.do"); // parameters.add("grant_type", "authorization_code"); // // HttpEntity> rest_request = new HttpEntity<>(parameters,headers); // // URI uri = URI.create("https://www.googleapis.com/oauth2/v4/token"); // // ResponseEntity resultEntity; // resultEntity = restTemplate.postForEntity(uri, rest_request, String.class); // // JSON 파싱을 위한 기본값 세팅 // // 요청시 파라미터는 스네이크 케이스로 세팅되므로 Object mapper에 미리 설정해준다. // ObjectMapper mapper = new ObjectMapper(); // mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); // mapper.setSerializationInclusion(Include.NON_NULL); // // Token Request // GoogleOAuthResponse result = mapper.readValue(resultEntity.getBody(), new TypeReference() { // }); // // // ID Token만 추출 (사용자의 정보는 jwt로 인코딩 되어있다) // String jwtToken = result.getIdToken(); // String requestUrl = UriComponentsBuilder.fromHttpUrl("https://oauth2.googleapis.com/tokeninfo") // .queryParam("id_token", jwtToken).toUriString(); // // String resultJson = restTemplate.getForObject(requestUrl, String.class); // // Map userInfo = mapper.readValue(resultJson, new TypeReference>() { // }); // System.out.println(userInfo.get("email")); // model.addAttribute("token", result.getAccessToken()); // // return "redirect:/"; // } // @RequestMapping(value = "/login/kakaoCallback.do") // public ModelAndView kakaoCallback(@RequestParam("code") String code, HttpServletRequest request, HttpServletResponse response, HttpSession session) // throws Exception { // ModelAndView mav = new ModelAndView(); // // 결과값을 node에 담아줌 // String k_redirect_url="http://nlib.nculture.org/nlib/login/kakaoCallback.do"; // JsonNode node = KakaoController.getAccessToken(code,k_redirect_url); // // accessToken에 사용자의 로그인한 모든 정보가 들어있음 // JsonNode accessToken = node.get("access_token"); // // 사용자의 정보 // JsonNode userInfo = KakaoController.getKakaoUserInfo(accessToken); // String kemail = null; // String kname = null; // String kgender = null; // String kbirthday = null; // String kage = null; // String kimage = null; // // 유저정보 카카오에서 가져오기Get properties // JsonNode properties = userInfo.path("properties"); // JsonNode kakao_account = userInfo.path("kakao_account"); // kemail = kakao_account.path("email").asText(); // kname = properties.path("nickname").asText(); // kimage = properties.path("profile_image").asText(); // kgender = kakao_account.path("gender").asText(); // kbirthday = kakao_account.path("birthday").asText(); // kage = kakao_account.path("age_range").asText(); // session.setAttribute("kemail", kemail); // session.setAttribute("kname", kname); // session.setAttribute("kimage", kimage); // session.setAttribute("kgender", kgender); // session.setAttribute("kbirthday", kbirthday); // session.setAttribute("kage", kage); // mav.setViewName("main"); // return mav; // }// end kakaoLogin() // }