일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- MariaDB
- 개발자일상
- Thymeleaf
- 자바
- springboot오류
- 자바스크립트
- 리액트기초
- 스프링부트
- 자바오류
- JSX기본문법
- 웹개발자
- 개발
- 코딩테스트
- GitHub
- 프론트엔드개발
- 개발공부
- 일상
- 백엔드개발
- 개발자
- DB오류
- 자바개발자
- springboot
- 백준알고리즘
- 타임리프
- 프론트엔드개발자
- 백준
- 리액트
- 개발오류
- 리액트공부
- 알고리즘문제
- Today
- Total
개발정복, 로맨틱. 성공적
[open API 사용법] 네이버 로그인 api 간단한 개발 및 예제 - 개발(2) 본문
네이버 본인인증 화면
네이버 로그인 URL 생성을 먼저 해주기 위해 로그인 controller 에 추가해준다.
@RequestMapping(value = "/login.do")
public String login(ReqMap reqMap,HttpServletRequest request, ModelMap model) throws Exception{
BaseMap paramMap = reqMap.getReqMap();
model.addAttribute("snsLoginNaverURL", snsLoginNaverService.getSnsLoginNaverURL());
model.addAttribute("snsLoginKakaoURL", snsLoginKakaoService.getKakaoAuthURL());
return "/contents/login/login";
}
SnsNaverService.java 파일도 생성해서 로그인 URL 생성하는 소스를 추가해준다.
/**
* 네이버 SNS 로그인 URL 생성
* @return
* @throws Exception
*/
public String getSnsLoginNaverURL() throws Exception {
SecureRandom random = new SecureRandom();
String state = new BigInteger(130, random).toString();
StringBuffer loginApiURL = new StringBuffer("https://nid.naver.com/oauth2.0/authorize?response_type=code");
loginApiURL.append("&client_id=client_id")
.append("&redirect_uri=로그인 API 콜백 URL")
.append("&state=" + state);
return loginApiURL.toString();
}
#Client_id 값은 API 개발 준비에서 애플리케이션 등록하면 client ID 발급된 걸 입력하면 된다.
#redirect_uri 값은 애플리케이션 등록할 때 로그인 오픈 API 서비스 환경시 Callback URL 등록한 걸 입력하면 된다
네이버 로그인 API 성공지 Callback
네이버 로그인 API 성공 시 Callback 메스드를 만들어 주었다
실패를 할 경우 tokenMap에 error가 넘어오고 성공 시엔 프로필 조회 후 userMap에 담아주면 된다.
받은 데이터들을 세션에 저장하여 회원가입 시 값들 저장하게 하면 끝
(에러 처리는 개발하는 화면마다 다르니 따로 추가해야 됨)
> controller
/**
* 네이버 로그인 성공시 콜백
* @param reqMap
* @param request
* @param response
* @param model
* @return
* @throws Exception
*/
@RequestMapping(value = "CallbackSnsLoginNaverSuccess.do")
public String CallbackSnsLoginNaver(ReqMap reqMap,HttpServletRequest request, ModelMap model) throws Exception {
BaseMap paramMap = reqMap.getReqMap();
BaseMap tokenMap = snsLoginNaverService.getNaverToken(paramMap);
if(tokenMap.getEmpty("error")) { // 정상 호출
BaseMap naverUserProfileMap = snsLoginNaverService.getNaverUserProfile(tokenMap);
Object userObj = naverUserProfileMap.get("response");
HashMap<String, String> userMap = (HashMap<String, String>) userObj;
certDivision(paramMap, request, userMap);
} else { // 에러 발생
log.error(tokenMap.getStr("error") +" : " + tokenMap.getStr("error_description"));
}
return "/contents/sns/login/callbackLogin";
}
/**
* 회원가입 & 휴면회원 인증에 대한 분기처리
* @param paramMap
* @param request
* @param userMap
* @return
* @throws Exception
*/
private void certDivision(BaseMap paramMap, HttpServletRequest request, HashMap<String, String> userMap) throws Exception {
paramMap.put("id", userMap.get("id"));
paramMap.put("gender", userMap.get("gender"));
paramMap.put("name", userMap.get("name"));
paramMap.put("mobile", userMap.get("mobile"));
paramMap.put("birth", userMap.get("birthyear")+userMap.get("birthday").replace("-", ""));
BaseMap certId = memberService.selectMemberCertId(paramMap);
if(certId != null) {
//가입된 내역 있습니다.
}
SessionUtil.setSession(request, "TMP_CERT_TYPE", "NAVER");
SessionUtil.setSession(request, "TMP_ID", userMap.get("id"));
SessionUtil.setSession(request, "TMP_EMAIL", userMap.get("email"));
SessionUtil.setSession(request, "TMP_GENDER", userMap.get("gender"));
SessionUtil.setSession(request, "TMP_NAME", userMap.get("name"));
SessionUtil.setSession(request, "TMP_MOBILE", userMap.get("mobile"));
SessionUtil.setSession(request, "TMP_BIRTH_YEAR", userMap.get("birthyear"));
SessionUtil.setSession(request, "TMP_BIRTH_DAY", userMap.get("birthday").replace("-", ""));
}
> service
토큰 값 요청과 회원 프로필 API 조회하는 로직
/**
* 네이버 token 요청
* @param paramMap
* @return
* @throws Exception
*/
public BaseMap getNaverToken(BaseMap paramMap) throws Exception {
String redirect_uri = "";
StringBuffer tokenApiURL = new StringBuffer("https://nid.naver.com/oauth2.0/token?grant_type=authorization_code&");
tokenApiURL.append("client_id=Client ID")
.append("&client_secret=client Secret")
.append("&redirect_uri=네이버로그인 API 콜백 URL")
.append("&code=" + paramMap.getStr("code"))
.append("&state=" + paramMap.getStr("state"));
BaseMap tokenMap = (BaseMap) CallFormData.get(tokenApiURL.toString());
return tokenMap;
}
/**
* 네이버 회원 프로필 조회 API
* @param paramMap
* @return
* @throws Exception
*/
public BaseMap getNaverUserProfile(BaseMap paramMap) throws Exception {
String accessToken = paramMap.getStr("access_token");
String authorization = "Bearer " + accessToken; //Bearer 다음에 공백
StringBuffer userProfileApiURL = new StringBuffer("https://openapi.naver.com/v1/nid/me");
BaseMap userProfile = (BaseMap) CallFormData.get(userProfileApiURL.toString(), authorization);
return userProfile;
}
> 따로 통신하는 Class 파일을 만들어 두었다.
밑엔 공통으로 사용한 CallFormData.class 파일을 직접 만들었으니 참고하길 바란다.
/**
* GET
*
* @param url
* @return Object
* @throws Exception
*/
public static Object get(String url, String authorization) throws Exception {
return get(url, null, authorization);
}
/**
* GET
*
* @param url
* @param paramMap
* @return Object
* @throws Exception
*/
public static Object get(String url, BaseMap paramMap, String authorization) throws Exception {
String strObj = "";
if (paramMap != null) {
String[] keys = paramMap.getKeys();
for (int i = 0; i < keys.length; i++) {
String key = keys[i];
if (i == 0) {
strObj += "?" + key + "=" + paramMap.get(key);
} else {
strObj += "&" + key + "=" + paramMap.get(key);
}
}
}
url += strObj;
Object obj = callResponse(url, "GET", null, authorization);
return convertJsonToIWI(obj);
}
/**
* httpclient
*
* @param url
* @param method
* @param paramMap
* @return Object
* @throws Exception
*/
private static Object callResponse(String url, String method, BaseMap paramMap, String authorization) throws Exception {
return callFormData(url, method, paramMap, authorization);
}
/**
* OkHttp 통신
*
* @param url
* @param method
* @param param
* @return Object
* @throws Exception
*/
private static Object callFormData(String url, String method, BaseMap param, String authorization) throws Exception {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
if (StringUtil.isEmpty(url))
return null;
Object obj = null;
RequestBody body = null;
String paramToString = "";
if (param != null) {
Builder formBody = new FormBody.Builder();
for(String key : param.getKeys()) {
if(param.get(key) instanceof String[]) {
String[] paramArr = (String[]) param.get(key);
for(int i=0;i<paramArr.length;i++) {
formBody.add(key, paramArr[i]);
}
}else {
formBody.add(key, param.getStr(key));
}
}
body = formBody.build();
paramToString = body.toString();
}
ResponseBody responseBody = null;
OkHttpClient client = null;
try {
client = HttpClientManager.getInstance().getHttpClient();
Request request = new Request.Builder().url(url).method(method, body).addHeader("Authorization", authorization).build();
Response response = client.newCall(request).execute();
log.debug("[response.code()] : " + response.code());
responseBody = response.body();
if (responseBody != null) {
String jsonText = responseBody.string();
log.debug("[jsonText] : " + jsonText);
if(!StringUtil.isEmpty(jsonText)) {
if("[".equals(jsonText.substring(0, 1))) {
obj = new JSONArray(jsonText);
}else {
obj = new JSONObject(jsonText);
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
HttpClientManager.closeResponseBody(responseBody);
if (stopWatch != null && stopWatch.isStarted()) {
stopWatch.stop();
}
log.warn("{}{}{}{}{}", "\n\n########################## Api Connection ##########################", "\n##[URL] : " + url,
"\n##[METHOD] : " + method,
"\n##[BODY] : " + paramToString,
"\n##Elapsed time : " + ((stopWatch.getTime()) / 1000.0) + " second",
"\n########################## Api End Connection ##########################\n\n");
}
return obj;
}
아직까지 네이버에서 받은 데이터도 잘 넘어오고 다른 이슈는 없는 걸로 보아 개발이 잘된 거 같다고 생각 든다.
생각보단 어렵지 않아서 초보자들도 개발하는데 걱정 없이 할 거 같다.
그럼 모두 오픈 API 개발 화이팅
[open API 사용법] 네이버 로그인 api 간단한 개발 및 예제 - 준비(1)
⊙ 네이버 API 연동하기 앞서 네이버 개발자 센터에 접속하여 내 애플리케이션에 등록해야 됩니다. NAVER Developers 네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록
sssongvely.tistory.com
'WEB > Etc' 카테고리의 다른 글
[open API 사용법] 한국환경공단_전기자동차 충전소 정보 오픈 api 개발 및 예제_ 준비(1) (0) | 2023.11.07 |
---|---|
ERROR [org.apache.ibatis.executor.BaseExecutor] could not get a databaseid from datasource (0) | 2022.08.17 |
[open API 사용법] 네이버 로그인 api 간단한 개발 및 예제 - 준비(1) (0) | 2022.07.27 |
SVN CentOs 명령어, directory 생성법 (0) | 2020.11.02 |