TIP게시판

제목 네이버 로그인 이용하기
글쓴이 변종원(웅파) 작성시각 2014/10/06 18:29:44
댓글 : 5 추천 : 1 스크랩 : 1 조회수 : 18280   RSS
http://developer.naver.com/wiki/pages/NaverLogin 에서 이용절차에 따라 
이용신청을 하셔야 합니다. 작업할 물리적 주소(Callback URL)가 있어야 신청이 되며 테스트를 
할 수 있습니다. 이 주소는 로그인후 이동할 주소입니다.

아래와 같이 간단한 프로그램을 작성했습니다.


 
//csrf를 막기위한 체크값 생성함수
function generate_state() {
    $mt = microtime();
    $rand = mt_rand();
    return md5($mt . $rand);
}

$p['state'] = generate_state();

$p['client_id'] = '로그인이용신청후 받은 클라이언트아이디';
$p['client_secret'] = '시크릿키';
$p['response_type'] = 'code';
$p['redirect_url'] = '로그인후 이동할 주소'; //여기서는 현재 파일을 그대로 이용
//네이버 로그인 등록시 입력한 주소입니다. 틀리면 작동하지 않습니다.

//
$url = 'https://nid.naver.com/oauth2.0/authorize?client_id='.urlencode($p['client_id']).'&response_type=code&redirect_uri='.urlencode($p['redirect_url']).'&state='.$p['state'];

//code는 로그인이 성공하고 나면 redirect_url에 인자로 돌려주는 값입니다.
//이 값이 있어야 access_token을 요청할 수 있습니다.
if(!$_GET['code']) {
    header('Location: ' . $url);
}
//위 요청을 하게되면 네이버 로그인창이 뜹니다. (정보동의 과정이 나올수도 있습니다)

//이 라인은 네이버 로그인창에서 로그인이 끝나고 나서 redirect_url에 code를 전송했을때
//실행됩니다.
if($_GET['code'])
{
    $p['code'] = $_GET['code'];
}

//access_token을 요청하는 주소. 위 검증코드가 있어야 실행됩니다.
$url2 = 'https://nid.naver.com/oauth2.0/token?client_id='.urlencode($p['client_id']).'&client_secret='.urlencode($p['client_secret']).'&grant_type=authorization_code&state='.$p['state'].'&code='.$p['code'];

$json = file_get_contents($url2);
$data = json_decode($json);

echo $data->access_token;

//여기까지 네이버 로그인후 access_token을 가져옵니다.

로그인만 해도 되는데 access_token을 받아오는 이유는 회원정보나 기타 요청에 access_token이 필요하기 때문입니다.

그리고 oauth 인증방식에서 access_token유무, access_token유효성 검증등으로 로그인 여부를 판단합니다. 공개되어 있는 oauth용 라이브러리를 이용하면 페이스북과 구글플러스 로그인을 이용할 수가 있는데 네이버는 약간 방식이 달라서 추후 네이버를 추가해서 공개하겠습니다.

이제 받은 access_token을 가지고 토큰을 검증할겸 네이버 사용자 확인값(enc_id)를 가져와보겠습니다. 여기가 페북이나 구플방식과 조금 다릅니다. 헤더에 access_token을 넣어서 전송을 합니다. 보안때문인 것 같은데 조금 삽질을 했네요.
 

$access_token = '위에서 받은 access_token';

//해시정보를 요청하는 주소입니다.
$page = 'https://apis.naver.com/nidlogin/nid/getHashId_v2.xml';

//헤더에 access_token을 담는 부분입니다. 
$headers = array(
    "Authorization: Bearer " . $access_token
);

//curl을 이용하여 전송합니다.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$page);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
ob_start();
curl_exec($ch);

//화면에 출력되는 xml을 변수에 담습니다.
$data0 = ob_get_contents();
curl_close($ch);
//xml파싱
$xml = simplexml_load_string($data0,'SimpleXMLElement', LIBXML_NOCDATA);

//이 아이디가 나온다는 의미는 access_token이 유효하기 때문에 그에 해당하는 정보를 돌려준거라 access_token을 검증하는 의미입니다.
echo $xml->response[0]->enc_id[0];
        

명세문서 참고하여 작업하시면 됩니다.
http://developer.naver.com/wiki/pages/NaverLogin_spec#section-NaverLogin_spec-6.1_EB_84_A4_EC_9D_B4_EB_B2_84_EC_82_AC_EC_9A_A9_EC_9E_90_EA_B8_B0_EB_B3_B8_EC_A0_95_EB_B3_B4_EC_A1_B0_ED_9A_8C_EC_9D_B8_EC_A6_9D_EC_9A_94_EC_B2_AD_EB_AC_B8_EB_AA_85_EC_84_B8








 

 다음글 mod_rewrite 간략 정리본 (4)
 이전글 ci에서 ajax의 csrf_protection 회피(... (2)

댓글

한대승(불의회상) / 2014/10/07 07:57:10 / 추천 0
와우.. 정리되어 공개될 oauth 라이브러리가 기대 되는데요.
좋은 정보 감사 합니다.
고생 하셨습니다. ^^
변종원(웅파) / 2014/10/07 09:48:04 / 추천 0
한대승/ 라이브러리는 언제 될지 아무도 몰라요. ㅎㅎㅎ
들국화 / 2014/10/07 09:49:07 / 추천 0
감사합니다.  ^^
코드이그 / 2014/10/07 12:07:47 / 추천 0
오... 두근두근 하네요 제목만 봐도 ㅋㅋ
케이든 / 2014/10/07 16:25:00 / 추천 0
좋은 정보 감사합니다