JUST GO
[공통] 카카오 로그인 본문
MemberController
// 카카오 로그인하기
@Controller(value = "dev.rootgo.matzip.controllers.MemberController")
@RequestMapping(value = "member")
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
@GetMapping(value = "kakao", produces = MediaType.TEXT_PLAIN_VALUE)
public ModelAndView getKakao(@RequestParam(value = "code") String code,
@RequestParam(value = "error", required = false) String error,
@RequestParam(value = "error_description", required = false) String errorDescription,
HttpSession session) throws IOException {
String accessToken = this.memberService.getKakaoAccessToken(code);
UserEntity user = this.memberService.getKakaoUserInfo(accessToken);
session.setAttribute("user", user);
return new ModelAndView("member/kakao");
}
@GetMapping(value = "logout")
public ModelAndView getLogout(HttpSession session) {
session.setAttribute("user", null);
session.invalidate();
return new ModelAndView("redirect:/");
}
}
MemberService
@Service(value = "dev.rootgo.matzip.services.MemberService")
public class MemberService {
private final IMemberMapper memberMapper;
@Autowired
public MemberService(IMemberMapper memberMapper) {
this.memberMapper = memberMapper;
}
public String getKakaoAccessToken(String code) throws IOException {
URL url = new URL("https://kauth.kakao.com/oauth/token");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
int responseCode;
try (OutputStreamWriter outputStreamWriter = new OutputStreamWriter(connection.getOutputStream())) {
try (BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter)) {
StringBuilder requestBuilder = new StringBuilder();
requestBuilder.append("grant_type=authorization_code");
requestBuilder.append("&client_id=c46b378a1086f25e2d518ef34b37a493");
requestBuilder.append("&redirect_uri=http://localhost:8080/member/kakao");
requestBuilder.append("&code=").append(code);
bufferedWriter.write(requestBuilder.toString());
bufferedWriter.flush();
responseCode = connection.getResponseCode();
}
System.out.println("응답 코드 : " + responseCode);
}
StringBuilder responseBuilder = new StringBuilder();
try (InputStreamReader inputStreamReader = new InputStreamReader(connection.getInputStream())) {
try (BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
String line;
while ((line = bufferedReader.readLine()) != null) {
responseBuilder.append(line);
}
}
System.out.println("응답 내용 : " + responseBuilder);
}
JSONObject responseObject = new JSONObject(responseBuilder.toString());
return responseObject.getString("access_token");
}
public UserEntity getKakaoUserInfo(String accessToken) throws IOException {
URL url = new URL("https://kapi.kakao.com/v2/user/me");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Authorization", String.format("Bearer %s", accessToken));
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
System.out.println("응답 코드 : " + responseCode);
StringBuilder responseBuilder = new StringBuilder();
try (InputStreamReader inputStreamReader = new InputStreamReader(connection.getInputStream())) {
try (BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
String line;
while ((line = bufferedReader.readLine()) != null) {
responseBuilder.append(line);
}
}
}
System.out.println("응답 내용 : " + responseBuilder);
JSONObject responseObject = new JSONObject(responseBuilder.toString());
JSONObject propertyObject = responseObject.getJSONObject("properties");
String id = String.valueOf(responseObject.getLong("id"));
UserEntity user = this.memberMapper.selectUserById(id);
if (user == null){
user = new UserEntity();
user.setId(id);
user.setNickname(propertyObject.getString("nickname"));
this.memberMapper.insertUser(user);
}
return user;
}
}
index.js
loginButton?.addEventListener('click', e => {
e.preventDefault();
loginContainer.classList.add('visible');
window.open('https://kauth.kakao.com/oauth/authorize?client_id=c46b378a1086f25e2d518ef34b37a493&redirect_uri=http://localhost:8080/member/kakao&response_type=code', '로그인', 'width=500; height=750');
});
'Spring Boot > 학습내용' 카테고리의 다른 글
[공통] map API (0) | 2022.12.01 |
---|---|
[공통] Interceptor (0) | 2022.12.01 |
[공통] 페이징(Paging) 혹은 페이지네이션(Pagination) (1) | 2022.11.30 |
[공통] 글 수정 구현 (0) | 2022.11.28 |
[공통] 게시판 만들기 (0) | 2022.11.15 |