티스토리 뷰
네이버 로그인 API(OAuth 2.0) 연동하기
1. 네이버 개발자센터 설정
NAVER Developers
네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음
developers.naver.com
- 내 애플리케이션에 접속
- 애플리케이션 등록
- 애플리케이션이름, 사용 API 선택 후 추가 정보 입력.
- 애플리케이션 생성후 개요 탭에서 Client ID, Client Secret 복사
2. 웹사이트에서 네이버 API 연동 작업(PHP)
네이버 로그인 화면 호출
// 사이트 자체팝업 오픈후 onload시 form값 넘기는 방식 //
var nv_popup = window.open("/Oauth2/nv_popup.php", "naver", "location=0,status=0,scrollbars=1,width=600,height=500");
if(!nv_popup || nv_popup.closed || typeof nv_popup.closed == "undefined") {
alert('브라우저에서 팝업이 차단되어 있습니다. 팝업 활성화 후 다시 시도해 주세요.');
}
// nv_popup.php 팝업 //
// 네아로 인증요청시 사이트간 요청위조 공격을 방지하기 위한 state
function _get_naver_state() {
$mt = microtime();
$rand = mt_rand();
return md5($mt . $rand);
}
$client_id = {YOUR_CLIENT_ID};
$redirectURI = {YOUR_CALLBACK_URL};
$naver_state = _get_naver_state();
// onload form submit //
<form name="nv_form" method="post" action="https://nid.naver.com/oauth2.0/authorize?response_type=code">
<input type="hidden" name="client_id" value="<?=$client_id?>" />
<input type="hidden" name="redirect_uri" value="<?=$redirectURI?>" />
<input type="hidden" name="state" value="<?=$naver_state?>" />
</form>
<script type="text/javascript">
$(document).ready(function() {
$("form[name='snsForm']").submit();
});
</script>
Callback URL
- state : 콜백으로 전달받는 상태 토큰(애플리케이션이 생성한 상태 토큰과 일치해야 합니다.)
- code : 콜백으로 전달받은 인증코드(authentication code) 접근 토큰발급에 사용합니다.
접근 토큰 발급요청
접근 토큰발급에 필요한 정보
- client_id : 애플리케이션 등록 후 발급받은 클라이언트 아이디
- client_secret : 애플리케이션 등록 후 발급받은 클라이언트 비밀번호
- grant_type : 인증 타입에 대한 구분값, authorization_code로 값이 고정되어 있습니다.
- state : 애플리케이션이 생성한 상태 토큰
- code : 콜백으로 전달받은 인증코드
$client_id = {YOUR_CLIENT_ID};
$client_secret = {YOUR_CLIENT_SECRET};
$redirectURI = {YOUR_REDIRECT_URI};
$code = $_GET['code'];
$state = $_GET['state'];
$url = "https://nid.naver.com/oauth2.0/token?grant_type=authorization_code&client_id=".$client_id."&client_secret=".$client_secret."&redirect_uri=".$redirectURI."&code=".$code."&state=".$state;
$is_post = false;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, $is_post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$headers = array();
$response = curl_exec($ch);
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if($status_code == 200)
{
$nv = json_decode($response);
$result = get_object_vars($nv);
$token = $result['access_token']; // 토큰값
}
네이버 사용자 프로필 정보 조회
접근 토큰을 성공적으로 발급받았다면 접근 토큰을 이용해 네이버 사용자의 프로필 정보를 조회합니다.
$client_id = {YOUR_CLIENT_ID};
$client_secret = {YOUR_CLIENT_SECRET};
$token = $result['access_token']; // 리턴받은 토큰값
$header = "Bearer ".$token; // Bearer(토큰타입) 다음에 공백 추가
$url = "https://openapi.naver.com/v1/nid/me";
$is_post = false;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, $is_post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$headers = array();
$headers[] = "Authorization: ".$header;
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec ($ch);
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close ($ch);
if($status_code == 200)
{
$nv = json_decode($response);
$vars = get_object_vars($nv);
$result = get_object_vars($vars['response']);
$profile = $result;
}
네이버 사용자 프로필 정보조회 필수정보 동의 누락시 재동의 화면으로 이동
이름 및 이메일주소등 필요한 정보가 조회조회 되지 않을 경우 동의화면으로 돌아가게 합니다.
// 이름 또는 이메일주소가 조회되지 않을경우 //
if(!$profile['email'] || !$profile['name']) {
$client_id = {YOUR_CLIENT_ID};
$redirectURI = {YOUR_REDIRECT_URI};
$nv_state = _get_naver_state(); // 네아로 인증요청시 사이트간 요청위조 공격을 방지하기 위한 state
$url = "https://nid.naver.com/oauth2.0/authorize?response_type=code&client_id=".$client_id."&state=".$naver_state."&redirect_uri=".$redirectURI."&auth_type=reprompt";
gourl($url, "", "이름 및 이메일은 필수정보입니다. 정보제공을 동의해주세요.");
exit;
}
리턴 받은 네이버 사용자 프로필 정보 사이트내 DB 처리
사용자 프로필 정보를 자체 DB에 저장후 네이버 로그인 시 비교 후 로그인 하면 됩니다.
네이버 로그인 API 검수
'프로그램개발' 카테고리의 다른 글
[Javascript] Location 객체 (0) | 2024.03.20 |
---|---|
@media print (0) | 2024.03.19 |
Javascript 로드 방식 async 와 defer (0) | 2024.02.15 |
MySQL 스토리지 엔진(Storage Engine) MyISAM과 InnoDB 설명 및 비교 (0) | 2024.01.10 |
Geolocation API (0) | 2024.01.03 |