nbs0105 / BOOT_CMS star
문성진 문성진 2023-05-29
전자정부 3.9버전업 웨일 로그인 작업
웨일 로그인 작업
@d37f2391939f50cb0fc0286b414ec82a85fc6453
base/Documents/BaseForMySql_v1.0.erwin (Binary)
--- base/Documents/BaseForMySql_v1.0.erwin
+++ base/Documents/BaseForMySql_v1.0.erwin
Binary file is not shown
base/pom.xml
--- base/pom.xml
+++ base/pom.xml
@@ -10,8 +10,8 @@
     <url>http://maven.apache.org</url>
 
     <properties>
-        <spring.maven.artifact.version>4.3.16.RELEASE</spring.maven.artifact.version>
-        <egovframework.rte.version>3.8.0</egovframework.rte.version>
+        <spring.maven.artifact.version>4.3.22.RELEASE</spring.maven.artifact.version>
+        <egovframework.rte.version>3.9.0</egovframework.rte.version>
     </properties>
 
     <repositories>
@@ -396,36 +396,6 @@
             </exclusions>
 		</dependency> -->
         
-        <!-- oauth2 login -->
-	    <!-- <dependency>
-              <groupId>com.github.scribejava</groupId>
-              <artifactId>scribejava-apis</artifactId>
-              <version>5.6.0</version>
-        </dependency>
-
-        <dependency>
-              <groupId>com.github.scribejava</groupId>
-              <artifactId>scribejava-core</artifactId>
-              <version>5.6.0</version>
-        </dependency>
-        
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-            <version>4.3.4</version>
-            <exclusions>
-                <exclusion>
-                    <artifactId>commons-logging</artifactId>
-                    <groupId>commons-logging</groupId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>com.h2database</groupId>
-            <artifactId>h2</artifactId>
-            <version>1.4.180</version>
-        </dependency> -->
-        
         <!-- WebSocket Messenger -->
         <!-- <dependency>
             <groupId>javax.websocket</groupId>
@@ -580,26 +550,44 @@
         <!-- 3rd party 라이브러리로 별도의 설치 필요 끝 -->
 
         <!-- 공통컴포넌트 끝 -->
-		
-		<!-- naver연동 -->
-		<dependency>
-		    <groupId>com.github.scribejava</groupId>
-		    <artifactId>scribejava-core</artifactId>
-		    <version>2.8.1</version>
-		</dependency>
-		
-		<dependency>
-		    <groupId>com.squareup.okhttp3</groupId>
-		    <artifactId>okhttp</artifactId>
-		    <version>4.2.2</version>
-		</dependency>
-		
+
+        <!-- oauth2 login -->
+        <dependency>
+            <groupId>com.github.scribejava</groupId>
+            <artifactId>scribejava-apis</artifactId>
+            <version>5.6.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.scribejava</groupId>
+            <artifactId>scribejava-core</artifactId>
+            <version>5.6.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.13</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <version>1.4.180</version>
+        </dependency>
+
 		<dependency>
 		    <groupId>com.drewnoakes</groupId>
 		    <artifactId>metadata-extractor</artifactId>
 		    <version>2.6.2</version>
 		</dependency>
-		
+
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>4.2.2</version>
+        </dependency>
+
 		<!-- mybatis log4jdbc-log4j2 라이브러리 -->
         <dependency>
             <groupId>org.bgee.log4jdbc-log4j2</groupId>
@@ -668,7 +656,7 @@
                         <dependency>
                             <groupId>org.hsqldb</groupId>
                             <artifactId>hsqldb</artifactId>
-                            <version>2.5.0</version>
+                            <!--<version>3.0.0</version>-->
                         </dependency>
                     </dependencies>
                 </plugin>
@@ -756,7 +744,7 @@
         </profile>
     </profiles>
 
-    <reporting>
+    <!--<reporting>
         <outputDirectory>${basedir}/target/site</outputDirectory>
         <plugins>
             <plugin>
@@ -778,7 +766,7 @@
                     </reportSet>
                 </reportSets>
             </plugin>
-            <!-- JUnit Test Results & EMMA Coverage Reporting -->
+            &lt;!&ndash; JUnit Test Results & EMMA Coverage Reporting &ndash;&gt;
             <plugin>
                 <groupId>org.codehaus.mojo</groupId>
                 <artifactId>emma-maven-plugin</artifactId>
@@ -796,7 +784,7 @@
                     </reportSet>
                 </reportSets>
             </plugin>
-            <!-- Generating JavaDoc Report -->
+            &lt;!&ndash; Generating JavaDoc Report &ndash;&gt;
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-javadoc-plugin</artifactId>
@@ -808,7 +796,7 @@
                     <charset>${encoding}</charset>
                 </configuration>
             </plugin>
-            <!-- Generating Java Source in HTML -->
+            &lt;!&ndash; Generating Java Source in HTML &ndash;&gt;
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jxr-plugin</artifactId>
@@ -820,5 +808,5 @@
                 </configuration>
             </plugin>
         </plugins>
-    </reporting>
+    </reporting>-->
 </project>
base/src/main/java/egovframework/com/cmm/service/Globals.java
--- base/src/main/java/egovframework/com/cmm/service/Globals.java
+++ base/src/main/java/egovframework/com/cmm/service/Globals.java
@@ -54,7 +54,7 @@
 	
 	// 도메인 (localhost)
 	public static final String DOMAIN = EgovProperties.getProperty("Globals.Domain");
-	
+
 	// SSL 적용여부
 	public static final String SSL_AT = EgovProperties.getProperty("Globals.SslAt");
 		
@@ -94,7 +94,11 @@
 	public static final String VOD_CONVERTER = EgovProperties.getProperty("Globals.VodConverter");
 	
 	public static final String VOD_PROBER = EgovProperties.getProperty("Globals.VodProber");
