네이버 로그인 (네아로) JAVA-API 적용하기

가이드문구

네이버 로그인 (네아로) JAVA-API

네이버아이디로 로그인 코딩 전, 네이버 개발자센터 https://developers.naver.com/main/ 가입후 오픈 API 이용 신청을 해야합니다.



API 신청 후 애플리케이션을 등록해 주세요.

애플리케이션 이름, 사용할 사용자 정보 등을 체크해 주세요.


애플리케이션을 등록하면 ClientID와 Client Secret을 발급받을 수 있습니다.



API 정보에서는 callback URL을 설정해주어야 합니다.




자세한 API 설명은 아래 URL을 확인하시면 됩니다.

https://developers.naver.com/


소스코딩 후에는 검수 요청을 해야 하니 진행되는 과정을 캡쳐 해두셔서 검수 때 이미지로 활용 하시면 되요!

소스코드는 아래 공유 합니다.


1. NaverLoginUtil.java

- 인증 토큰을 생성

  1. public class NaverLoginUtil {
  2. /* 인증 요청문을 구성하는 파라미터 */
  3. //client_id: 애플리케이션 등록 후 발급받은 클라이언트 아이디
  4. //response_type: 인증 과정에 대한 구분값. code로 값이 고정돼 있습니다.
  5. //redirect_uri: 네이버 로그인 인증의 결과를 전달받을 콜백 URL(URL 인코딩). 애플리케이션을 등록할 때 Callback URL에 설정한 정보입니다.
  6. //state: 애플리케이션이 생성한 상태 토큰
  7. private final static String CLIENT_ID = "제공받은 CLIENT_ID";
  8. private final static String CLIENT_SECRET = "제공받은 CLIENT_SECRET";
  9. private final static String REDIRECT_URI = "https://도메인/naverLoginCallback";
  10. private final static String SESSION_STATE = "oauth_state";
  11. /* 프로필 조회 API URL */
  12. private final static String PROFILE_API_URL = "https://openapi.naver.com/v1/nid/me";
  13. /* 네이버 아이디로 인증 URL 생성 Method */
  14. public String getAuthorizationUrl(HttpSession session) {
  15. /* 세션 유효성 검증을 위하여 난수를 생성 */
  16. String state = generateRandomString();
  17. /* 생성한 난수 값을 session에 저장 */
  18. setSession(session,state);
  19. /* Scribe에서 제공하는 인증 URL 생성 기능을 이용하여 네아로 인증 URL 생성 */
  20. OAuth20Service oauthService = new ServiceBuilder()
  21. .apiKey(CLIENT_ID)
  22. .apiSecret(CLIENT_SECRET)
  23. .callback(REDIRECT_URI)
  24. .state(state) //앞서 생성한 난수값을 인증 URL생성시 사용함
  25. .build(NaverLoginApi.instance());
  26. return oauthService.getAuthorizationUrl();
  27. }
  28. /* 네이버아이디로 Callback 처리 및 AccessToken 획득 Method */
  29. public OAuth2AccessToken getAccessToken(HttpSession session, String code, String state) throws IOException{
  30. /* Callback으로 전달받은 세선검증용 난수값과 세션에 저장되어있는 값이 일치하는지 확인 */
  31. String sessionState = getSession(session);
  32. if(StringUtils.pathEquals(sessionState, state)){
  33. OAuth20Service oauthService = new ServiceBuilder()
  34. .apiKey(CLIENT_ID)
  35. .apiSecret(CLIENT_SECRET)
  36. .callback(REDIRECT_URI)
  37. .state(state)
  38. .build(NaverLoginApi.instance());
  39. /* Scribe에서 제공하는 AccessToken 획득 기능으로 네아로 Access Token을 획득 */
  40. OAuth2AccessToken accessToken = oauthService.getAccessToken(code);
  41. return accessToken;
  42. }
  43. return null;
  44. }
  45. /* 세션 유효성 검증을 위한 난수 생성기 */
  46. private String generateRandomString() {
  47. return UUID.randomUUID().toString();
  48. }
  49. /* http session에 데이터 저장 */
  50. private void setSession(HttpSession session,String state){
  51. session.setAttribute(SESSION_STATE, state);
  52. }
  53. /* http session에서 데이터 가져오기 */
  54. private String getSession(HttpSession session){
  55. return (String) session.getAttribute(SESSION_STATE);
  56. }
  57. /* Access Token을 이용하여 네이버 사용자 프로필 API를 호출 */
  58. public String getUserProfile(OAuth2AccessToken oauthToken) throws IOException{
  59. OAuth20Service oauthService =new ServiceBuilder()
  60. .apiKey(CLIENT_ID)
  61. .apiSecret(CLIENT_SECRET)
  62. .callback(REDIRECT_URI).build(NaverLoginApi.instance());
  63. OAuthRequest request = new OAuthRequest(Verb.GET, PROFILE_API_URL, oauthService);
  64. oauthService.signRequest(oauthToken, request);
  65. Response response = request.send();
  66. return response.getBody();
  67. }
  68. }


