vue.js 에서 axios를 이용하여 백단에게 데이터를 넘겨주었다면
백엔드에서는 해당 값들을 이용하여 카카오톡 서버와 통신하여 값을 주고받는 일을 한다.
[컨트롤러]
package com.example.demo.kakaologin;
import java.util.HashMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.kakao.KakaoController;
import com.example.demo.member.MemberService;
@RestController
@CrossOrigin(origins = "*")
public class LoginController {
@Autowired
private MemberService memberservice;
@Autowired
private LoginService loginService;
@Autowired
private KakaoController KakaoController;
// 코드를 빼와서 access token 을 얻어다 줄 것임
@GetMapping("/kakaologin/{code}")
public HashMap<String, String> kakaoLogin(@PathVariable("code") String code) {
System.out.println(code);
// 토큰을 요청하여 얻음
String kakaoToken = loginService.requestToken(code);
System.out.println("카카오토큰" + kakaoToken);
// 사용자 정보를 요청하여 얻음
HashMap<String, String> userInfo = loginService.requestUser(kakaoToken);
System.out.println("userInfo : " + userInfo);
// 토큰을 아이디와 함께 저장
//혹시 같은 아이디가 있다면 토큰 정보만 업데이트 할 것
return userInfo;
}
}
[서비스]
package com.example.demo.kakaologin;
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.Component;
import com.example.demo.member.MemberDto;
import com.example.demo.member.MemberService;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
public class LoginService {
@Autowired
private MemberService memberservice;
// 인증코드로 token요청하기
public String requestToken(String code) {
String access_Token = "";
String refresh_Token = "";
String strUrl = "https://kauth.kakao.com/oauth/token"; // 토큰 요청 보낼 주소
KakaoToken kakaoToken = new KakaoToken(); // 요청받을 객체
try {
URL url = new URL(strUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // url Http 연결 생성
// POST 요청
conn.setRequestMethod("POST");
conn.setDoOutput(true);// outputStreamm으로 post 데이터를 넘김
// 파라미터 세팅
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
StringBuilder sb = new StringBuilder();
// 0번 파라미터 grant_type 입니다 authorization_code로 고정
sb.append("grant_type=authorization_code");
// 1번 파라미터 client_id입니다.
sb.append("&client_id=각자의restapi코드");
// 2번 파라미터 redirect_uri입니다.
sb.append("&redirect_uri=http://localhost:8182/kakaojoin");
// 3번 파라미터 code
sb.append("&code=" + code);
sb.append("&client_secret=ffySwI0e3mED14F05NWZIOH2r0xy9YWH");
bw.write(sb.toString());
bw.flush();// 실제 요청을 보내는 부분
// 실제 요청을 보내는 부분, 결과 코드가 200이라면 성공
int responseCode = conn.getResponseCode();
log.info("responsecode(200이면성공): {}", responseCode);
// 요청을 통해 얻은 JSON타입의 Response 메세지 읽어오기
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
String result = "";
while ((line = br.readLine()) != null) {
result += line;
}
log.info("response body: {}", result);
// Jackson으로 json 파싱할 것임
ObjectMapper mapper = new ObjectMapper();
// kakaoToken에 result를 KakaoToken.class 형식으로 변환하여 저장
kakaoToken = mapper.readValue(result, KakaoToken.class);
System.out.println(kakaoToken);
// api호출용 access token
access_Token = kakaoToken.getAccess_token();
// access 토큰 만료되면 refresh token사용(유효기간 더 김)
refresh_Token = kakaoToken.getRefresh_token();
log.info(access_Token);
log.info(refresh_Token);
br.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
log.info("카카오토큰생성완료>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
return access_Token;
}
// 유저 정보 얻기
public HashMap<String, String> requestUser(String accessToken) {
String email = "";
log.info("유저정보 요청 시작");
String strUrl = "https://kapi.kakao.com/v2/user/me"; // request를 보낼 주소
HashMap userInfo = new HashMap<>();
userInfo.put("accessToken", accessToken);
try {
URL url = new URL(strUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // url Http 연결 생성
// POST 요청
conn.setRequestMethod("POST");
conn.setDoOutput(true);// outputStreamm으로 post 데이터를 넘김
// 전송할 header 작성, 인자로 받은 access_token전송
conn.setRequestProperty("Authorization", "Bearer " + accessToken);
// 실제 요청을 보내는 부분, 결과 코드가 200이라면 성공
int responseCode = conn.getResponseCode();
log.info("requestUser의 responsecode(200이면성공): {}", responseCode);
// 요청을 통해 얻은 JSON타입의 Response 메세지 읽어오기
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
String result = "";
while ((line = br.readLine()) != null) {
result += line;
}
br.close();
log.info("response body: {}", result);
// Jackson으로 json 파싱할 것임
ObjectMapper mapper = new ObjectMapper();
// 결과 json을 HashMap 형태로 변환하여 resultMap에 담음
HashMap<String, Object> resultMap = mapper.readValue(result, HashMap.class);
String id = String.valueOf((Long) resultMap.get("id"));
System.out.println(id);
userInfo.put("id", id);
// json 파싱하여 id 가져오기
// 결과json 안에 properties key는 json Object를 value로 가짐
HashMap<String, Object> properties = (HashMap<String, Object>) resultMap.get("properties");
String nickname = (String) properties.get("nickname");
userInfo.put("nickname", nickname);
// 결과json 안에 kakao_account key는 json Object를 value로 가짐
HashMap<String, Object> kakao_account = (HashMap<String, Object>) resultMap.get("kakao_account");
email = (String) kakao_account.get("email");
MemberDto dto = memberservice.getMember(email);
// 카카오톡으로 로그인 하려고하는데 네이버로 이미 가입 된 이메일이 있다면
// 혹은 이미 카카오로 회원가입을 진행 했다면?
if (dto != null && dto.getId() == '2') { // 멤버에 있는지 찾아서 있다면
email = null; // 얻은 정보는 null을 만들고
userInfo.put("message", "동일 아이디로 회원가입 된 네이버 계정이 있습니다.");
} else {
// 없다면 정보에 담아
userInfo.put("email", email);
}
log.info("resultMap= {}", resultMap);
log.info("properties= {}", properties);
} catch (IOException e) {
e.printStackTrace();
}
return userInfo;
}
}
[데이터]
package com.example.demo.kakaologin;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class KakaoToken {
private String token_type;
private String access_token;
private Integer expires_in;
private String refresh_token;
private Integer refresh_token_expires_in;
private String scope;
}
'프로젝트 > Plan + tiful (플랜티플)' 카테고리의 다른 글
[Rest Api] 아임포트를 이용한 KG이니시스 결제 구현하기 (feat. vue.js) - (1) (0) | 2023.07.15 |
---|---|
vue.js 애니메이션 적용된 네비게이션 바 만들기 (0) | 2023.07.12 |
[Rest Api] 카카오톡 로그인 api 구현 (6) - vue.js 최종 코드 (0) | 2023.07.09 |
[Rest Api] vue와 Spring boot를 이용한 카카오톡 로그인 api 구현 (5) - 가져온 사용자 정보를 DB에 저장하기 (0) | 2023.07.07 |
[Rest Api] vue와 Spring boot를 이용한 카카오톡 로그인 api 구현 (4) - 응답 받은 토큰 값으로 사용자 정보 가져오기 (0) | 2023.07.05 |