문의 시, 사용하시는 개발환경과 디벨로퍼스 앱ID를 알려주세요.
디벨로퍼스 앱ID : 1130499
accessToken 활용
//service 코드
public void withdraw(String accessToken, Long userId) {
// 1. Kakao API를 통해 연결 끊기 요청
String url = "https://kapi.kakao.com/v1/user/unlink";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
headers.set("Authorization", "Bearer " + accessToken);
HttpEntity<String> entity = new HttpEntity<>(headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
if (response.getStatusCode() == HttpStatus.OK) {
System.out.println("Kakao 연결 끊기 성공");
// 2. 연결 끊기 성공 후 데이터베이스에서 사용자 정보 삭제
Optional<User> optionalUser = userRepository.findByUserId(userId);
if (optionalUser.isPresent()) {
User user = optionalUser.get();
userRepository.delete(user);
refreshTokenRepository.deleteByUser_UserId(user.getUserId());
System.out.println("회원탈퇴 성공");
} else {
System.out.println("사용자를 찾을 수 없습니다.");
}
} else {
throw new RuntimeException("Kakao 연결 끊기 실패: " + response.getStatusCode());
}
}
//controller 코드
@PostMapping("/withdraw")
public ResponseEntity<String> withdraw(HttpServletRequest request) {
String userIdHeader = request.getHeader("userId");
String bearerToken = request.getHeader("Authorization");
if (bearerToken != null && bearerToken.startsWith("Bearer ")) {
String accessToken = bearerToken.substring(7); // "Bearer " 부분 제거
if (userIdHeader != null) {
Long userId = Long.valueOf(userIdHeader);
userService.withdraw(accessToken, userId); // Kakao 회원탈퇴 처리
return ResponseEntity.ok("회원탈퇴가 완료되었습니다.");
} else {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("유저 ID가 필요합니다.");
}
} else {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("유효한 토큰이 필요합니다.");
}
}
카카오와 유저의 연결을 끊고 → 연결이 끊겼다면 해당 유저의 정보를 db에서 삭제하는 방식으로 회원탈퇴를 진행하고자 합니다. 로그아웃도 위와 비슷한 로직으로 구현했는데 그건 잘 작동하는데 저 코드를 돌리면 401 오류가 발생하는데 왜 저 오류가 발생하는지 도무지 모르겠습니다,