inblog logo
|
p4rksk
    JavaSpringFrameWorkOAuth 2.0

    네이버 코드방식OAuth

    박선규's avatar
    박선규
    Jun 10, 2024
    네이버 코드방식OAuth
    Contents
    1. 애플리케이션 등록하기 2. API로그인3. 응답DTO만들기 및 코드 실행
    개요 - LOGIN
    개요 NAVER Developers - 네이버 로그인 개요 네이버 로그인은 OAuth 2.0 기반의 사용자 인증 기능을 제공해 네이버가 아닌 다른 서비스에서 네이버의 사용자 인증 기능을 이용할 수 있게 하는 서비스입니다. 별도의 아이디나 비밀번호를 기억할 필요 없
    개요 - LOGIN
    https://developers.naver.com/docs/login/overview/overview.md
     

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

    내 애플리케이션 관리 - Open API 가이드
    내 애플리케이션 관리 개발자 센터의 Application > 내 애플리케이션 메뉴를 클릭하면 등록한 애플리케이션의 목록을 확인할 수 있습니다. 목록 위에 있는 Application 등록을 클릭하면 새로운 애플리케이션을 등록할 수 있습니다. 애플리케이션은 최대 10
    내 애플리케이션 관리 - Open API 가이드
    https://developers.naver.com/docs/common/openapiguide/appconf.md#멤버-관리
    notion image
    notion image
    내가 사용자에게 받을 정보들을 선택 해준다.
    내가 사용자에게 받을 정보들을 선택 해준다.
    코드 방식이니까 PC웹 선택하기
    코드 방식이니까 PC웹 선택하기
    서비스 할 주소와(현재 내 로컬에만 확인하니 내 로컬 주소)
코드받을 주소 선택하기
    서비스 할 주소와(현재 내 로컬에만 확인하니 내 로컬 주소) 코드받을 주소 선택하기
     
    클라이언트 아이디와 클라이언트 시크릿 키 메모장에 넣어두기
    클라이언트 아이디와 클라이언트 시크릿 키 메모장에 넣어두기
    클아:au4L2O2INJwUFl915A_J
    클시크릿:xiCngRegDl
     

    2. API로그인

    2.1 코드 받기

    Web 애플리케이션 - LOGIN
    Web 애플리케이션 NAVER Developers - 네이버 로그인 Web 개발가이드 네이버 로그인은 서버 사이드 언어인 PHP나 Java로 개발한 웹 애플리케이션에도 적용할 수 있습니다. 또한 프런트엔드에서 사용하는 JavaScript를 사용해도 적용할 수 있습
    Web 애플리케이션 - LOGIN
    https://developers.naver.com/docs/login/web/web.md
    리다이렉트할 네이버 로그인 URL 넣기
    리다이렉트할 네이버 로그인 URL 넣기
    notion image
    • 내 클라이언트 키와 등록한 uri를 넣고 웹에서 실행한다.
    notion image
     
    코드를 발급 받는다.
    코드를 발급 받는다.

    2.2 토큰 받기

    네이버 로그인 API 명세 - LOGIN
    네이버 로그인 API 명세 네이버 로그인 API는 네이버 로그인 인증 요청 API, 접근 토큰 발급/갱신/삭제 요청API로 구성되어 있습니다. 네이버 로그인 인증 요청 API는 여러분의 웹 또는 앱에 네이버 로그인 화면을 띄우는 API입니다. 이용자가 네이버 회원
    네이버 로그인 API 명세 - LOGIN
    https://developers.naver.com/docs/login/api/api.md
    notion image
    notion image
     

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

    Web 애플리케이션 - LOGIN
    Web 애플리케이션 NAVER Developers - 네이버 로그인 Web 개발가이드 네이버 로그인은 서버 사이드 언어인 PHP나 Java로 개발한 웹 애플리케이션에도 적용할 수 있습니다. 또한 프런트엔드에서 사용하는 JavaScript를 사용해도 적용할 수 있습
    Web 애플리케이션 - LOGIN
    https://developers.naver.com/docs/login/web/web.md
    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

    RSS·Powered by Inblog