(스프링소셜로그인)카카오 로그인 API

 

1
2
3
4
5
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.6</version>
</dependency>
cs

CONT

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package ezen.dev.spring.controller;
 
import javax.servlet.http.HttpSession;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
 
import ezen.dev.spring.service.KaKaoService;
import ezen.dev.spring.vo.KakaoVo;
 
@Controller
public class KaKaoController {
 
    private KaKaoService kaKaoService;
    
    
    @Autowired
    public KaKaoController(KaKaoService kaKaoService) {
        this.kaKaoService = kaKaoService;
    }
    
    
    
    
    @RequestMapping(value = "/kakao")
    public String kakaoLogin(@RequestParam(value = "code", required = falseString code, HttpSession session){
        System.out.println("####### " + code);
        
        String access_Token = kaKaoService.getAccessToken(code);
        KakaoVo userInfo = kaKaoService.getuserinfo(access_Token);
        // userInfo 의 타입을 kakao vo 로 변경 및 import
        
        System.out.println("###access_Token#### : " + access_Token);
        System.out.println("###nickname#### : " + userInfo.getK_name());
        System.out.println("###email#### : " + userInfo.getK_email());
        
        
        
        // 아래 코드가 추가되는 내용
//        session.invalidate();
        // 위 코드는 session객체에 담긴 정보를 초기화 하는 코드.
        session.setAttribute("kakaoN", userInfo.get("nickname"));
        session.setAttribute("kakaoE", userInfo.get("email"));
        // 위 2개의 코드는 닉네임과 이메일을 session객체에 담는 코드
        // jsp에서 ${sessionScope.kakaoN} 이런 형식으로 사용할 수 있다.
        
        // 리턴값은 용도에 맞게 변경하세요~
        return "redirect:/home.do";
        
        
        
 
    }
    
    
    
}
 
cs

serivce

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
package ezen.dev.spring.service;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
 
import ezen.dev.spring.dao.KaKaoDao;
import ezen.dev.spring.vo.KakaoVo;
 
@Service
public class KaKaoService {
 
    
    private KaKaoDao kakaoDao;
    
    
    @Autowired
    public KaKaoService(KaKaoDao kakaoDao) {
        this.kakaoDao = kakaoDao;
    }
    
    
    public String getAccessToken (String authorize_code) {
        String access_Token = "";
        String refresh_Token = "";
        String reqURL = "https://kauth.kakao.com/oauth/token";
 
        try {
            URL url = new URL(reqURL);
 
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
 
            //    POST 요청을 위해 기본값이 false인 setDoOutput을 true로
 
            conn.setRequestMethod("POST");
            conn.setDoOutput(true);
 
            //    POST 요청에 필요로 요구하는 파라미터 스트림을 통해 전송
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
            StringBuilder sb = new StringBuilder();
            sb.append("grant_type=authorization_code");
            sb.append("&client_id=b3c90d252e0ab2e93579050eaf013549");  //본인이 발급받은 key
            sb.append("&redirect_uri=http://localhost:8080/spring/kakao.do");     // 본인이 설정해 놓은 경로
            sb.append("&code=" + authorize_code);
            bw.write(sb.toString());
            bw.flush();
 
            //    결과 코드가 200이라면 성공
            int responseCode = conn.getResponseCode();
            System.out.println("responseCode : " + responseCode+"확인");
 
            //    요청을 통해 얻은 JSON타입의 Response 메세지 읽어오기
            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+"결과");
 
            //    Gson 라이브러리에 포함된 클래스로 JSON파싱 객체 생성
            JsonParser parser = new JsonParser();
            JsonElement element = parser.parse(result);
 
            access_Token = element.getAsJsonObject().get("access_token").getAsString();
            refresh_Token = element.getAsJsonObject().get("refresh_token").getAsString();
 
            System.out.println("access_token : " + access_Token);
            System.out.println("refresh_token : " + refresh_Token);
 
            br.close();
            bw.close();
        } catch (IOException e) {
 
            e.printStackTrace();
        }
 
        return access_Token;
    }
    
    
    
    
    
    
    
    
    
