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






클아:au4L2O2INJwUFl915A_J
클시크릿:xiCngRegDl
2. API로그인
2.1 코드 받기


- 내 클라이언트 키와 등록한 uri를 넣고 웹에서 실행한다.


2.2 토큰 받기


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

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;
}
}
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;
}
}
}
// 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";
}
- 결과


Share article