|
|
@@ -2,8 +2,12 @@ package com.style24.front.biz.thirdparty;
|
|
|
|
|
|
import com.gagaframework.web.parameter.GagaMap;
|
|
|
import com.gagaframework.web.util.GagaFileUtil;
|
|
|
+import com.google.gson.Gson;
|
|
|
+import com.google.gson.GsonBuilder;
|
|
|
import com.google.gson.JsonObject;
|
|
|
-import com.google.gson.JsonParser;
|
|
|
+import com.google.i18n.phonenumbers.NumberParseException;
|
|
|
+import com.google.i18n.phonenumbers.PhoneNumberUtil;
|
|
|
+import com.google.i18n.phonenumbers.Phonenumber;
|
|
|
import com.style24.front.support.security.session.TsfSession;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
@@ -20,6 +24,7 @@ import org.springframework.web.client.RestTemplate;
|
|
|
|
|
|
import javax.annotation.PostConstruct;
|
|
|
import java.net.URI;
|
|
|
+import java.util.Locale;
|
|
|
|
|
|
|
|
|
/**
|
|
|
@@ -38,6 +43,8 @@ public class KaKaoLogin {
|
|
|
@Autowired
|
|
|
private RestTemplate restTemplate;
|
|
|
|
|
|
+ public static final String PROTOCOL = "http://";
|
|
|
+
|
|
|
private String callBackUrl;
|
|
|
private String restApiKey;
|
|
|
private String profiles;
|
|
|
@@ -66,17 +73,39 @@ public class KaKaoLogin {
|
|
|
log.info("\n--- Kakao initialization completed ----\n");
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 카카오 로그인 창
|
|
|
+ * @param state - 콜백 시 해당 값으로 비교 및 모바일을 redirect 값이 있음
|
|
|
+ * @return String - 호출 url정보
|
|
|
+ * @author jsshin
|
|
|
+ * @since 2021. 02. 05
|
|
|
+ */
|
|
|
public String getAuthorizeUrl(String state) {
|
|
|
- String apiUrl = authorizeUrl;
|
|
|
- String redirectUri = GagaFileUtil.getConcatenationPath("https://" + TsfSession.getHttpServletRequest().getServerName(), callBackUrl);
|
|
|
- apiUrl += "?client_id=" + restApiKey + "&redirect_uri=" + redirectUri + "&response_type=code&state=" + state;
|
|
|
- log.info("api ===> {}", apiUrl);
|
|
|
- return apiUrl;
|
|
|
+ StringBuilder apiUrlBuilder = new StringBuilder();
|
|
|
+ String redirectUri = GagaFileUtil.getConcatenationPath(PROTOCOL + TsfSession.getHttpServletRequest().getServerName(), callBackUrl);
|
|
|
+ apiUrlBuilder.append(authorizeUrl)
|
|
|
+ .append("?client_id=")
|
|
|
+ .append(restApiKey)
|
|
|
+ .append("&redirect_uri=")
|
|
|
+ .append(redirectUri)
|
|
|
+ .append("&response_type=code&state=")
|
|
|
+ .append(state);
|
|
|
+ log.info("apiUrlBuilder ===> {}", apiUrlBuilder.toString());
|
|
|
+ return apiUrlBuilder.toString();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 카카오 전달 받은 코드 값으로 토근값을 받아옴(API)
|
|
|
+ *
|
|
|
+ * @param code - 카카오에서 전달 해준 값
|
|
|
+ * @param state - 콜백 시 해당 값으로 비교 및 모바일을 redirect 값이 있음
|
|
|
+ * @return GagaMap - 통신으로 받아온 정보
|
|
|
+ * @author jsshin
|
|
|
+ * @since 2021. 02. 05
|
|
|
+ */
|
|
|
public GagaMap getAccessTocken(String code, String state) {
|
|
|
GagaMap resultMap = new GagaMap();
|
|
|
- String redirectUri = GagaFileUtil.getConcatenationPath("https://" + TsfSession.getHttpServletRequest().getServerName(), callBackUrl);
|
|
|
+ String redirectUri = GagaFileUtil.getConcatenationPath(PROTOCOL + TsfSession.getHttpServletRequest().getServerName(), callBackUrl);
|
|
|
String requestGb = "";
|
|
|
try {
|
|
|
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
|
|
|
@@ -89,7 +118,7 @@ public class KaKaoLogin {
|
|
|
// state 값에 리다이렉트 url 같이 넘겨줌
|
|
|
if (StringUtils.isNotBlank(state)) {
|
|
|
String[] stateArr = StringUtils.split(state, "!@!");
|
|
|
- requestGb = stateArr[1];
|
|
|
+ requestGb = stateArr[1];
|
|
|
}
|
|
|
|
|
|
// Header
|
|
|
@@ -106,17 +135,24 @@ public class KaKaoLogin {
|
|
|
String jsonResult = responseEntity.getBody();
|
|
|
log.info("responseEntity.getBody(): {} ", jsonResult);
|
|
|
|
|
|
- JsonObject obj = new JsonParser().parse(jsonResult).getAsJsonObject();
|
|
|
-
|
|
|
- resultMap.setString("access_token", obj.get("access_token").toString());
|
|
|
- resultMap.setString("refresh_token", obj.get("refresh_token").toString());
|
|
|
+ Gson gson = new GsonBuilder().create();
|
|
|
+ resultMap = gson.fromJson(jsonResult, GagaMap.class); //access_token, refresh_token
|
|
|
resultMap.setString("requestGb", requestGb);
|
|
|
+
|
|
|
} catch (Exception e) {
|
|
|
log.error(e.getMessage());
|
|
|
}
|
|
|
return resultMap;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 카카오 사용자 정보
|
|
|
+ *
|
|
|
+ * @param accessToken - 해당 값으로 사용자 정보를 가져옴
|
|
|
+ * @return GagaMap - 사용자 정보
|
|
|
+ * @author jsshin
|
|
|
+ * @since 2021. 02. 05
|
|
|
+ */
|
|
|
public GagaMap getKakaoUserInfo(String accessToken) {
|
|
|
GagaMap resultMap = new GagaMap();
|
|
|
try {
|
|
|
@@ -137,12 +173,34 @@ public class KaKaoLogin {
|
|
|
String jsonResult = responseEntity.getBody();
|
|
|
log.info("responseEntity.getBody(): {} ", jsonResult);
|
|
|
|
|
|
+ Gson gson = new GsonBuilder().create();
|
|
|
+
|
|
|
+ JsonObject obj = gson.fromJson(jsonResult, JsonObject.class);
|
|
|
+ GagaMap properties = gson.fromJson(obj.get("properties"), GagaMap.class);
|
|
|
+ GagaMap kakaoAccount = gson.fromJson(obj.get("kakao_account"), GagaMap.class);
|
|
|
+
|
|
|
+ Locale locale = Locale.KOREA;
|
|
|
+ String cellPhnno = getPhoneNumber(kakaoAccount.getString("phone_number"), locale.getCountry());
|
|
|
+ String birthYmd = kakaoAccount.getString("birthyear") + kakaoAccount.getString("birthday");
|
|
|
+
|
|
|
+ String sexGb = "";
|
|
|
+ if (StringUtils.isNotBlank(kakaoAccount.getString("gender"))) {
|
|
|
+ sexGb = kakaoAccount.getString("gender").equals("male") ? "M" : "F";
|
|
|
+ }
|
|
|
|
|
|
- JsonObject obj = new JsonParser().parse(jsonResult).getAsJsonObject();
|
|
|
- JsonObject properties = obj.get("properties").getAsJsonObject();
|
|
|
+ String birthSm = "";
|
|
|
+ if (StringUtils.isNotBlank(kakaoAccount.getString("birthday_type"))) {
|
|
|
+ birthSm = kakaoAccount.getString("birthday_type").equals("SOLAR") ? "S":"L";
|
|
|
+ }
|
|
|
|
|
|
- resultMap.setString("id", obj.get("id").toString());
|
|
|
- resultMap.setString("name", properties.get("nickname").toString());
|
|
|
+ resultMap.setString("snsId", obj.get("id").toString());
|
|
|
+ resultMap.setString("custNm", properties.getString("nickname"));
|
|
|
+ resultMap.setString("email", kakaoAccount.getString("email"));
|
|
|
+ resultMap.setString("ci", kakaoAccount.getString("ci"));
|
|
|
+ resultMap.setString("cellPhnno", cellPhnno);
|
|
|
+ resultMap.setString("birthYmd", birthYmd);
|
|
|
+ resultMap.setString("birthSm", birthSm);
|
|
|
+ resultMap.setString("sexGb", sexGb);
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
log.error(e.getMessage());
|
|
|
@@ -150,6 +208,14 @@ public class KaKaoLogin {
|
|
|
return resultMap;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 카카오 access_token 새로 발급
|
|
|
+ *
|
|
|
+ * @param refreshToken - 해당 값으로 사용자 정보를 가져옴
|
|
|
+ * @return GagaMap - access_token 값을 준다.
|
|
|
+ * @author jsshin
|
|
|
+ * @since 2021. 02. 05
|
|
|
+ */
|
|
|
public GagaMap getRefreshTocken(String refreshToken) {
|
|
|
GagaMap resultMap = new GagaMap();
|
|
|
try {
|
|
|
@@ -172,15 +238,22 @@ public class KaKaoLogin {
|
|
|
String jsonResult = responseEntity.getBody();
|
|
|
log.info("responseEntity.getBody(): {} ", jsonResult);
|
|
|
|
|
|
- JsonObject obj = new JsonParser().parse(jsonResult).getAsJsonObject();
|
|
|
- resultMap.setString("access_token", obj.get("access_token").toString());
|
|
|
-
|
|
|
+ Gson gson = new GsonBuilder().create();
|
|
|
+ resultMap = gson.fromJson(jsonResult, GagaMap.class); //access_token
|
|
|
} catch (Exception e) {
|
|
|
log.error(e.getMessage());
|
|
|
}
|
|
|
return resultMap;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 카카오 계정 연동해제
|
|
|
+ *
|
|
|
+ * @param accessToken - 토근값
|
|
|
+ * @return GagaMap - snsId 값이 있으면 연동해제 성공
|
|
|
+ * @author jsshin
|
|
|
+ * @since 2021. 02. 05
|
|
|
+ */
|
|
|
public GagaMap saveUnlink(String accessToken) {
|
|
|
GagaMap resultMap = new GagaMap();
|
|
|
try {
|
|
|
@@ -199,12 +272,34 @@ public class KaKaoLogin {
|
|
|
String jsonResult = responseEntity.getBody();
|
|
|
log.info("responseEntity.getBody(): {} ", jsonResult);
|
|
|
|
|
|
- JsonObject obj = new JsonParser().parse(jsonResult).getAsJsonObject();
|
|
|
- resultMap.setString("id", obj.get("id").toString());
|
|
|
+ Gson gson = new GsonBuilder().create();
|
|
|
+ JsonObject obj = gson.fromJson(jsonResult, JsonObject.class);
|
|
|
+
|
|
|
+ resultMap.setString("snsId", obj.get("id").toString());
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
log.error(e.getMessage());
|
|
|
}
|
|
|
return resultMap;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 국가번호 붙여서 넘겨온 전화번호 변호
|
|
|
+ * +82) 010 1234 5678 -> 010-1234-5678
|
|
|
+ * @param cellPhnno - 휴대전화번호
|
|
|
+ * @param country - 국가
|
|
|
+ * @return String - 010-1234-5678
|
|
|
+ * @author jsshin
|
|
|
+ * @since 2021. 02. 05
|
|
|
+ */
|
|
|
+ public String getPhoneNumber(String cellPhnno, String country) throws Exception {
|
|
|
+ String result = "";
|
|
|
+ if (StringUtils.isNotBlank(cellPhnno)) {
|
|
|
+ PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
|
|
|
+ Phonenumber.PhoneNumber numberProto = phoneUtil.parse(cellPhnno, "KR");
|
|
|
+ result = phoneUtil.format(numberProto, PhoneNumberUtil.PhoneNumberFormat.NATIONAL);
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
}
|