-	
+
+	// 웨일
+	public static final String CLIENT_ID = EgovProperties.getProperty("Globals.ClientId");
+	public static final String CLIENT_SECRET = EgovProperties.getProperty("Globals.ClientSecret");
+
 	//엑셀 템플릿 경로
   	public static final String EXCEL_TEMPLATE_DIRECTORY = EgovProperties.getProperty("Globals.ExcelTemplateDirectory");
 	
 
base/src/main/java/egovframework/com/front/api/whale/web/AuthController.java (added)
+++ base/src/main/java/egovframework/com/front/api/whale/web/AuthController.java
@@ -0,0 +1,93 @@
+package egovframework.com.front.api.whale.web;
+
+import java.io.PrintWriter;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import egovframework.module.sym.sit.service.SiteManageService;
+import egovframework.module.sym.sit.service.SiteManageVO;
+import egovframework.module.uat.uia.service.LoginService;
+import egovframework.module.uat.uia.service.LoginVO;
+import egovframework.module.utl.cas.service.EgovSessionCookieUtil;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.github.scribejava.core.model.OAuth2AccessToken;
+import com.google.gson.Gson;
+
+import egovframework.rte.fdl.property.EgovPropertyService;
+import net.sf.json.JSONObject;
+
+
+@Controller
+public class AuthController {
+
+	@Resource(name = "loginService")
+	private LoginService loginService;
+
+	@Resource(name = "siteManageService")
+	SiteManageService siteManageService;
+
+	@Resource(name = "propertiesService")
+	protected EgovPropertyService propertyService;
+
+	//웨일 return auth
+	@RequestMapping(value="/api/whale/auth/whaleLoginUrl.do")
+	public String whaleLoginUrl(@ModelAttribute("loginVO") LoginVO loginVO, HttpSession session)throws Exception {
+		//웨일 아이디 인증 URL을 생성하기 위하여 getAuthorizationUrl메소드 호출
+		String whaleAuthUrl = loginService.getAuthorizationUrl(session);
+
+		return "redirect:" + whaleAuthUrl;
+	}
+
+	//웨일 return auth
+	@RequestMapping(value="/api/whale/auth/whaleLogin.do")
+	public String callbackUrl(@ModelAttribute("loginVO") LoginVO loginVO, @RequestParam String code, @RequestParam String state, HttpSession session, HttpServletRequest request, HttpServletResponse response, ModelMap model)throws Exception {
+		try{
+			OAuth2AccessToken oauthToken;
+			oauthToken = loginService.getAccessToken(session, code, state);
+
+			//로그인 사용자 정보를 읽어온다.
+			String apiResult = loginService.getUserProfile(oauthToken);
+
+			loginVO = loginService.userApiCheck(apiResult);
+			EgovSessionCookieUtil.setSessionAttribute(request, "loginVO", loginVO);
+
+		}catch(Exception e) {
+			SiteManageVO siteVO = siteManageService.selectSiteServiceInfo(request);
+
+			model.addAttribute("message", siteVO.getSiteNm() + "서비스 동의 후에 서비스 이용 가능합니다.");
+		}finally {
+			return "redirect:/index.do";
+		}
+
+	}
+
+	/*
+	@RequestMapping(value = "/auth/myinfo.do")
+	public void myinfo(String token, HttpServletRequest request,HttpServletResponse response) throws Exception {
+		response.setHeader("Access-Control-Allow-Origin", "*");
+
+		OAuth2AccessToken searchToken = new OAuth2AccessToken(token);
+		String apiResult = loginService.getUserProfile(searchToken);
+
+		String successYn = "Y";
+		JSONObject jo = new JSONObject();
+		response.setContentType("application/json;charset=utf-8");
+
+		jo.put("successYn", successYn);
+		jo.put("items", apiResult);
+
+		PrintWriter printwriter = response.getWriter();
+		printwriter.println(jo.toString());
+		printwriter.flush();
+		printwriter.close();
+	}
+	*/
+}(파일 끝에 줄바꿈 문자 없음)
 
base/src/main/java/egovframework/module/api/whale/service/WhaleLoginApi.java (added)
+++ base/src/main/java/egovframework/module/api/whale/service/WhaleLoginApi.java
@@ -0,0 +1,30 @@
+package egovframework.module.api.whale.service;
+
+import com.github.scribejava.core.builder.api.DefaultApi20;
+
+public class WhaleLoginApi extends DefaultApi20 {
+	protected WhaleLoginApi(){
+    }
+
+    private static class InstanceHolder{
+        private static final WhaleLoginApi INSTANCE = new WhaleLoginApi();
+    }
+
+    public static WhaleLoginApi instance(){
+        return InstanceHolder.INSTANCE;
+    }
+    
+    @Override
+    public String getAccessTokenEndpoint() {
+        //return "https://nid.naver.com/oauth2.0/token?grant_type=authorization_code";
+    	return "https://auth.whalespace.io/oauth2/v1.1/token?grant_type=authorization_code";
+    }
+
+    @Override
+    protected String getAuthorizationBaseUrl() {
+        // TODO Auto-generated method stub
+        //return"https://nid.naver.com/oauth2.0/authorize";
+    	return"https://auth.whalespace.io/oauth2/v1.1/authorize";
+    }
+    
+}
 
base/src/main/java/egovframework/module/api/whale/service/WhaleOrgunit.java (added)
+++ base/src/main/java/egovframework/module/api/whale/service/WhaleOrgunit.java
@@ -0,0 +1,36 @@
+package egovframework.module.api.whale.service;
+
+
+
+public class WhaleOrgunit {
+
+	private String id;
+	
+	private String name;
+	
+	private String orgUnitPath;
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getOrgUnitPath() {
+		return orgUnitPath;
+	}
+
+	public void setOrgUnitPath(String orgUnitPath) {
+		this.orgUnitPath = orgUnitPath;
+	}
+}
 
base/src/main/java/egovframework/module/api/whale/service/WhaleSpace.java (added)
+++ base/src/main/java/egovframework/module/api/whale/service/WhaleSpace.java
@@ -0,0 +1,31 @@
+package egovframework.module.api.whale.service;
+
+public class WhaleSpace {
+
+	String name;
+	
+	String code;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	@Override
+	public String toString() {
+		return "NaverSpace [name=" + name + ", code=" + code + "]";
+	}
+	
+	
+}
 
