728x90
반응형
[Springboot] 43. OAuth 2.0 (5단계-소셜 로그인 API 연동- 자동 회원가입/로그인 처리)
1. KakaoDevelopers - 자동 로그인 처리
: 우리 서버에 회원가입 시에 패스워드 제약 -> not null (무조건 값이 들어가야 한다.)
(1) 기존 회원 정보 조회를 위한 searchUsername()
/**
* username 사용자 존재 여부 조회
* @param String username
* @return User / null
*/
public User searchUsername(String username) {
return userRepository.findByUsername(username);
}
(2) 자동 회원가입 처리
// 코드 추가
@GetMapping("/logout")
public String logout() {
session.invalidate(); // 로그아웃 됨
return "redirect:/user/sign-in";
}
@GetMapping("/kakao")
@ResponseBody // @RestController = @Controller + @ResponseBody
public String getMethodName(@RequestParam(name="code") String code) {
System.out.println("code : "+code);
// POST - 카카오 토큰 요청 받기
// header, body 구성
RestTemplate rt1 = new RestTemplate();
// 헤더 구성
HttpHeaders header1 = new HttpHeaders();
header1.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
// 바디 구성
MultiValueMap<String, String> params1 = new LinkedMultiValueMap<String,String>();
params1.add("grant_type", "authorization_code");
params1.add("client_id", "e6c387d854fa01be9131e377baa4686f");
params1.add("redirect_uri", "http://localhost:8080/user/kakao");
params1.add("code", code);
// 헤더+바디 결합
HttpEntity<MultiValueMap<String,String>> reqKakaoMessage
= new HttpEntity<>(params1,header1);
// 통신 요청
ResponseEntity<OAuthToken> response1= rt1.exchange("https://kauth.kakao.com/oauth/token",
HttpMethod.POST, reqKakaoMessage, OAuthToken.class);
System.out.println("response : "+response1.getBody().toString());
// 카카오 리소스서버 사용자 정보 가져오기
RestTemplate rt2=new RestTemplate();
// 헤더
HttpHeaders headers2=new HttpHeaders();
// 반드시 Bearer 값 다음에 공백 한 칸 추가할 것
headers2.add("Authorization","Bearer "+response1.getBody().getAccessToken());
headers2.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
// 본문(BODY) x
// HTTP ENTITY 만들기
HttpEntity<MultiValueMap<String, String>> reqKakaoInfoMessage = new HttpEntity<>(headers2);
// 통신 요청
ResponseEntity<KakaoProfile> response2=
rt2.exchange("https://kapi.kakao.com/v2/user/me", HttpMethod.POST,
reqKakaoInfoMessage, KakaoProfile.class);
KakaoProfile kakaoProfile= response2.getBody();
// -----카카오 사용자 정보 응답 완료-----
// 최초 사용자라면 자동 회원 가입 처리 (우리 서버)
// 회원가입 이력이 있는 사용자라면 바로 세선처리(우리 서버)
// 사전기반 --> 소셜 사용자는 비밀번호를 입력하는가? 안 하는가?
// 우리 서버에 회원가입시에 --> password --> not null (무조건 만들어 넣어야 함. DB 정책)
// 1. 회원가입 데이터 생성
SignUpDTO signUpDTO = SignUpDTO.builder()
.username(kakaoProfile.getProperties().getNickname()+"_"+kakaoProfile.getId())
.fullname("OAuth_"+kakaoProfile.getProperties().getNickname())
.password("07f5efbd3004db57fcd53846050461b203e984faa9d957285aa26f8b")
.build();
// 2. 우리 사이트 최초 소셜 사용자인지 판별
User oldUser=userService.searchUsername(signUpDTO.getUsername());
if(oldUser == null) {
// 사용자가 최초 소셜 로그인 사용자임!
userService.createUser(signUpDTO);
// 고민 !!!
}
return response2.getBody().toString();
}
2. 카카오 프로필과 연동 - 이미지 받아오기
public String setUpUserImage() {
if(uploadFileName==null && originFileName==null) {
uploadFileName="https://picsum.photos/id/1/350";
} else if(fullname.contains("OAuth")) {
uploadFileName=this.getOriginFileName();
} else {
uploadFileName = "/images/uploads/" +uploadFileName;
}
return uploadFileName;
}
728x90
반응형
'Springboot' 카테고리의 다른 글
[Springboot] 44. 익명 게시판 만들기 (0) | 2024.08.19 |
---|---|
[Springboot] 42. OAuth 2.0 (4단계-Kakao Developers 소셜 로그인 사용자 정보 받아오기) (0) | 2024.08.16 |
[Springboot] 41. OAuth 2.0 (3단계-Kakao Developers 소셜 로그인 API 토큰 받기) (0) | 2024.08.16 |
[Springboot] 40. OAuth 2.0 (2단계-Kakao Developers API 응답 코드 받기) (0) | 2024.08.14 |
[Springboot] 39. OAuth 2.0 (1단계-Kakao Developers 사용하기) (0) | 2024.08.14 |