2. LoginCallback.java

- 인증받은 토큰으로 사용자 정보를 받아와서 로그인 처리~

  1. //네이버 로그인 성공시 callback호출 메소드
  2. @RequestMapping("naverLoginCallback")
  3. public void naverLoginCallback(HttpServletRequest request, HttpServletResponse response, @RequestParam String code, @RequestParam String state, HttpSession session) throws Exception {
  4. System.out.println("여기는 callback");
  5. // response를 위한 정의
  6. PrintWriter writer = response.getWriter();
  7. int cnt = 0;
  8. OAuth2AccessToken oauthToken;
  9. oauthToken = naverLoginUtil.getAccessToken(session, code, state);
  10. //1. 로그인 사용자 정보를 읽어온다.
  11. String apiResult = naverLoginUtil.getUserProfile(oauthToken); //String형식의 json데이터
  12. /** apiResult json 구조
  13. {"resultcode":"00",
  14. "message":"success",
  15. "response":{"id":"33666449","nickname":"shinn****","age":"20-29","gender":"M","email":"sh@naver.com","name":"\uc2e0\ubc94\ud638"}}
  16. **/
  17. //2. String형식인 apiResult를 json형태로 바꿈
  18. JSONParser parser = new JSONParser();
  19. Object obj = parser.parse(apiResult);
  20. org.json.simple.JSONObject jsonObj = (org.json.simple.JSONObject) obj;
  21. //3. 데이터 파싱
  22. //Top레벨 단계 _response 파싱
  23. org.json.simple.JSONObject response_obj = (org.json.simple.JSONObject)jsonObj.get("response");
  24. // 네이버에서 주는 고유 ID
  25. String naverIfId = (String) response_obj.get("id");
  26. // 네이버에서 설정된 사용자 이름
  27. String naverName = (String) response_obj.get("name");
  28. // 네이버에서 설정된 사용자 별명
  29. String naverNickname = (String) response_obj.get("nickname");
  30. // 네이버에서 설정된 이메일
  31. String naverEmail = (String) response_obj.get("email");
  32. // 네이버에서 설정된 사용자 프로필 사진
  33. String naverProfileImage = (String) response_obj.get("profile_image");
  34. // 랜덤숫자 자리수 초기화(2자리)
  35. DecimalFormat decimal2Format = new DecimalFormat("00");
  36. // 랜덤숫자 자리수 초기화(3자리)
  37. DecimalFormat decimal3Format = new DecimalFormat("000");
  38. // 랜덤숫자 자리수 초기화(4자리)
  39. DecimalFormat decimal4Format = new DecimalFormat("0000");
  40. // 회원정보 세팅
  41. AivSignUpVO aivSignUpVO = new AivSignUpVO();
  42. aivSignUpVO.getAivSignUpBean().setUserName(naverName);
  43. aivSignUpVO.getAivSignUpBean().setUserEmail(naverEmail);
  44. aivSignUpVO.getAivSignUpBean().setUserProfileUrl(naverProfileImage);
  45. aivSignUpVO.getAivSignUpBean().setUserIfInfo("NAVER");
  46. aivSignUpVO.getAivSignUpBean().setUserIfId(naverIfId);
  47. boolean emailExists = false;
  48. // 네이버에서 주는 고유 ID의 중복여부 체크(AIV_EMPLOYEE 테이블의 USER_IF_ID의 중복체크)
  49. int existsUserIfIdCnt = aivSignUpService.selectExistsUserIfId(aivSignUpVO);
  50. // 중복되는 ID가 없을 경우 신규가입으로 아래 구문을 실행
  51. if(existsUserIfIdCnt == 0) {
  52. int existEmailCnt = aivSignUpService.selectExistsUserEmail(aivSignUpVO);
  53. if(existEmailCnt > 0) {
  54. emailExists = true;
  55. } else {
  56. // 네이버에서 주는 고유 ID 세팅
  57. aivSignUpVO.getAivSignUpBean().setUserId(naverIfId);
  58. // USER_ID의 중복된 값이 있을 경우 반복문을 통하여 랜덤수를 뒤에 부여한 뒤 USER_ID를 새로 세팅해 줌
  59. for(int i = 0; i < 10; i++) {
  60. if(i > 0) {
  61. // USER_ID가 중복된 경우 랜덤수 두 자리를 뒤에 부여해줌
  62. naverIfId = naverIfId + "_" + decimal2Format.format(Math.random() * 99);
  63. aivSignUpVO.getAivSignUpBean().setUserId(naverIfId);
  64. }
  65. // USER_ID 중복 여부 체크
  66. int existsUserIdCnt = aivSignUpService.selectExistsUserId(aivSignUpVO);
  67. // USER_ID 중복이 안 될 경우 USER_NICK_NAME의 중복을 체크하기 위하여 아래 구문을 실행
  68. if(existsUserIdCnt == 0) {
  69. // 사용 불가능한 USER_NICK_NAME 체크
  70. boolean nickChk = StringUtil.checkNickName(naverNickname);
  71. // USER_NICK_NAME이 사용 불가능한 단어가 포함되어 있으면 닉네임_1234(랜덤숫자 4자리를 뒤에 붙임)으로 세팅시켜 줌
  72. if(!nickChk) {
  73. naverNickname = "닉네임_" + decimal4Format.format(Math.random() * 9999);
  74. }
  75. aivSignUpVO.getAivSignUpBean().setUserNickName(naverNickname);
  76. // USER_NICK_NAME의 중복된 값이 있을 경우 반복문을 통하여 랜덤수를 뒤에 부여한 뒤 USER_NICK_NAME을 새로 세팅해 줌
  77. for(int j = 0; j < 10; j++) {
  78. if(j > 0) {
  79. // USER_NICK_NAME이 중복된 경우 랜덤수 두 자리를 뒤에 부여해줌
  80. aivSignUpVO.getAivSignUpBean().setUserNickName(naverNickname + "_" + decimal3Format.format(Math.random() * 999));
  81. }
  82. // USER_NICK_NAME 중복 여부 체크
  83. int existsUserNickNameCnt = aivSignUpService.selectExistsUserNickName(aivSignUpVO);
  84. // USER_NICK_NAME 중복이 안 될 경우 회원정보 저장(회원가입 처리)
  85. if(existsUserNickNameCnt == 0) {
  86. // 기본 데이터 입력(EMP_ID 새로 생성처리)
  87. aivSignUpVO.getAivSignUpBean().setEmpId(aivSignUpVO.getAivSignUpBean().ID_PREFIX + StringUtil.generateKey());
  88. // 회원데이터 저장
  89. cnt = aivSignUpService.insertIFSignUpSave(aivSignUpVO);
  90. break;
  91. }
  92. }
  93. break;
  94. }
  95. }
  96. }
  97. }
  98. if(!emailExists) {
  99. // 로그인처리 로직 시작
  100. }
  101. }


작성자 소개
초이 프로필
WrapUp 블로거

초이

반려견을 좋아하고, 차를 좋아하고, 여행을 좋아하고, 맛집을 찾아 즐기는 웹 개발자 입니다^^