ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 카카오(KaKao) 자동 로그인 해보기
    SpringFrameWork/Spring 프로젝트 할때 참고 하면 좋은것들 2022. 10. 10. 12:25
    728x90

    로그인을 할때 카카오를 이용하여 로그인 하는 방법을 자주 봤을겁니다.

    카카오를 이용해서 로그인과 동시에 자동으로 회원가입을 시켜줘 보겠습니다.

     


    1. Kakao Developers에 가서 회원가입을 해줍니다.

     https://developers.kakao.com/product/kakaoLogin

     

    Kakao Developers

    카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

    developers.kakao.com

     


    2. 내 애플리케이션에 가서 애플리케이션 추가하기를 눌러주고 모두 작성 한다음 사용을 눌러줍니다.

     


    3. 왼쪽 탭에서 카카오 로그인을 누른다음 활성화를 해줍니다.

     

     


    4.  선택 사항인데 일반에서 원하는 이름과 사진을 넣을 수 있습니다.

     


    5. 동의 항목에서 원하는 데이터를 동의 해줍니다.

     


    6. 앱 키를 복사 해줍니다.

     


    7. 프로그램 작업을 해줍니다.

    JSP

    <a href="https://kauth.kakao.com/oauth/authorize?client_id=6bf3370a67e187c32e93dae4fe379313&redirect_uri=http://localhost:9090/javagreenS/kakao/kakaoMain&response_type=code">
      <img src="${ctp}/images/kakao_login_narrow.png" class="text-center" style="height:30px;"/>
    </a>

    https://kauth.kakao.com/oauth/authorize?client_id=6bf3370a67e187c32e93dae4fe379313

    client_id=ooo 이 부분에 복사를 했던 키 값을 넣어줍니다.

    &redirect_uri=http://localhost:9090/javagreenS/kakao/kakaoMain&response_type=code" 

    redirect_uri=ooo 이 부분에는 로그인 후 이동할 곳을 넣어줍니다.

     

    Controller

    @Controller
    @RequestMapping("/kakao")
    public class KakaoController {
      
      @Autowired
      KakaoService kakaoService;
      
      @RequestMapping(value = "/kakaoLogin", method = RequestMethod.GET)
      public String kakaoLoginGet() {
        return "member/memLogin";
      }
      
      @ResponseBody
      @RequestMapping(value = "/kakaoMain", method = RequestMethod.GET)
      public ModelAndView kakaoMainGet(@RequestParam("code") String code, HttpSession session) {
        ModelAndView mav = new ModelAndView();
        
        // 1. 인증코드 요청하여 전달받기
        String accessToken = kakaoService.getAccessToken(code);
        
        // 2. 인증코드로 토큰 전달하기
        HashMap<String, Object> userInfor = kakaoService.getUserInfor(accessToken);
        
        System.out.println("login infor : " + userInfor.toString());
        
        if(userInfor.get("email") != null) {
          session.setAttribute("sEmail", userInfor.get("email"));
        }
        else {		// 이메일이 null이라면 임의의 이메일을 등록시켜주었다. 
          session.setAttribute("sEmail", "abcd@naver.com");
        }
        session.setAttribute("sNickName", userInfor.get("nickname"));
        session.setAttribute("accessToken", accessToken);
        mav.setViewName("/member/kakaoMain");
        return mav;
      }
      
      @RequestMapping(value = "/kakaoLogout", method = RequestMethod.GET)
      public ModelAndView kakaoLogoutGet(HttpSession session) {
        ModelAndView mav = new ModelAndView();
        
        kakaoService.kakaoLogout((String) session.getAttribute("accessToken"));
        session.removeAttribute("accessToken");
        mav.setViewName("/home");
        
        return mav;
      }
    }

     

    Service

    public interface KakaoService {
      public String getAccessToken(String code);
      public HashMap<String, Object> getUserInfor(String accessToken);
      public void kakaoLogout(String accessToken);
    }

     

    ServiceImpl

    @Service
    public class KakaoServiceImpl implements KakaoService {
    	
    	
    	@SuppressWarnings("unused")
    	@Override
      public String getAccessToken(String code) {
        String accessToken = "";
        String refreshToken = "";
        String reqURL = "https://kauth.kakao.com/oauth/token";
        
        try {
          URL url = new URL(reqURL);
          HttpURLConnection conn = (HttpURLConnection) url.openConnection();
          conn.setRequestMethod("POST");
          conn.setDoOutput(true);
          
          BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
          StringBuilder sb = new StringBuilder();
          sb.append("grant_type=authorization_code");
          sb.append("&client_id=6bf3370a67e187c32e93dae4fe379313");
          sb.append("&redirect_uri=http://localhost:9090/javagreenS/kakao/kakaoMain");
          sb.append("&code="+code);
          
          bw.write(sb.toString());
          bw.flush();
          
          int responseCode = conn.getResponseCode();
          System.out.println("response code = " + responseCode);
          
          BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
          
          String line = "";
          String result = "";
          while((line = br.readLine()) != null) {
            result += line;
          }
          System.out.println("response body : " + result);
          
          JsonParser parser = new JsonParser();
          JsonElement element = parser.parse(result);
          
          accessToken = element.getAsJsonObject().get("access_token").getAsString();
          refreshToken = element.getAsJsonObject().get("refresh_token").getAsString();
          
          br.close();
          bw.close();
        } catch (Exception e) {
          e.printStackTrace();
        }
        return accessToken;
      }
    
    
      @Override
      public HashMap<String, Object> getUserInfor(String accessToken) {
        HashMap<String, Object> userInfor = new HashMap<String, Object>();
        String reqUrl = "https://kapi.kakao.com/v2/user/me";
        try {
          URL url = new URL(reqUrl);
          HttpURLConnection conn = (HttpURLConnection) url.openConnection();
          conn.setRequestMethod("POST");
          conn.setRequestProperty("Authorization",  "Bearer " + accessToken);
          int responseCode = conn.getResponseCode();
          System.out.println("responseCode : " + responseCode);
          
          BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
          
          String line = "";
          String result = "";
          
          while((line = br.readLine()) != null) {
            result += line;
          }
          System.out.println("response body : " + result);
          
          JsonParser parser = new JsonParser();
          JsonElement element = parser.parse(result);
          
          JsonObject properties= element.getAsJsonObject().get("properties").getAsJsonObject();
          JsonObject kakaoAccount = element.getAsJsonObject().get("kakao_account").getAsJsonObject();
          
          String nickname = properties.getAsJsonObject().get("nickname").getAsString();
          String email = kakaoAccount.getAsJsonObject().get("email").getAsString();
          
          userInfor.put("nickname", nickname);
          userInfor.put("email", email);
        } catch (Exception e) {
          e.printStackTrace();
        }
        return userInfor;
      }
    
    
      @Override
      public void kakaoLogout(String accessToken) {
        String reqURL = "https://kapi.kakao.com/v1/user/logout";
        try {
          URL url = new URL(reqURL);
          HttpURLConnection conn = (HttpURLConnection) url.openConnection();
          conn.setRequestMethod("POST");
          conn.setRequestProperty("Authorization", "Bearer " + accessToken);
          int responseCode = conn.getResponseCode();
          System.out.println("responseCode = " + responseCode);
          
          BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
          
          String result = "";
          String line = "";
          
          while((line = br.readLine()) != null) {
            result += line;
          }
          System.out.println(result);;
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }

    KaKaoMain.JSP

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
      <c:set var="ctp" value="${pageContext.request.contextPath}"/>
      <title>kakaoMain.jsp</title>
      <jsp:include page="/WEB-INF/views/include/bs4.jsp"/>
      <script>
        location.href = "${ctp}/member/memKakaoLogin?nickName=${nickName}&mid=${email}";
      </script>
    </head>
    <body>
    <p><br/></p>
    <div class="container">
      <h2>이곳은 kakaoMain.jsp 입니다.</h2>
      <hr/>
      <p>
        닉네임 : ${nickname}<br/>메일주소 : ${email}<br/>
      </p>
      <hr/>
      <p>
        <a href="${ctp}/kakao/kakaoLogout" class="btn btn-danger">Logout</a>
      </p>
    </div>
    <p><br/></p>
    </body>
    </html>

    처리를 해준 후 location.href = "${ctp}/member/memKakaoLogin?nickName=${nickName}&mid=${email}"

    을 통해 자동 회원가입을 해줄 수 있게 해준다.

     

    	// 로그인 인증처리2(카카오로그인 인증처리)
    	// 카카오에서 인증처리가 되었다면 이곳은 그대로 로그인처리 시켜준다.
    	// 만약 이곳에 가입되어 있지 않다면, 카카오에서 넘어온 정보(여기선, 닉네임과 이메일)로 자동 회원가입시켜준다.
    	@RequestMapping(value = "/memKakaoLogin", method = RequestMethod.GET)
    	public String memKakaoLoginGet(
    			Model model,
    			HttpSession session) {
    		String email = (String) session.getAttribute("sEmail");
    		MemberVO vo = memberService.getMemEmailCheck(email);
    		if(vo != null && vo.getUserDel().equals("NO")) {
    			// 회원 인증처리된경우에 수행할 내용들을 기술한다.(session에 저장할자료 처리, 쿠키값처리...)
    			String strLevel = "";
    			if(vo.getLevel() == 0) strLevel = "관리자";
    			else if(vo.getLevel() == 1) strLevel = "운영자";
    			else if(vo.getLevel() == 2) strLevel = "우수회원";
    			else if(vo.getLevel() == 3) strLevel = "정회원";
    			else if(vo.getLevel() == 4) strLevel = "준회원";
    			
    			session.setAttribute("sMid", vo.getMid());
    			session.setAttribute("sNickName", vo.getNickName());
    			session.setAttribute("sLevel", vo.getLevel());
    			session.setAttribute("sStrLevel", strLevel);
    			
    			model.addAttribute("mid", vo.getMid());
    			return "redirect:/msg/memLoginOk";
    		}
    		else if(vo != null && !vo.getUserDel().equals("NO")) {  // 탈퇴한 회원이라면 로그인 취소처리함.
    			return "redirect:/msg/memLoginNo";
    		}
    		else {	// 회원 가입되어 있지 않은 회원이라면 자동회원가입처리(닉네임과 이메일만으로 가입처리)한다. 아이디는 이메일앞쪽을 지정해준다.
    			String mid = email.substring(0,email.indexOf("@"));
    			String nickName = (String) session.getAttribute("sNickName");
    			// 비밀번호 암호화 처리
    			String pwd = (passwordEncoder.encode("0000"));
    			
    			// 자동 회원 가입시켜준다.
    			memberService.setKakaoMemberInputOk(mid,pwd,nickName,email);
    			
    			// 다시 로그인 인증으로 보낸다. - 바로 로그인처리로 보내도 되는데, 현재는 '아이디/비밀번호'등록후 입력과 같이 처리하기 위함이다.
    			model.addAttribute("email", email);
    			return "redirect:/member/memKakaoLogin";
    		}
    	}

     


    8. 플랫폼에서 Web등록을 눌러준다음 자신의 사이트를 붙혀줍니다. 

    도메인이 없다면 local을 넣어주세요. 

     

     


    9.URI에 로그인 할 경로를 넣어줍니다.

     

     


    10. 사이트를 띄운 후 카카오 로그인을 눌러주면 이렇게 나옵니다.

     

    로그인 성공~

     

    728x90

    댓글

Designed by Tistory.