본문으로 바로가기

 

각 소셜별 API 를 이용하여 클라이언트 ID 와 SECRET 을 받아와서 로그인 할 수 있게 한다.

 

 

@GetMapping("/naver")

public String getMethodNaver(@RequestParam(name = "code") String code, Model model) {

 

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", "VV02L4roYlvMO2qxf3n7");

params1.add("client_secret", "so4ce5BLjN");

params1.add("code", code);

 

// 헤더 + 바디 결합

HttpEntity<MultiValueMap<String, String>> reqNaverMessage = new HttpEntity<>(params1, header1);

 

// 통신 요청

ResponseEntity<OAuthToken> response1 = rt1.exchange("https://nid.naver.com/oauth2.0/token", HttpMethod.POST,

reqNaverMessage, OAuthToken.class);

 

System.out.println("test : " + response1);

 

System.out.println("response : " + response1.getBody().toString());

 

// return response1.toString();

 

// (접근 토큰을 이용하여 프로필 API 호출하기)

RestTemplate rt2 = new RestTemplate();

String accessToken = response1.getBody().getAccessToken(); // 토큰 확인

System.out.println("accessToken : " + accessToken);

// 헤더

HttpHeaders headers2 = new HttpHeaders();

headers2.add("Authorization", "Bearer " + accessToken);

headers2.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");

// HTTP Entity 만들기

HttpEntity<MultiValueMap<String, String>> reqNaverInfoMessage = new HttpEntity<>(headers2);

 

// 통신 요청

ResponseEntity<NaverProfile> response2 = rt2.exchange("https://openapi.naver.com/v1/nid/me", HttpMethod.POST,

reqNaverInfoMessage, NaverProfile.class);

 

NaverProfile naverProfile = response2.getBody();

System.out.println("naverProfile : " + naverProfile.toString());

 

// 전화번호 하이폰 제거 ex) 010-1234-5678 => 01012345678 로 변경

String removeHypone = userService.removeHyphens(naverProfile.getResponse().getMobile());

 

// 네이버 회원가입 dto 작동 확인

signUpDTO user = signUpDTO.builder()

// name, birth_date, gender, address, nick_name, phone_number, email, password,

// admin_check

.nickName(naverProfile.getResponse().getNickname())

.email(naverProfile.getResponse().getEmail())

.phoneNumber(removeHypone)

.password("1234")

.build();

 

System.out.println(user.toString());

 

// 회원가입시 이메일 중복 체크

int result = userService.checkEemail(user.getEmail());

 

if(result == 0) {

 

if (user != null) {

// 회원가입

userService.createUser(user);

 

// signUpDTO에 있는 값 (이메일, 패스워드)를 User dto 카카오에서 받은 이메일, 패스워드를 받음

UserDTO dto = UserDTO.builder()

.email(naverProfile.getResponse().getEmail())

.password(user.getPassword())

.build();

 

UserDTO principal = userService.login(dto); // 로그인 시도 및 User 객체 반환

 

session.setAttribute("principal", principal);

System.out.println("principal : " + principal);

}

return "redirect:/";

 

} else {

UserDTO dto = UserDTO.builder()

.email(naverProfile.getResponse().getEmail())

.password(user.getPassword())

.build();

 

UserDTO principal = userService.login(dto); // 로그인 시도 및 User 객체 반환

session.setAttribute("principal", principal);

System.out.println("principal : " + principal);

 

userService.login(dto);

return "user/signIn";

}

} // end of naver

 

 

@GetMapping("/kakao")

// @ResponseBody

