네이버 코드방식OAuth

박선규's avatar
Jun 10, 2024
네이버 코드방식OAuth
 

1. 애플리케이션 등록하기

notion image
notion image
내가 사용자에게 받을 정보들을 선택 해준다.
내가 사용자에게 받을 정보들을 선택 해준다.
코드 방식이니까 PC웹 선택하기
코드 방식이니까 PC웹 선택하기
서비스 할 주소와(현재 내 로컬에만 확인하니 내 로컬 주소)
코드받을 주소 선택하기
서비스 할 주소와(현재 내 로컬에만 확인하니 내 로컬 주소) 코드받을 주소 선택하기
 
클라이언트 아이디와 클라이언트 시크릿 키 메모장에 넣어두기
클라이언트 아이디와 클라이언트 시크릿 키 메모장에 넣어두기
클아:au4L2O2INJwUFl915A_J
클시크릿:xiCngRegDl
 

2. API로그인

2.1 코드 받기

리다이렉트할 네이버 로그인 URL 넣기
리다이렉트할 네이버 로그인 URL 넣기
notion image
  • 내 클라이언트 키와 등록한 uri를 넣고 웹에서 실행한다.
notion image
 
코드를 발급 받는다.
코드를 발급 받는다.

2.2 토큰 받기

notion image
notion image
 

2.3 사용자 정보 조회 (코드가 유효한지 네이버측에서 확인)

notion image
 

3. 응답DTO만들기 및 코드 실행

@Data public static class NaverUserDTO { private Response response; @Data public class Response{ private String id; private String gender; private String email; private String name; } }
response
 
package shop.mtcoding.loginapp.user; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import java.util.UUID; @RequiredArgsConstructor @Service public class UserService { private final UserRepository userRepository; @Transactional public void 회원가입(String username, String password, String email) { User user = User.builder() .username(username) .password(password) .email(email) .build(); userRepository.save(user); } public User 로그인(String username, String password) { User user = userRepository.findByUsername(username); if(user == null){ throw new RuntimeException("아이디가 없습니다"); }else{ if(user.getPassword().equals(password)){ return user; }else{ throw new RuntimeException("비밀번호가 틀렸습니다"); } } } public User 네이버로그인(String code) { // 1. code로 카카오에서 토큰 받기 (위임완료) - oauth2.0 // 1.1 RestTemplate 설정 RestTemplate rt = new RestTemplate(); // 1.2 http header 설정 HttpHeaders headers = new HttpHeaders(); headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8"); // 1.3 http body 설정 MultiValueMap<String, String> body = new LinkedMultiValueMap<>(); body.add("grant_type", "authorization_code"); body.add("client_id", "au4L2O2INJwUFl915A_J"); body.add("client_secret", "xiCngRegDl"); body.add("code", code); body.add("state", "1234"); body.add("redirect_uri", "http://localhost:8080/oauth/callback"); // 1.4 body+header 객체 만들기 HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(body, headers); // 1.5 api 요청하기 (토큰 받기) ResponseEntity<NaverResponse.TokenDTO> response = rt.exchange( "https://nid.naver.com/oauth2.0/token", HttpMethod.POST, request, NaverResponse.TokenDTO.class); // 1.6 값 확인 System.out.println(response.getBody().toString()); // 2. 토큰으로 사용자 정보 받기 (PK, Email) HttpHeaders headers2 = new HttpHeaders(); headers2.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8"); headers2.add("Authorization", "bearer "+response.getBody().getAccessToken()); HttpEntity<MultiValueMap<String, String>> request2 = new HttpEntity<>(headers2); ResponseEntity<NaverResponse.NaverUserDTO> response2 = rt.exchange( "https://openapi.naver.com/v1/nid/me", HttpMethod.GET, request2, NaverResponse.NaverUserDTO.class); System.out.println("response2 : "+response2.getBody().toString()); // 3. 해당정보로 DB조회 (있을수, 없을수) String username = "Naver_"+response2.getBody().getResponse().getName(); User userPS = userRepository.findByUsername(username); // 4. 있으면? - 조회된 유저정보 리턴 if(userPS != null){ System.out.println("어? 유저가 있네? 강제로그인 진행"); return userPS; }else{ System.out.println("어? 유저가 없네? 강제회원가입 and 강제로그인 진행"); // 5. 없으면? - 강제 회원가입 // 유저네임 : (provider_pk) // 비밀번호 : UUID // 이메일 : email 받은 값 // 프로바이더 : kakao User user = User.builder() .username(username) .password(UUID.randomUUID().toString()) .email(response2.getBody().getResponse().getEmail()) .provider("Naver") .build(); User returnUser = userRepository.save(user); return returnUser; } } }
service
 
// http://lodcalhost:8080/oauth/callback?code=3u9fk @GetMapping("/oauth/callback") public String oauthCallback(String code) { System.out.println("콜백 됨: "+code); User sessionUser = userService.네이버로그인(code); session.setAttribute("sessionUser", sessionUser); return "redirect:/shop"; }
controller
 
  • 결과
notion image
notion image
Share article

p4rksk