base/src/main/java/egovframework/module/api/whale/service/WhaleUser.java (added)
+++ base/src/main/java/egovframework/module/api/whale/service/WhaleUser.java
@@ -0,0 +1,74 @@
+package egovframework.module.api.whale.service;
+
+public class WhaleUser {
+	
+	private String primaryEmail;
+	
+	private String sid;
+	
+	private String userType;
+	
+	private WhaleUserName name;
+	
+	private String thumbnailPhotoUrl;
+	
+	private WhaleSpace space;
+
+	private WhaleOrgunit orgunit;
+
+	public String getPrimaryEmail() {
+		return primaryEmail;
+	}
+
+	public void setPrimaryEmail(String primaryEmail) {
+		this.primaryEmail = primaryEmail;
+	}
+
+	public String getSid() {
+		return sid;
+	}
+
+	public void setSid(String sid) {
+		this.sid = sid;
+	}
+
+	public String getUserType() {
+		return userType;
+	}
+
+	public void setUserType(String userType) {
+		this.userType = userType;
+	}
+
+	public WhaleUserName getName() {
+		return name;
+	}
+
+	public void setName(WhaleUserName name) {
+		this.name = name;
+	}
+
+	public String getThumbnailPhotoUrl() {
+		return thumbnailPhotoUrl;
+	}
+
+	public void setThumbnailPhotoUrl(String thumbnailPhotoUrl) {
+		this.thumbnailPhotoUrl = thumbnailPhotoUrl;
+	}
+
+	public WhaleSpace getSpace() {
+		return space;
+	}
+
+	public void setSpace(WhaleSpace space) {
+		this.space = space;
+	}
+
+	public WhaleOrgunit getOrgunit() {
+		return orgunit;
+	}
+
+	public void setOrgunit(WhaleOrgunit orgunit) {
+		this.orgunit = orgunit;
+	}
+}
 
base/src/main/java/egovframework/module/api/whale/service/WhaleUserName.java (added)
+++ base/src/main/java/egovframework/module/api/whale/service/WhaleUserName.java
@@ -0,0 +1,35 @@
+package egovframework.module.api.whale.service;
+
+public class WhaleUserName {
+
+	private String givenName;
+	
+	private String familyName;
+	
+	private String fullName;
+
+	public String getGivenName() {
+		return givenName;
+	}
+
+	public void setGivenName(String givenName) {
+		this.givenName = givenName;
+	}
+
+	public String getFamilyName() {
+		return familyName;
+	}
+
+	public void setFamilyName(String familyName) {
+		this.familyName = familyName;
+	}
+
+	public String getFullName() {
+		return fullName;
+	}
+
+	public void setFullName(String fullName) {
+		this.fullName = fullName;
+	}
+
+}
base/src/main/java/egovframework/module/uat/uia/service/LoginService.java
--- base/src/main/java/egovframework/module/uat/uia/service/LoginService.java
+++ base/src/main/java/egovframework/module/uat/uia/service/LoginService.java
@@ -1,137 +1,88 @@
 package egovframework.module.uat.uia.service;
 
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ExecutionException;
 
+import com.github.scribejava.core.model.OAuth2AccessToken;
 import egovframework.module.sym.log.service.LoginInfoVO;
