1. 토큰 받을 준비하기
response type에 맞는 domain(KakaoToken.java) 생성
@Getter @Setter @ToString
public class KakaoToken {
String token_type;
String access_token;
Integer expires_in;
String refresh_token;
Integer refresh_token_expires_in;
String scope;
}
2. 토큰 요청하기
LoginService.java 작성
requestToken 메소드는 인증코드를 인자로 받아 KakaoToken의 객체를 이용해 token을 리턴합니다.
@Slf4j
@Component
public class LoginService {
private final LoginMapper loginMapper;
public LoginService(LoginMapper loginMapper) {
this.loginMapper = loginMapper;
}
//인증코드로 token요청하기
public KakaoToken requestToken(String code){
String strUrl = "https://kauth.kakao.com/oauth/token"; //request를 보낼 주소
KakaoToken kakaoToken = new KakaoToken(); //response를 받을 객체
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입니다. ***자신의 앱 REST API KEY로 변경해주세요***
sb.append("&client_id=a527f058ade4d6b7075f0a57318df2d4");
//2번 파라미터 redirect_uri입니다. ***자신의 redirect uri로 변경해주세요***
sb.append("&redirect_uri=http://116.33.177.58:8080/member/kakaologin");
//3번 파라미터 code입니다. 인자로 받아온 인증코드입니다.
sb.append("&code=" + code);
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);
//api호출용 access token
String access_Token = kakaoToken.getAccess_token();
//access 토큰 만료되면 refresh token사용(유효기간 더 김)
String refresh_Token=kakaoToken.getRefresh_token();
log.info("access_token = {}",access_Token);
log.info("refresh_token = {}", refresh_Token);
br.close();
bw.close();
}catch (IOException e) {
e.printStackTrace();
}
log.info("카카오토큰생성완료>>>{}",kakaoToken);
return kakaoToken;
}
LoginController 수정
(추가됨: 카카오 토큰 요청)
@Slf4j
@Controller
public class LoginController {
private final LoginService loginService;
public LoginController(LoginService loginService) {
this.loginService = loginService;
}
//login 페이지 mapping
@RequestMapping("/login")
public String loginPage(){
return "login";
}
//redirect 경로 mapping
@RequestMapping("/login/kakao-redirect")
public String kakaoLogin(@RequestParam(value = "code",required = false) String code){
if(code!=null){
System.out.println("code = " + code);
//추가됨: 카카오 토큰 요청
KakaoToken kakaoToken = loginService.requestToken(code);
log.info("kakoToken = {}", kakaoToken);
}
return "redirectPage"; //만들어둔 응답받을 View 페이지 redirectPage.html 리턴
}
}
3. 실행해봅니다
#아래는 코드 복사해서 쓰는데 오류가 나시는 분들만 보세요
Mapper 관련 세팅에 어려움을 겪는 분
@Mapper
public interface LoginMapper {
//email 아는 회원가입
@Insert("INSERT INTO temp_user(id,email,nickname) VALUES(${id},#{email},#{nickname})")
int saveUserYesEmail(@Param("id")Long id, @Param("email") String email, @Param("nickname")String nickname);
//email 모르는 회원가입
@Insert("INSERT INTO temp_user(id,nickname) VALUES(${id},#{nickname})")
int saveUserNoEmail(@Param("id")Long id, @Param("nickname")String nickname);
//id로 유저 찾기
@Select("SELECT * FROM temp_user WHERE id=${id}")
User findUserById(@Param("id") Long id);
//id로 유저 유무 체크
@Select("SELECT COUNT(*) FROM temp_user WHERE id=${id}")
int countUserById(@Param("id") Long id);
}
# 카카오 로그인 오류 디버깅 하는 방법
https://developers.kakao.com/docs/latest/ko/kakaologin/trouble-shooting
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com
Kakao Developers의 문제해결 페이지에 가서 에러 코드를 검색해봅니다.
(링크가 안 들어가지면 Kakao Developers 홈 - 우측상단의 문서보기 클릭 - 카카오로그인 이해하기 클릭 - 좌측 하단에 문제해결 클릭)
'web > Spring' 카테고리의 다른 글
hhtp 요청 메세지 서버에서 보기 (0) | 2022.06.28 |
---|---|
카카오 로그인 구현(4) - 유저정보 알아내기 (0) | 2022.01.23 |
카카오 로그인 구현(3) - 인증코드받기 (0) | 2022.01.23 |
카카오 로그인 구현(2) - 애플리케이션 설정 (0) | 2022.01.23 |
카카오 로그인 구현(1) - 애플리케이션 등록 (0) | 2022.01.23 |