navis

네이버 로그인 API 연동 (Spring boot) 본문

API

네이버 로그인 API 연동 (Spring boot)

menstua 2024. 8. 28. 08:48
728x90

 

Naver Developers REST API 설정

 

애플리케이션 - NAVER Developers

 

developers.naver.com

 

네이버 로그인 API를 연동하는 과정은 여러 단계로 이루어져 있으며, 이를 통해 사용자 인증을 보다 간편하게 구현할 수 있습니다. 아래는 각 단계에 대한 자세한 설명입니다.

목차

1. Naver Developers 설정

  • 애플리케이션 생성 및 설정
    • Naver Developers 페이지에서 애플리케이션 등록
    • 애플리케이션 이름 입력 및 사용 API 선택

2. API 연동 정보 확인

  • Client ID 및 Client Secret 확인
    • '개요' 탭에서 확인 가능

3. API 설정

  • 서비스 환경 설정
    • 'API 설정' 탭에서 도메인 및 Callback URL 설정
    • 서비스 URL과 Callback URL 등록

4. 실습 예제

  • Spring Boot에서 네이버 로그인 구현하기
  • 사용자 정보 출력 예제

5. 마무리

  • 개발 시 주의사항 및 팁
  • 추가 참고 자료 및 문서

1. Naver Developers 설정

Naver Developers 페이지에서 "Application 등록" 버튼을 클릭하여 애플리케이션을 생성합니다. 애플리케이션 이름을 입력하고, 사용하려는 API를 선택합니다. 이때, "네이버 로그인 API"를 반드시 선택해야 합니다.

Application 등록


2. API 설정

'API 설정' 탭에서 API 서비스 환경을 설정합니다. 네이버 로그인 API 연동 시 필요한 정보들을 설정하고, 사용할 도메인과 Callback URL을 입력합니다. 서비스 URL에는 네이버 로그인을 사용할 페이지의 URL을, Callback URL에는 로그인 후 리다이렉션될 URL을 입력합니다. 설정된 URL과 다른 곳에서 API를 호출하면 에러가 발생할 수 있으니 주의해야 합니다.

조회 정보 설정

 

domain / Callback URL


3. API 연동 정보 확인

애플리케이션 등록을 완료한 후, '개요' 탭에서 API 연동에 필요한 Client IDClient Secret 값을 확인할 수 있습니다. 이 정보는 API 연동 시 필수적으로 사용되며, 추후 다시 확인할 수 있습니다.

Client ID / Client Secret


4. 실습 예제

Spring Boot 환경에서 네이버 로그인을 구현하고, OAuth2 인증을 통해 사용자 정보를 요청하는 예제를 진행합니다. 이를 통해 실습을 통해 네이버 로그인을 웹 애플리케이션에 적용할 수 있습니다.

 

Controller

@Slf4j
@RestController
@RequiredArgsConstructor
public class NaverApiController {

    private final NaverApiService naverApiService;

    // 네이버 간편 로그인
    @GetMapping("/callback-naver")
    public ResponseEntity<String> callback(@RequestParam("code") String code) {
        try {
            // 액세스 토큰을 받고 사용자 정보를 가져오기
            NaverUserInfoResponseDto userInfo = naverApiService.getAccessTokenAndUserInfo(code);

            // 사용자 정보를 이용한 추가 작업 (예: 회원가입, 로그인 처리)
            log.info("Retrieved User Info: {}", userInfo);

            return ResponseEntity.ok("User Info retrieved successfully.");
        } catch (Exception e) {
            log.error("Error occurred: ", e);
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
                    .body("Error: Unauthorized request. Please check your credentials and try again.");
        }
    }
}

 

 

RestTemplate

 // 인증토큰 조회
    @Override
    public String getAccessToken(String code) {
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("grant_type", "authorization_code");
        params.add("client_id", clientId);
        params.add("redirect_uri", redirectUri);
        params.add("code", code);
        params.add("client_secret", clientSecret);

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(params, headers);

        ResponseEntity<Map<String, Object>> response = restTemplate.exchange(
                Comm.NAVER_TOKEN_URL,
                HttpMethod.POST,
                request,
                new ParameterizedTypeReference<Map<String, Object>>() {
                }
        );

        if (response.getStatusCode() == HttpStatus.OK) {
            Map<String, Object> responseBody = response.getBody();
            if (responseBody == null || !responseBody.containsKey("access_token")) {
                throw new NaverApiException("Failed to retrieve access token. Response body is null or missing access_token.");
            }
            return (String) responseBody.get("access_token");
        } else {
            throw new NaverApiException("Failed to get access token. HTTP Status: " + response.getStatusCode());
        }
    }

    // 유저 정보 조회
    @Override
    public NaverUserInfoResponseDto getUserInfo(String accessToken) {
        HttpHeaders headers = new HttpHeaders();
        headers.set("Authorization", "Bearer " + accessToken);

        HttpEntity<String> request = new HttpEntity<>(headers);

        ResponseEntity<NaverUserInfoResponseDto> response = restTemplate.exchange(
                Comm.NAVER_USER_INFO_URL,
                HttpMethod.GET,
                request,
                NaverUserInfoResponseDto.class
        );

        if (response.getStatusCode() == HttpStatus.OK) {
            NaverUserInfoResponseDto userInfo = response.getBody();
            if (userInfo == null) {
                throw new NaverApiException("Failed to retrieve user info. Response body is null.");
            }
            return userInfo;
        } else {
            throw new NaverApiException("Failed to get user info. HTTP Status: " + response.getStatusCode());
        }
    }
}

5. 마무리

개발 시 주의해야 할 사항들과 함께, API 연동 시 발생할 수 있는 문제들에 대한 팁을 제공합니다. 또한, 추가적으로 참고할 수 있는 문서와 자료들을 안내하여 네이버 로그인 API 연동을 완벽히 이해할 수 있도록 돕습니다.

'API' 카테고리의 다른 글

구글 로그인 API 연동 (Spring boot)  (1) 2024.08.28
카카오 로그인 API 연동 (Spring boot)  (4) 2024.08.27