+
+import javax.servlet.http.HttpSession;
 
 //일반 로그인, 인증서 로그인을 처리하는 비즈니스 인터페이스 클래스
 public interface LoginService {
 	
-	/**
-	 * 일반 로그인을 처리한다
-	 * @param vo LoginVO
-	 * @return LoginVO
-	 * @exception Exception
-	 */
+	//일반 로그인을 처리한다
     LoginVO actionLogin(LoginVO vo) throws Exception;
     
-    /**
-	 * 인증서 로그인을 처리한다
-	 * @param vo LoginVO
-	 * @return LoginVO
-	 * @exception Exception
-	 */
+    //인증서 로그인을 처리한다
     LoginVO actionCrtfctLogin(LoginVO vo) throws Exception;
     
-    /**
-	 * 아이디를 찾는다.
-	 * @param vo LoginVO
-	 * @return LoginVO
-	 * @exception Exception
-	 */
+    //아이디를 찾는다.
     LoginVO searchId(LoginVO vo) throws Exception;
     
-    /**
-	 * 비밀번호를 찾는다.
-	 * @param vo LoginVO
-	 * @return boolean
-	 * @exception Exception
-	 */
+    //비밀번호를 찾는다.
     Map<String, Object> searchPassword(LoginVO vo, boolean update) throws Exception;
     
-    /**
-	 * 아이디로 사용자정보를 찾는다.
-	 * @param userId String
-	 * @return LoginVO
-	 * @exception Exception
-	 */
+    //아이디로 사용자정보를 찾는다.
     LoginVO searchSSOLogin(LoginInfoVO loginInfoVO) throws Exception;
     
-    /**
-	 * 로그아웃 아이디를 추가한다.
-	 * @param userId String
-	 * @exception Exception
-	 */
+    //로그아웃 아이디를 추가한다.
     void addLogoutList(LoginInfoVO loginInfoVO) throws Exception ;
     
-    /**
-	 * 로그아웃 아이디를 삭제한다.
-	 * @param userId String
-	 * @exception Exception
-	 */
+    //로그아웃 아이디를 삭제한다.
     void removeLogoutList(LoginInfoVO loginInfoVO) throws Exception ;
     
-    /**
-	 * 로그아웃 아이디를 조회한다.
-	 * @param userId String
-	 * @return boolean
-	 * @exception Exception
-	 */
+    //로그아웃 아이디를 조회한다.
     boolean getLogoutListExists(LoginInfoVO loginInfoVO) throws Exception;
     
-    /**
-	 * COMTNLOGININFO을조회한다.
-	 * @param vo - 등록할 정보가 담긴 LoginInfoVO
-	 * @return 등록 결과
-	 * @exception Exception
-	 */
+    //COMTNLOGININFO을조회한다.
     int selectLoginExistsForLoginIdntfcIdCnt(LoginInfoVO loginInfoVO) throws Exception;
     
-    /**
-	 * COMTNLOGININFO을 조회한다.
-	 * @param vo - 등록할 정보가 담긴 LoginInfoVO
-	 * @return 등록 결과
-	 * @exception Exception
-	 */
+    //COMTNLOGININFO을 조회한다.
     LoginInfoVO selectLoginExistsForSession(LoginInfoVO loginInfoVO) throws Exception;
     
-    /**
-	 * COMTNLOGININFO을 조회한다.
-	 * @param vo - 등록할 정보가 담긴 LoginInfoVO
-	 * @return 등록 결과
-	 * @exception Exception
-	 */
+    //COMTNLOGININFO을 조회한다.
     LoginInfoVO selectLoginExistsForSiteId(LoginInfoVO loginInfoVO) throws Exception;
     
-    /**
-	 * COMTNLOGININFO을 등록한다.
-	 * @param vo - 등록할 정보가 담긴 LoginInfoVO
-	 * @return 등록 결과
-	 * @exception Exception
-	 */
+    //COMTNLOGININFO을 등록한다.
     String insertLoginInfo(LoginInfoVO loginInfoVO) throws Exception;
     
-    /**
-	 * 로그인한 사이트에 로그아웃을 요청한다.
-	 * @param vo - 등록할 정보가 담긴 LoginInfoVO
-	 * @exception Exception
-	 */
+    //로그인한 사이트에 로그아웃을 요청한다.
     void allSiteLogoutRequest(LoginInfoVO loginInfoVO) throws Exception;
     
-    /**
-	 * 로그인 정보를 삭제한다.
-	 * @param vo - 등록할 정보가 담긴 LoginInfoVO
-	 * @exception Exception
-	 */
+    //로그인 정보를 삭제한다.
     void deleteLoginInfo (LoginInfoVO loginInfoVO) throws Exception;
     
-    /**
-	 * 삭제할 로그인 정보조회한다.
-	 * @exception Exception
-	 */
+    //삭제할 로그인 정보조회한다.
     List<LoginInfoVO> selectRemoveTargetList() throws Exception ;
     
-    /**
-	 * 로그인 정보를 삭제한다.
-	 * @exception Exception
-	 */
+    //로그인 정보를 삭제한다.
     void deleteLogininfoRemoveTarget() throws Exception;
     
-    /**
-	 * 로그인 정보를 수정한다.
-	 * @param vo - 등록할 정보가 담긴 LoginInfoVO
-	 * @exception Exception
-	 */
+    //로그인 정보를 수정한다.
     void updateLoginInfo (LoginInfoVO loginInfoVO) throws Exception;
+
+	// 네이버&웨일 아이디로 인증  URL 생성  Method
+	String getAuthorizationUrl(HttpSession session);
+
+	// 네이버&웨일 아이디로 Callback 처리 및  AccessToken 획득 Method
+	OAuth2AccessToken getAccessToken(HttpSession session, String code, String state) throws IOException, InterruptedException, ExecutionException;
+
+	//세션 유효성 검증을 위한 난수 생성기
+	String generateRandomString();
+
+	//http session에 데이터 저장
+	void setSession(HttpSession session,String state);
+
+	//http session에서 데이터 가져오기
+	String getSession(HttpSession session);
+
+	//Access Token을 이용하여 네이버&웨일 사용자 프로필 API를 호출
+	String getUserProfile(OAuth2AccessToken oauthToken) throws IOException;
+
+    //API에서 제공 한 String값으로 회원 체크(등록&수정)
+    LoginVO userApiCheck(String str) throws Exception;
+
 }
base/src/main/java/egovframework/module/uat/uia/service/LoginVO.java
--- base/src/main/java/egovframework/module/uat/uia/service/LoginVO.java
+++ base/src/main/java/egovframework/module/uat/uia/service/LoginVO.java
@@ -61,13 +61,42 @@
 	
 	//세부전공
 	private String major;
-	
-	//교수직위
-	private String positionCode;
-	
+
 	//플래그값
 	private String flag;