    public KakaoVo getuserinfo(String access_Token) {
        
        HashMap<String, Object> userInfo = new HashMap<String, Object>();
        
        String requestURL = "https://kapi.kakao.com/v2/user/me";
        
        try {
            URL url = new URL(requestURL); //1.url 객체만들기
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //2.url 에서 url connection 만들기
            conn.setRequestMethod("GET"); // 3.URL 연결구성
            conn.setRequestProperty("Authorization""Bearer " + access_Token);
            
            //키값, 속성 적용
            int responseCode = conn.getResponseCode(); //서버에서 보낸 http 상태코드 반환
            System.out.println("responseCode :" + responseCode+ "여긴가");
            BufferedReader buffer = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            // 버퍼를 사용하여 일근ㄴ것
            String line = "";
            String result = "";
            while ((line = buffer.readLine()) != null) {
                result +=line;
            }
            //readLine()) ==> 입력 String 값으로 리턴값 고정 
            
            System.out.println("response body :" +result);
            
            // 읽엇으니깐 데이터꺼내오기
          JsonParser parser = new JsonParser();
          JsonElement element = parser.parse(result); //Json element 문자열변경
          JsonObject properties = element.getAsJsonObject().get("properties").getAsJsonObject();
          JsonObject kakao_account = element.getAsJsonObject().get("kakao_account").getAsJsonObject();
          
          String nickname = properties.getAsJsonObject().get("nickname").getAsString();
          String email = kakao_account.getAsJsonObject().get("email").getAsString();
            userInfo.put("nickname", nickname);
            userInfo.put("email", email);
                    
            
        } catch (Exception e) {
           e.printStackTrace();
        }
        
        KakaoVo result = kakaoDao.findkakao(userInfo); 
        // 저장되어있는지 확인
        System.out.println("S :" + result);
        
        if(result ==null) {
            //result null 이면 정보가 저장 안되어있는거라서 저보를 저장.
            kakaoDao.kakaoinsert(userInfo);
            //저장하기위해 repository 로 이동
            return kakaoDao.findkakao(userInfo);
            // 정보 저장후 컨트롤러에 정보를 보냄
            //result 를 리턴으로 보내면 null 이 리턴되므로 위코드를 사용.
        }else {
            return result;
            //정보가 있으므로 result 를 리턴함
        }
        
    }
    
 
    
}
 
cs

dao

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
32
33
34
35
36
37
38
39
40
41
42
43
package ezen.dev.spring.dao;
 
import java.util.HashMap;
 
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
 
import ezen.dev.spring.vo.KakaoVo;
 
@Repository
public class KaKaoDao {
 
    
    private SqlSession sqlSession;
    
    public static final String MAPPER = "ezen.dev.spring.kakao";
    
    @Autowired
    public KaKaoDao(SqlSession sqlSession) {
        this.sqlSession = sqlSession;
    }
    
    // 정보 저장
    public void kakaoinsert(HashMap<String, Object> userInfo) {
        sqlSession.insert(MAPPER+".insert",userInfo);
    }
 
    // 정보 확인
    public KakaoVo findkakao(HashMap<String, Object> userInfo) {
        System.out.println("RN:"+userInfo.get("nickname"));
        System.out.println("RE:"+userInfo.get("email"));
    
        
        return sqlSession.selectOne(MAPPER+".kakao", userInfo);
    }
    
    
    
    
    
}
 
cs

mapper

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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace = "ezen.dev.spring.kakao">
 
    
<select id="kakao" parameterType="java.util.HashMap" resultType="kdto">
 
select * from kakao_table where k_name=#{nickname} and k_email=#{email}
 
</select>
 
 
<insert id="insert" parameterType="java.util.HashMap">
 
insert into kakao_table(k_name,k_email)
   values(#{nickname},#{email})
 
</insert>
 
 
 
 
</mapper>
cs

batis

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
 
<configuration>
 
    <typeAliases>
        <typeAlias alias="memberVo" type="ezen.dev.spring.vo.MemberVo"/>
        <typeAlias alias="kdto" type="ezen.dev.spring.vo.KakaoVo"/>
    </typeAliases>  
 
</configuration>  
 
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- 카카오 -->
                    
<class="p-2" href="https://kauth.kakao.com/oauth/authorize?client_id=b3c90d252e0ab2e93579050eaf013549&redirect_uri=http://localhost:8080/spring/kakao.do&response_type=code">
        <img src="/resources/icon/kakao_login_large_narrow.png" style="height:60px">
                    </a>
                </div>
 
<!-- <script type='text/javascript'>
                //<![CDATA[
                // 사용할 앱의 JavaScript 키를 설정해 주세요.
                Kakao.init('cdb7bfd91e47297c1c21c434264eab2f');
                // 카카오 로그인 버튼을 생성합니다.
                Kakao.Auth.createLoginButton({
            container: '#kakao-login-btn',
            success: function (authObj) {
                alert(JSON.stringify(authObj));
            },
            fail: function (err) {
                alert(JSON.stringify(err));
            }
        });
      //]]>
    </script> -->
cs