개발정복, 로맨틱. 성공적

[open API 사용법] 네이버 로그인 api 간단한 개발 및 예제 - 개발(2) 본문

WEB/Etc

[open API 사용법] 네이버 로그인 api 간단한 개발 및 예제 - 개발(2)

차정뱅이 2022. 7. 28. 15:19
728x90
반응형
네이버 본인인증 화면

네이버 로그인 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

 

반응형