-	
+
+	//API등 결과 코드
+	private String resultCode;
+
+	//API등 결과 문자
+	private String resultStr;
+
+	//웨일
+	private String tokenType;
+	private String expiresIn;
+	private String accessToken;
+	private String refreshToken;
+	private String returnCode;
+	private String returnStatus;
+	private String returnMessage;
+	private String returnReason;
+	private String sid;
+
+	//학교명
+	private String schulNm;
+
+	//학교코드
+	private String schulCode;
+
+	//학교급코드
+	private String schulGradeCode;
+
+	//학년
+	private String stGrade;
+
+	//반
+	private String stClass;
+
 	/**
 	 * id attribute 를 리턴한다.
 	 * @return String
@@ -357,12 +386,6 @@
 	public void setMajor(String major) {
 		this.major = major;
 	}
-	public String getPositionCode() {
-		return positionCode;
-	}
-	public void setPositionCode(String positionCode) {
-		this.positionCode = positionCode;
-	}
 	public String getFlag() {
 		return flag;
 	}
@@ -377,4 +400,132 @@
 	public void setEsntlId(String esntlId) {
 		this.esntlId = esntlId;
 	}
+
+	public String getResultCode() {
+		return resultCode;
+	}
+
+	public void setResultCode(String resultCode) {
+		this.resultCode = resultCode;
+	}
+
+	public String getResultStr() {
+		return resultStr;
+	}
+
+	public void setResultStr(String resultStr) {
+		this.resultStr = resultStr;
+	}
+
+	public String getTokenType() {
+		return tokenType;
+	}
+
+	public void setTokenType(String tokenType) {
+		this.tokenType = tokenType;
+	}
+
+	public String getExpiresIn() {
+		return expiresIn;
+	}
+
+	public void setExpiresIn(String expiresIn) {
+		this.expiresIn = expiresIn;
+	}
+
+	public String getAccessToken() {
+		return accessToken;
+	}
+
+	public void setAccessToken(String accessToken) {
+		this.accessToken = accessToken;
+	}
+
+	public String getRefreshToken() {
+		return refreshToken;
+	}
+
+	public void setRefreshToken(String refreshToken) {
+		this.refreshToken = refreshToken;
+	}
+
+	public String getReturnCode() {
+		return returnCode;
+	}
+
+	public void setReturnCode(String returnCode) {
+		this.returnCode = returnCode;
+	}
+
+	public String getReturnStatus() {
+		return returnStatus;
+	}
+
+	public void setReturnStatus(String returnStatus) {
+		this.returnStatus = returnStatus;
+	}
+
+	public String getReturnMessage() {
+		return returnMessage;
+	}
+
+	public void setReturnMessage(String returnMessage) {
+		this.returnMessage = returnMessage;
+	}
+
+	public String getReturnReason() {
+		return returnReason;
+	}
+
+	public void setReturnReason(String returnReason) {
+		this.returnReason = returnReason;
+	}
+
+	public String getSid() {
+		return sid;
+	}
+
+	public void setSid(String sid) {
+		this.sid = sid;
+	}
+
+	public String getSchulNm() {
+		return schulNm;
+	}
+
+	public void setSchulNm(String schulNm) {
+		this.schulNm = schulNm;
+	}
+
+	public String getStGrade() {
+		return stGrade;
+	}
+
+	public void setStGrade(String stGrade) {
+		this.stGrade = stGrade;
+	}
+
+	public String getStClass() {
+		return stClass;
+	}
+
+	public void setStClass(String stClass) {
+		this.stClass = stClass;
+	}
+
+	public String getSchulCode() {
+		return schulCode;
+	}
+
+	public void setSchulCode(String schulCode) {
+		this.schulCode = schulCode;
+	}
+
+	public String getSchulGradeCode() {
+		return schulGradeCode;
+	}
+
+	public void setSchulGradeCode(String schulGradeCode) {
+		this.schulGradeCode = schulGradeCode;
+	}
 }
base/src/main/java/egovframework/module/uat/uia/service/impl/LoginServiceImpl.java
--- base/src/main/java/egovframework/module/uat/uia/service/impl/LoginServiceImpl.java
+++ base/src/main/java/egovframework/module/uat/uia/service/impl/LoginServiceImpl.java
@@ -1,13 +1,40 @@
 package egovframework.module.uat.uia.service.impl;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.io.IOException;
+import java.net.URL;
+import java.util.*;
+import java.util.concurrent.ExecutionException;
+import java.util.regex.Pattern;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpSession;
 
+import com.fasterxml.jackson.databind.ser.impl.ReadOnlyClassToSerializerMap;
+import com.github.scribejava.core.builder.ServiceBuilder;
+import com.github.scribejava.core.model.OAuth2AccessToken;
+import com.github.scribejava.core.oauth.OAuth20Service;
+import com.google.gson.Gson;
+import egovframework.com.cmm.service.Globals;
+import egovframework.module.api.whale.service.WhaleLoginApi;
+import egovframework.module.api.whale.service.WhaleUser;
+import egovframework.module.uss.umt.service.UserManageService;
+import egovframework.module.uss.umt.service.UserManageVO;
 import egovframework.module.utl.fcc.service.CryptoUtil;
+import egovframework.rte.fdl.idgnr.EgovIdGnrService;
+import net.sf.json.JSONObject;
+import net.sf.json.JSONSerializer;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+/*
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.HttpClientBuilder;
+*/
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.springframework.stereotype.Service;
 import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
 
@@ -22,11 +49,12 @@
 import egovframework.module.utl.fcc.service.EgovStringUtil;
 import egovframework.module.utl.sim.service.EgovCrypTo;
 import egovframework.module.sms.service.SmsInfoService;
+import org.springframework.util.StringUtils;
+import sun.net.www.http.HttpClient;
 
 //일반 로그인, 인증서 로그인을 처리하는 비즈니스 구현 클래스
 @Service("loginService")
