-
카카오(KaKao) 자동 로그인 해보기SpringFrameWork/Spring 프로젝트 할때 참고 하면 좋은것들 2022. 10. 10. 12:25728x90
로그인을 할때 카카오를 이용하여 로그인 하는 방법을 자주 봤을겁니다.
카카오를 이용해서 로그인과 동시에 자동으로 회원가입을 시켜줘 보겠습니다.
1. Kakao Developers에 가서 회원가입을 해줍니다.
https://developers.kakao.com/product/kakaoLogin
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'SpringFrameWork > Spring 프로젝트 할때 참고 하면 좋은것들' 카테고리의 다른 글
Iamport 결제 시스템 API 사용해보기 (0) 2022.10.09 달력 만들기 (1) 2022.10.08 Spring QR코드 생성하기 (0) 2022.10.07 UUID란? 사용법까지 (0) 2022.10.06 Spring 메일 보내는 법 (0) 2022.10.05