public String getMethodName(@RequestParam(name = "code") String code, Model model) {

// 토큰 확인 전에 확인할 수 있는 카카오 코드 (인가 코드)

System.out.println("code : " + code);

 

RestTemplate rt1 = new RestTemplate();

// RESTful API 웹 서비스와의 상호작용을 쉽게 외부 도메인에서 데이터를 가져오거나 전송할 때 사용되는 스프링 프레임워크의 클래스

 

// 헤더 구성 (토큰 받기)

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", "6d77c46fd0cf14b69558985620414300"); // da70bb7a1f4babcdcd8957d9785e99c4

params1.add("redirect_uri", "http://localhost:8080/user/kakao");

params1.add("code", code);

 

// 헤더 + 바디 결합

HttpEntity<MultiValueMap<String, String>> reqkakoMessage = new HttpEntity<>(params1, header1);

 

// 통신 요청 (토큰 받기)

ResponseEntity<OAuthToken> response1 = rt1.exchange("https://kauth.kakao.com/oauth/token", HttpMethod.POST,

reqkakoMessage, OAuthToken.class);

System.out.println("response1 <OAuthToken> : " + 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");

 

// HTTP Entity 만들기 (토큰 갱신하기)

HttpEntity<MultiValueMap<String, String>> reqKakoInfoMessage = new HttpEntity<>(headers2);

 

// 통신 요청 (토큰 갱신하기) // KakaoProfile

ResponseEntity<KakaoProfile> resposne2 = rt2.exchange("https://kapi.kakao.com/v2/user/me", HttpMethod.POST,

reqKakoInfoMessage, KakaoProfile.class);

 

KakaoProfile kakaoProfile = resposne2.getBody();

// return kakaoProfile.toString();

 

// 기존에 (카카오) 회원가입 되어있는지 정보 확인 (중복검사) -- ----------

 

// ---- 카카오 사용자 정보 응답 완료 ----------

 

// 최초 사용자라면 자동 회원 가입 처리 (우리 서버)

// 회원가입 이력이 있는 사용자라면 바로 세션 처리 (우리 서버)

// 사전기반 --> 소셜 사용자는 비밀번호를 입력하는가? 안하는가?

// 우리서버에 회원가입시에 --> password -> not null (무건 만들어 넣어야 함 DB 정책)

 

// 전화번호 +82 10-1234-5678 => 010-1234-5678 로 변경 (국제전화코드 제거)

String internationalNumber = userService.convertPhoneNumber(kakaoProfile.getKakaoAccount().getPhoneNumber());

 

// 전화번호 하이폰 제거 ex) 010-1234-5678 => 01012345678 로 변경

String removeHypone = userService.removeHyphens(internationalNumber);

 

signUpDTO user = signUpDTO.builder().nickName(kakaoProfile.getProperties().getNickname())

.email(kakaoProfile.getKakaoAccount().getEmail()).phoneNumber(removeHypone) // +82 10-1234-5678 -->

// 010-1234-5678

.password("1234").build();

 

// 회원가입시 이메일 중복 체크

int result = userService.checkEemail(user.getEmail());

 

if(result == 0) {

 

if (user != null) {

// 회원가입

userService.createUser(user);

 

// signUpDTO에 있는 값 (이메일, 패스워드)를 User dto 카카오에서 받은 이메일, 패스워드를 받음

UserDTO dto = UserDTO.builder()

.email(kakaoProfile.getKakaoAccount().getEmail())

.password(user.getPassword())

.build();

 

UserDTO principal = userService.login(dto); // 로그인 시도 및 User 객체 반환

session.setAttribute("principal", principal);

System.out.println("principal : " + principal);

 

}

return "redirect:/";

 

} else {

UserDTO dto = UserDTO.builder()

.email(kakaoProfile.getKakaoAccount().getEmail())

.password(user.getPassword())

.build();

 

UserDTO principal = userService.login(dto); // 로그인 시도 및 User 객체 반환

session.setAttribute("principal", principal);

System.out.println("principal : " + principal);

 

userService.login(dto);

return "user/signIn";

}

 

} // end of getMethodName();

 

 

@GetMapping("/google")

public String signingoogle(@RequestParam(name = "code") String code) {

System.out.println("code : " + code);

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", googleOauth.CLIENT_ID);

params1.add("client_secret", googleOauth.CLIENT_SECRET);

params1.add("redirect_uri", "http://localhost:8080/user/google");

params1.add("code", code);

 

// 헤더 + 바디 결합

HttpEntity<MultiValueMap<String, String>> reqGoogleMessage = new HttpEntity<>(params1, header1);

 

// 통신 요청

ResponseEntity<OAuthToken> response1 = rt1.exchange("https://oauth2.googleapis.com/token", HttpMethod.POST,

reqGoogleMessage, OAuthToken.class);

 

OAuthToken oauthToken = response1.getBody();

System.out.println("Access Token: " + oauthToken.getAccessToken());

 

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"); // Content-Type 헤더 추가

 

// HTTP Entity 만들기 (토큰 갱신하기)

HttpEntity<MultiValueMap<String, String>> reqGoogleInfoMessage = new HttpEntity<>(headers2);

 

// 통신 요청 (토큰 갱신하기)

ResponseEntity<GoogleProfile> resposne2 = rt2.exchange("https://www.googleapis.com/oauth2/v1/userinfo", // GoogleProfile

HttpMethod.GET, reqGoogleInfoMessage, GoogleProfile.class);

 

GoogleProfile googleProfile = resposne2.getBody();

// return resposne2.toString();

 

signUpDTO user = signUpDTO.builder()

// name, birth_date, gender, address, nick_name, phone_number, email, password,

// admin_check

.nickName(googleProfile.getName())

.email(googleProfile.getEmail())

.phoneNumber("") // 구글은 휴대폰 번호를 api로 // 제공하지 않는거 같음

.password("1234")

.build();

 

System.out.println(user.toString());

 

// 회원가입시 이메일 중복 체크

int result = userService.checkEemail(user.getEmail());

 

// 회원가입이 안되어 있다면 db에서 0을 출력 회원가입 되어있다면 1을 출력

if(result == 0) {

 

if (user != null) {

// 회원가입

userService.createUser(user);

 

// signUpDTO에 있는 값 (이메일, 패스워드)를 User dto 카카오에서 받은 이메일, 패스워드를 받음

UserDTO dto = UserDTO.builder()

.email(googleProfile.getEmail())

.password(user.getPassword())

.build();

 

UserDTO principal = userService.login(dto); // 로그인 시도 및 User 객체 반환

session.setAttribute("principal", principal);

System.out.println("principal : " + principal);

 

}

return "redirect:/";

 

} else {

// 1이 출력

// signUpDTO에 있는 값 (이메일, 패스워드)를 User dto 카카오에서 받은 이메일, 패스워드를 받음

UserDTO dto = UserDTO.builder()

.email(googleProfile.getEmail())

.password(user.getPassword())

.build();

 

userService.login(dto);

 

UserDTO principal = userService.login(dto); // 로그인 시도 및 User 객체 반환

session.setAttribute("principal", principal);

System.out.println("principal : " + principal);

 

return "redirect:/";

}

} // end of google