-public class LoginServiceImpl extends EgovAbstractServiceImpl implements
-		LoginService {
+public class LoginServiceImpl extends EgovAbstractServiceImpl implements LoginService {
 
     @Resource(name="loginMapper")
     private LoginMapper loginMapper;
@@ -39,9 +67,30 @@
         
 	@Resource(name = "smsInfoService")
     private SmsInfoService smsInfoService;
-	
+
+	@Resource(name = "userManageService")
+	private UserManageService userManageService;
+
+	@Resource(name="memberIdGnrService")
+	private EgovIdGnrService idgenService;
+
 	HashMap<String, String> logoutList = new HashMap<String, String>();
-	
+
+	/* 인증 요청문을 구성하는 파라미터 */
+	private final static String CLIENT_ID = Globals.CLIENT_ID;
+	private final static String CLIENT_SECRET = Globals.CLIENT_SECRET;
+	private final static String REDIRECT_URI = Globals.DOMAIN  + "/api/whale/auth/whaleLogin.do";
+	private final static String SESSION_STATE = "oauth_state";
+
+	/* 프로필 조회 API URL */
+	private final static String PROFILE_API_URL = "https://api.whalespace.io/oauth2/v1.1/userinfo";
+	private final static String AUTH_URL ="https://auth.whalespace.io/oauth2/v1.1/authorize?";
+
+	//scope URL
+	private final static String SCOPE_URL = "https://account.whalespace.io/directory/user.profile.readonly";
+
+	protected Log log = LogFactory.getLog(this.getClass());
+
     //일반 로그인을 처리한다
     public LoginVO actionLogin(LoginVO vo) throws Exception {
     	
@@ -282,4 +331,192 @@
     public void updateLoginInfo (LoginInfoVO loginInfoVO) throws Exception {
     	loginInfoService.updateLoginInfo(loginInfoVO);
     }
+
+	//네이버&웨일 아이디로 인증  URL 생성  Method
+	public String getAuthorizationUrl(HttpSession session) {
+
+		//세션 유효성 검증을 위하여 난수를 생성
+		String state = generateRandomString();
+		//생성한 난수 값을 session에 저장
+		setSession(session,state);
+
+		//Scribe에서 제공하는 인증 URL 생성 기능을 이용하여 네아로 인증 URL 생성
+		OAuth20Service oauthService = new ServiceBuilder()
+				.apiKey(CLIENT_ID)
+				.apiSecret(CLIENT_SECRET)
+				.callback(REDIRECT_URI)
+				.state(state) //앞서 생성한 난수값을 인증 URL생성시 사용함
+				.scope(SCOPE_URL)
+				.build(WhaleLoginApi.instance());
+
+		return oauthService.getAuthorizationUrl();
+	}
+
+	//세션 유효성 검증을 위한 난수 생성기
+	public String generateRandomString() {
+		return UUID.randomUUID().toString();
+	}
+
+	//http session에 데이터 저장
+	public void setSession(HttpSession session,String state){
+		session.setAttribute(SESSION_STATE, state);
+	}
+
+	//http session에서 데이터 가져오기
+	public String getSession(HttpSession session){
+		return (String) session.getAttribute(SESSION_STATE);
+	}
+
+	//네이버&웨일 아이디로 Callback 처리 및  AccessToken 획득 Method
+	public OAuth2AccessToken getAccessToken(HttpSession session, String code, String state) throws IOException, InterruptedException, ExecutionException {
+
+		String sessionState = getSession(session);
+		if(StringUtils.pathEquals(sessionState, state)){
+
+			OAuth20Service oauthService = new ServiceBuilder()
+					.apiKey(CLIENT_ID)
+					.apiSecret(CLIENT_SECRET)
+					.callback(REDIRECT_URI)
+					.build(WhaleLoginApi.instance());
+
+			OAuth2AccessToken accessToken = oauthService.getAccessToken(code);
+			return accessToken;
+		}
+		return null;
+	}
+
+	//Access Token을 이용하여 웨일 사용자 프로필 API를 호출 및 업데이
+	public String getUserProfile(OAuth2AccessToken oauthToken) throws IOException{
+
+		OkHttpClient client = new OkHttpClient().newBuilder().build();
+		Request request = new Request.Builder()
+				.url(PROFILE_API_URL)
+				.method("GET", null)
+				.addHeader("Content-Type", "application/x-www-form-urlencoded")
+				.addHeader("Authorization", "Bearer " + oauthToken.getAccessToken())
+				.build();
+		Response response = client.newCall(request).execute();
+
+		return response.body().string();
+	}
+
+	//API에서 제공 한 String값으로 회원 체크(등록&수정)
+	public LoginVO userApiCheck(String str) throws Exception{
+		LoginVO login = new LoginVO();
+		Gson gson = new Gson();
+
+		WhaleUser userInfo = gson.fromJson(str, WhaleUser.class);
+		if(userInfo.getPrimaryEmail() != null) {
+			login.setId(userInfo.getPrimaryEmail());
+			login.setPassword(userInfo.getPrimaryEmail());
+			login.setName(userInfo.getName().getFamilyName() + userInfo.getName().getGivenName());
+			login.setEmail(userInfo.getPrimaryEmail());
+			login.setPhotoStreFileNm(userInfo.getThumbnailPhotoUrl());
+			login.setSchulNm(userInfo.getSpace().getName());
+			login.setSid(userInfo.getSid());
+
+			String userSe = "01";
+			if("tea".equals(userInfo.getUserType())) {
+				userSe = "08";
+			} else if("emp".equals(userInfo.getUserType())) {
+				userSe = "08";
+			} else if("stu".equals(userInfo.getUserType())) {
+				userSe = "06";
+			} else if("par".equals(userInfo.getUserType())) {
+				userSe = "04";
+			}
+			login.setUserSeCode(userSe);
+			login.setUserSe(userSe);
+
+			if(userInfo.getSpace() != null && userInfo.getSpace().getCode() != null){
+				login.setSchulNm(userInfo.getSpace().getName());
+				login.setSchulCode(userInfo.getSpace().getCode());
+			}
+			if(!EgovStringUtil.isEmpty(userInfo.getOrgunit().getOrgUnitPath())){
+				try {
+					int grade = 0;
+					int classCode = 0;
+					String stGrade = null;
+					String stClass = null;
+
+					String[] pathArr = userInfo.getOrgunit().getOrgUnitPath().split("/");
+					for(int i = pathArr.length-1; i >= 0; i--) {
+						if(pathArr[i].trim().endsWith("학년")) {
+							String[] gradeArr = pathArr[i].split(Pattern.quote(","));
+							grade = Integer.parseInt(gradeArr[0].replaceAll("학년", "").trim());
+						} else if(pathArr[i].trim().endsWith("반")) {
+							classCode = Integer.parseInt(pathArr[i].replaceAll("반", "").trim());
+						}
+					}
+
+					if(grade != -1) {
+						stGrade = String.valueOf(grade);
+						login.setStGrade(stGrade);
+					}
+					if(classCode != -1) {
+						stClass = String.valueOf(classCode);
+						login.setStClass(stClass);
+					}
+
+				} catch(NumberFormatException ex) {
+					log.debug("NumberFormatException:" + ex.getMessage());
+				} catch(IllegalArgumentException ex) {
+					log.debug("IllegalArgumentException:" + ex.getMessage());
+				} catch(Exception ex) {
+					log.debug("Exception:" + ex.getMessage());
+				}
+			}
+
+			String enpassword = EgovCrypTo.encryptPassword(login.getPassword());
+			login.setPassword(enpassword);
+
+			String schulGradeCode = "SCH_99";
+			if(!EgovStringUtil.isEmpty(login.getSchulNm())) {
+				if(login.getSchulNm().indexOf("유치원") != -1) {
+					schulGradeCode = "SCH_01";
+				} else if(login.getSchulNm().indexOf("초등") != -1) {
+					schulGradeCode = "SCH_02";
+				} else if(login.getSchulNm().indexOf("고등") != -1) {
+					schulGradeCode = "SCH_04";
+				} else if(login.getSchulNm().indexOf("중") != -1) {
+					schulGradeCode = "SCH_03";
+				}
+			}
+			login.setSchulGradeCode(schulGradeCode);
+
+			//학교 등록 작업 해야 함
+			//schulGradeCode등등 넣고~
+
+
+			//회원 등록
+			UserManageVO userManageVO = new UserManageVO();
+			userManageVO.setUserId(login.getId());
+			userManageVO.setPassword(login.getPassword());
+			userManageVO.setUserNm(login.getName());
+			userManageVO.setUserSeCode(login.getUserSeCode());
+			userManageVO.setEmailAdres(login.getEmail());
+			userManageVO.setStGrade(login.getStGrade());
+			userManageVO.setStClass(login.getStClass());
+			userManageVO.setSchulCode(login.getSchulCode());
+			userManageVO.setSchulNm(login.getSchulNm());
+			userManageVO.setSearchCondition("ID");
+			userManageVO.setSid(login.getSid());
+			userManageVO.setSnsTyCode("WHALE");
+			userManageVO.setResultMssage(str);
+
+			UserManageVO member = userManageService.selectUser(userManageVO);
+			if(member != null){
+				member.setEsntlId(member.getEsntlId());
+				userManageService.updateManageUser(userManageVO);
+			}else{
+				String esntlId = idgenService.getNextStringId();
+				userManageVO.setEsntlId(esntlId);
+				userManageService.insertUser(userManageVO);
+			}
+		}
+
+		return login;
+	}
+
+
 }
base/src/main/java/egovframework/module/uss/umt/service/UserManageVO.java
--- base/src/main/java/egovframework/module/uss/umt/service/UserManageVO.java
+++ base/src/main/java/egovframework/module/uss/umt/service/UserManageVO.java
@@ -155,6 +155,14 @@
     //검색-권한
     private String searchUserSeCode;
 
+    //웨일-sid
+    private String sid;
+
+    //sns타입
+    private String snsTyCode;
+
+    //SNS결과 메세지
+    private String resultMssage;
 
     public String getCredtId() {
         return credtId;
@@ -555,4 +563,28 @@
     public void setSearchUserSeCode(String searchUserSeCode) {
         this.searchUserSeCode = searchUserSeCode;
     }
+
+    public String getSid() {
+        return sid;
+    }
+
+    public void setSid(String sid) {
+        this.sid = sid;
+    }
+
+    public String getSnsTyCode() {
+        return snsTyCode;
+    }
+
+    public void setSnsTyCode(String snsTyCode) {
+        this.snsTyCode = snsTyCode;
+    }
+
+    public String getResultMssage() {
+        return resultMssage;
+    }
+
+    public void setResultMssage(String resultMssage) {
+        this.resultMssage = resultMssage;
+    }
 }
base/src/main/java/egovframework/module/uss/umt/service/impl/UserManageMapper.java
--- base/src/main/java/egovframework/module/uss/umt/service/impl/UserManageMapper.java
+++ base/src/main/java/egovframework/module/uss/umt/service/impl/UserManageMapper.java
@@ -81,4 +81,9 @@
     //임시사용자 데이터삭제한다.
     public int deleteUserTmp(UserManageVO userManageVO) throws Exception;
 
+    //SNS정보 등록
+    public void insertSnsInfo(UserManageVO userManageVO) throws Exception;
+
+    //SNS정보 삭제
+    public void deleteSnsInfo(UserManageVO userManageVO) throws Exception;
 }
base/src/main/java/egovframework/module/uss/umt/service/impl/UserManageServiceImpl.java
--- base/src/main/java/egovframework/module/uss/umt/service/impl/UserManageServiceImpl.java
+++ base/src/main/java/egovframework/module/uss/umt/service/impl/UserManageServiceImpl.java
@@ -110,14 +110,25 @@
 		//이메일
 		if(!EgovStringUtil.isEmpty(userManageVO.getEmail1()) && !EgovStringUtil.isEmpty(userManageVO.getEmail2())) {
 			userManageVO.setEmailAdres(CryptoUtil.encrypt(userManageVO.getEmail1() + "@" + userManageVO.getEmail2(), null));
+		}else if(!EgovStringUtil.isEmpty(userManageVO.getEmailAdres())){
+			userManageVO.setEmailAdres(CryptoUtil.encrypt(userManageVO.getEmailAdres(), null));
 		}
 
 		userManageMapper.insertUser(userManageVO);
+
+		//SNS 결과 정보
+		if(!EgovStringUtil.isEmpty(userManageVO.getSnsTyCode()) && !EgovStringUtil.isEmpty(userManageVO.getResultMssage())){
+			userManageMapper.deleteSnsInfo(userManageVO);
+			userManageMapper.insertSnsInfo(userManageVO);
+		}
 	}
 
 
 	//기 등록된 사용자 중 검색조건에 맞는 사용자의 정보를 데이터베이스에서 읽어와 화면에 출력
 	public UserManageVO selectUser(UserManageVO userManageVO) throws Exception {
+		if(!EgovStringUtil.isEmpty(userManageVO.getUserId()) && "ID".equals(userManageVO.getSearchCondition())){
+			userManageVO.setUserId(CryptoUtil.encrypt(userManageVO.getUserId(), null));
+		}
 		return userManageMapper.selectUser(userManageVO);
 	}
 
