프로젝트)카카오 로그인
카카오 로그인
해당 기능을 하용하기 위해서
https://developers.kakao.com/
해당 링크로 들어가서 설정을 해줘야한다.

해당 사이트를 들어가면 사진처럼 어플리케이션 등록을 클릭한다.

이후 자기가 원하는 이름과 사업자명을 작성을한다
필자는 idesign과 사업자명은 프로젝트를 만든 팀원 이름인 “한민욱컴퍼니”로 지었다.

만든 어플리케이션에 들어간후 왼쪽 네비바의 앱키로 이동후 폰인의 REST API키를 확인하고 혹시모르니 메모 같은곳에 저장 해두자

이후 좌측 네비바 앱키 아래에 플랫폼으로 들어가
web부분에서 플랫폼 설정을 해주자
필자는 로컬로 사용할거기 때문에 8080포트로 도메인을 설정 하였다.

이후 대시모드에서 아래 설정창 -> 카카오 로그인 설정하기로 들어간다.

왼쪽 네이베깅션 바에 들어가서 카카오로그인 으로 들어갈시 아래에
Redirect url이 있는데 여기에 내가 oAuth rediect url을 설정하면된다.
이후 동의 항목에 이메일이 안되어 찾아보니 비즈앱으로 변환이 필요하다하여
앱의 사진등록후 개인 사용자로 등록하여 비즈앱을 등록하였다.

동의항목에는 이렇게 닉네임 프로필 사진 이메일을 가져오도록 하였다.
이후 카카오 api key와 redirecturi을 등록해줘야하는데
개인정보이므로 application-private.properties 에다가 등록해 두었다.
kakao.api_key=키정보
kakao.redirect_uri=http://localhost:8080/auth/login/kakao
이후 사용하기위해 kakaoapi라는 클래스를만들어
package com.my.interrior.common;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@ToString
@Setter
@Component
public class KakaoApi {
@Value("${kakao.api_key}")
private String kakaoApiKey;
@Value("${kakao.redirect_uri}")
private String kakaoRedirectUri;
}
이렇게 작성
카카오 로그인에 들어가서 코드를 확인 해야 한다길레
컨트롤러에 해당 url로 들어갈시 코드가 제대로 들어오는지 확인하기 위해
package com.my.interrior.common;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class KakaoLoginController {
//인증 시 코드 받는 곳
@RequestMapping("/auth/login/kakao")
public String kakaoLogin(@RequestParam("code") String code) {
System.out.println("code : " + code);
return "client/join";
}
}
작성후 제대로 코드가 들어오는걸확인
이제 access_Token을 받아올 작업을 수행해줄 service클래스 생성 및 get accesstoken메소드 작성
package com.my.interrior.common;
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
@Service
public class KakaoLoginService {
@Autowired
private KakaoApi kakaoApi;
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=").append(kakaoApi.getKakaoApiKey());
sb.append("&redirect_uri=").append(kakaoApi.getKakaoRedirectUri());
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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return access_Token;
}
}
해당 코드는 Access_Token을 가져오는 service클래스이지만 해당 기능에대해 아직다 숙지는 하지 못했으니 나중에 따로 시간을 가져 보겠다
우선 간단하게 설명하자면
내가가진 api key와 리다이렉트 url로
Buffered writer 요청 파라미터를 전송하고
bufferedreader로 응답본문을 읽어온다.
jsonparser를 사용하여 json객체로 파싱 하며
Access_token과 refresh_token을 추출
이후 access_token을 반환한다.
이후 컨트롤러 에 추가적으로 access_token을 받아온다
package com.my.interrior.common;
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;
@Controller
public class KakaoLoginController {
@Autowired
private KakaoLoginService kakaoService;
//인증 시 코드 받는 곳
@RequestMapping("/auth/login/kakao")
public String kakaoLogin(@RequestParam("code") String code) {
System.out.println("code : " + code);
String access_Token = kakaoService.getAccessToken(code);
System.out.println("controller access_token : " + access_Token);
return "client/join";
}
}
이제 access_token을 받아 왔으니 이제 유저의 정보를 가저오는것을 구현하겠다
아래의 코드는 service의 코드다
public HashMap<String, Object> getUserInfo(String access_Token){
HashMap<String, Object> userInfo = new HashMap<>();
String reqURL = "https://kapi.kakao.com/v2/user/me";
try {
URL url = new URL(reqURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
// 요청에 필요한 Header에 포함될 내용
conn.setRequestProperty("Authorization", "Bearer " + access_Token);
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 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 (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return userInfo;
}
클라이언트마다 제공 정보의 종의여부가 다를 수 있기 때문에 mashMap타입을 통해 정보를 받는다
reqUrl은 카카오 사용자 정보 api의 엔드포인트 url이다.
대부분은 위에서 access_token받아오기와 비슷하지만 아래에 hashmap에 저장하는곳만 조금 다르다
댓글남기기