@@ -229,6 +240,14 @@
 		//이메일
 		if(!EgovStringUtil.isEmpty(userManageVO.getEmail1()) && !EgovStringUtil.isEmpty(userManageVO.getEmail2())) {
 			userManageVO.setEmailAdres(CryptoUtil.encrypt(userManageVO.getEmail1() + "@" + userManageVO.getEmail2(), null));
+		}else if(!EgovStringUtil.isEmpty(userManageVO.getEmailAdres())){
+			userManageVO.setEmailAdres(CryptoUtil.encrypt(userManageVO.getEmailAdres(), null));
+		}
+
+		//SNS 결과 정보
+		if(!EgovStringUtil.isEmpty(userManageVO.getSnsTyCode()) && !EgovStringUtil.isEmpty(userManageVO.getResultMssage())){
+			userManageMapper.deleteSnsInfo(userManageVO);
+			userManageMapper.insertSnsInfo(userManageVO);
 		}
 
 		return userManageMapper.updateManageUser(userManageVO);
base/src/main/resources/egovframework/egovProps/globals.properties
--- base/src/main/resources/egovframework/egovProps/globals.properties
+++ base/src/main/resources/egovframework/egovProps/globals.properties
@@ -30,7 +30,7 @@
 
 # \uC0AC\uC6A9 \uB3C4\uBA54\uC778 (http://127.0.0.1:8080) - IBM(DB2) : 9080port
 # \uB3C4\uBA54\uC778 \uC0AC\uC6A9\uC2DC tomcat\uC5D0 Path \uBD99\uC74C cait
-Globals.Domain = http://dev.dreamerguy.com
+Globals.Domain = http://devcms.foxedu.co.kr
 
 # 2\uB2E8\uACC4 \uAC8C\uC2DC\uD310 \uCD94\uAC00 \uAE30\uB2A5 (\uB313\uAE00, \uB9CC\uC871\uB3C4\uC870\uC0AC, \uC2A4\uD06C\uB7A9)
 Globals.addedOptions = true
@@ -53,4 +53,6 @@
 #\uC5D1\uC140\uD15C\uD50C\uB9BF \uD3F4\uB354\uBA85
 Globals.ExcelTemplateDirectory= xls
 
-
+#\uC6E8\uC77C \uD0A4
+Globals.ClientId = _pYUgL8zHLleCJEUDJyF
+Globals.ClientSecret = aHnflBEJQN
(파일 끝에 줄바꿈 문자 없음)
base/src/main/resources/egovframework/mapper/mysql/uss/umt/UserManage_SQL.xml
--- base/src/main/resources/egovframework/mapper/mysql/uss/umt/UserManage_SQL.xml
+++ base/src/main/resources/egovframework/mapper/mysql/uss/umt/UserManage_SQL.xml
@@ -59,21 +59,30 @@
 
 	<select id="selectUser" parameterType="egovframework.module.uss.umt.service.UserManageVO" resultType="egovframework.module.uss.umt.service.UserManageVO" resultMap="user">
 		SELECT
-		ESNTL_ID
-		, A.USER_ID
-		, A.USER_NM
-		, A.USER_SE_CODE
-		, ST_NUMBER
-		, ST_GRADE
-		, MOBLPHON_NO
-		, EMAIL_ADRES
-		, CONFM_AT
-		, CONFM_PNTTM
-		, FRST_REGISTER_PNTTM
-		, PHOTO_STRE_FILE_NM
+			ESNTL_ID
+			, A.USER_ID
+			, A.USER_NM
+			, A.USER_SE_CODE
+			, ST_NUMBER
+			, ST_GRADE
+			, MOBLPHON_NO
+			, EMAIL_ADRES
+			, CONFM_AT
+			, CONFM_PNTTM
+			, FRST_REGISTER_PNTTM
+			, PHOTO_STRE_FILE_NM
 		FROM    comtnmber A
 		WHERE A.DELETE_AT = 'N'
-			AND A.ESNTL_ID = #{esntlId}
+		  <choose>
+			  <when test='searchCondition == "ID"'>
+				  AND A.USER_ID = #{userId}
+			  </when>
+			  <otherwise>
+				  AND A.ESNTL_ID = #{esntlId}
+			  </otherwise>
+		  </choose>
+
+
 	</select>
 
 	<insert id="insertUser">
@@ -119,7 +128,7 @@
 			, #{credtId}
 			, #{crtfctDn}
 			, #{crtfctSerial}
-			, #{siteId}
+			, IFNULL(NULLIF(#{siteId},''),'SITE_000000000000001')
 			, #{stGrade}
 			, #{stClass}
 			, #{stNumber}
@@ -375,4 +384,21 @@
 		WHERE SITE_ID=#{siteId}
 	</delete>
 
+	<insert id="insertSnsInfo">
+		INSERT INTO comtnmbersns(
+			  SNS_TY_CODE
+			, ESNTL_ID
+			, RESULT_MSSAGE
+		) VALUES (
+			#{snsTyCode}
+			, #{esntlId}
+			, #{resultMssage}
+		)
+	</insert>
+
+	<delete id="deleteSnsInfo">
+		DELETE FROM comtnmbersns
+		WHERE ESNTL_ID = #{esntlId}
+			AND SNS_TY_CODE = #{snsTyCode}
+	</delete>
 </mapper>
base/src/main/webapp/WEB-INF/jsp/egovframework/str/cre/lyt/sourc/sit/LYTSRC_0000000000001/sourcHead.jsp
--- base/src/main/webapp/WEB-INF/jsp/egovframework/str/cre/lyt/sourc/sit/LYTSRC_0000000000001/sourcHead.jsp
+++ base/src/main/webapp/WEB-INF/jsp/egovframework/str/cre/lyt/sourc/sit/LYTSRC_0000000000001/sourcHead.jsp
@@ -18,5 +18,12 @@
 			<a href="/uss/umt/cmm/EgovUserConfirmView.do?trgtPge=update">정보변경</a>
 		</c:otherwise>
 	</c:choose>
+
+ 	<a href="/api/whale/auth/whaleLoginUrl.do">웨일 로그인</a>
+
+ <c:if test="${not empty USER_INFO.id}">
+	 <br>
+	 ${USER_INFO.id}
+ </c:if>
  </body>
 </html>
Add a comment
List