728x90
반응형
출처 : https://github.com/rawady/NaverLogin-for-PHP/blob/master/php/Naver.php
rawady/NaverLogin-for-PHP
NaverLogin-for-PHP - [PHP] 네이버 아이디로 로그인-웹 라이브러리
github.com
<? | |
/** | |
* Naver 로그인 Api Class 0.06 | |
* class : NaverAPI | |
* Author : Rawady corp. Jung Jintae | |
* date : 2014.5.11 | |
* https://github.com/rawady/NaverLogin | |
! required PHP 5.x Higher | |
! required curl enable | |
* | |
* 본 클래스는 네이버 공식 라이브러리가 아닙니다. | |
* NHN API Reference : http://developer.naver.com/wiki/pages/NaverLogin_Web | |
The MIT License (MIT) | |
Copyright (c) 2014 Jung Jintae | |
Permission is hereby granted, free of charge, to any person obtaining a copy | |
of this software and associated documentation files (the "Software"), to deal | |
in the Software without restriction, including without limitation the rights | |
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
copies of the Software, and to permit persons to whom the Software is | |
furnished to do so, subject to the following conditions: | |
The above copyright notice and this permission notice shall be included in all | |
copies or substantial portions of the Software. | |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
SOFTWARE. | |
*/ | |
/** | |
0.06 변경 | |
- ssl 오류 수정 | |
- 일부 치명적인 오류 수정 | |
0.4 포함됨 | |
- 인증 요청 | |
- 엑세스토큰 획득 | |
- 사용자 정보 취득 | |
- 로그아웃 | |
*/ | |
define( NAVER_OAUTH_URL, "https://nid.naver.com/oauth2.0/" ); | |
define( NAVER_SESSION_NAME, "NHN_SESSION" ); | |
@session_start(); | |
class Naver{ | |
private $tokenDatas = array(); | |
private $access_token = ''; // oauth 엑세스 토큰 | |
private $refresh_token = ''; // oauth 갱신 토큰 | |
private $access_token_type = ''; // oauth 토큰 타입 | |
private $access_token_expire = ''; // oauth 토큰 만료 | |
private $client_id = ''; // 네이버에서 발급받은 클라이언트 아이디 | |
private $client_secret = ''; // 네이버에서 발급받은 클라이언트 시크릿키 | |
private $returnURL = ''; // 콜백 받을 URL ( 네이버에 등록된 콜백 URI가 우선됨) | |
private $state = ''; // 네이버 명세에 필요한 검증 키 (현재 버전 라이브러리에서 미검증) | |
private $loginMode = 'request'; // 라이브러리 작동 상태 | |
private $returnCode = ''; // 네이버에서 리턴 받은 승인 코드 | |
private $returnState = ''; // 네이버에서 리턴 받은 검증 코드 | |
private $nhnConnectState = false; | |
// action options | |
private $autoClose = true; | |
private $showLogout = true; | |
private $curl = NULL; | |
private $drawOptions = array( "type" => "normal", "width" => "200" ); | |
function __construct($argv = array()) { | |
if ( ! in_array ('curl', get_loaded_extensions())) { | |
echo 'curl required'; | |
return false; | |
} | |
if($argv['CLIENT_ID']){ | |
$this->client_id = trim($argv['CLIENT_ID']); | |
} | |
if($argv['CLIENT_SECRET']){ | |
$this->client_secret = trim($argv['CLIENT_SECRET']); | |
} | |
if($argv['RETURN_URL']){ | |
$this->returnURL = trim(urlencode($argv['RETURN_URL'])); | |
} | |
if($argv['AUTO_CLOSE'] == false){ | |
$this->autoClose = false; | |
} | |
if($argv['SHOW_LOGOUT'] == false){ | |
$this->showLogout = false; | |
} | |
$this->loadSession(); | |
if(isset($_GET['nhnMode']) && $_GET['nhnMode'] != ''){ | |
$this->loginMode = 'logout'; | |
$this->logout(); | |
} | |
if($this->getConnectState() == false){ | |
$this->generate_state(); | |
if($_GET['state'] && $_GET['code']){ | |
$this->loginMode = 'request_token'; | |
$this->returnCode = $_GET['code']; | |
$this->returnState = $_GET['state']; | |
$this->_getAccessToken(); | |
} | |
} | |
} | |
function login($options = array()){ | |
if(isset($options['type'])){ | |
$this->drawOptions['type'] = $options['type']; | |
} | |
if(isset($options['width'])){ | |
$this->drawOptions['width'] = $options['width']; | |
} | |
if($this->loginMode == 'request' && (!$this->getConnectState()) || !$this->showLogout){ | |
echo '<a href="javascript:loginNaver();"><img src="https://www.rawady.com:5014/open/idn/naver_login.png" alt="네이버 아이디로 로그인" width="'.$this->drawOptions['width'].'"></a>'; | |
echo ' | |
<script> | |
function loginNaver(){ | |
var win = window.open(\''.NAVER_OAUTH_URL.'authorize?client_id='.$this->client_id.'&response_type=code&redirect_uri='.$this->returnURL.'&state='.$this->state.'\', \'네이버 아이디로 로그인\',\'width=320, height=480, toolbar=no, location=no\'); | |
var timer = setInterval(function() { | |
if(win.closed) { | |
window.location.reload(); | |
} | |
}, 500); | |
} | |
</script> | |
'; | |
}else if($this->getConnectState()){ | |
if($this->showLogout){ | |
echo '<a href="http://'.$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"].'?nhnMode=logout"><img src="https://www.rawady.com:5014/open/idn/naver_logout.png" width="'.$this->drawOptions['width'].'" alt="네이버 아이디 로그아웃"/></a>'; | |
} | |
} | |
if($this->loginMode == 'request_token'){ | |
$this->_getAccessToken(); | |
} | |
} | |
function logout(){ | |
$this->curl = curl_init(); | |
curl_setopt($this->curl, CURLOPT_URL, NAVER_OAUTH_URL.'token?client_id='.$this->client_id.'&client_secret='.$this->client_secret.'&grant_type=delete&refresh_token='.$this->refresh_token.'&sercive_provider=NAVER'); | |
curl_setopt($this->curl, CURLOPT_POST, 1); | |
curl_setopt($this->curl, CURLOPT_POSTFIELDS, $data); | |
curl_setopt($this->curl, CURLOPT_RETURNTRANSFER,true); | |
$retVar = curl_exec($this->curl); | |
curl_close($this->curl); | |
$this->deleteSession(); | |
echo "<script>window.location.href = 'http://".$_SERVER["HTTP_HOST"] . $_SERVER['PHP_SELF']."';</script>"; | |
} | |
function getUserProfile($retType = "JSON"){ | |
if($this->getConnectState()){ | |
$data = array(); | |
$data['Authorization'] = $this->access_token_type.' '.$this->access_token; | |
$this->curl = curl_init(); | |
curl_setopt($this->curl, CURLOPT_URL, 'https://apis.naver.com/nidlogin/nid/getUserProfile.xml'); | |
curl_setopt($this->curl, CURLOPT_POST, 1); | |
curl_setopt($this->curl, CURLOPT_POSTFIELDS, $data); | |
curl_setopt($this->curl, CURLOPT_HTTPHEADER, array( | |
'Authorization: '.$data['Authorization'] | |
)); | |
curl_setopt($this->curl, CURLOPT_RETURNTRANSFER,true); | |
$retVar = curl_exec($this->curl); | |
curl_close($this->curl); | |
if($retType == "JSON"){ | |
$xml = new SimpleXMLElement($retVar); | |
$xmlJSON = array(); | |
$xmlJSON['result']['resultcode'] = (string) $xml->result[0]->resultcode[0]; | |
$xmlJSON['result']['message'] = (string) $xml->result[0]->message[0]; | |
if($xml->result[0]->resultcode == '00'){ | |
foreach($xml->response->children() as $response => $k){ | |
$xmlJSON['response'][(string)$response] = (string) $k; | |
} | |
} | |
return json_encode($xmlJSON); | |
}else{ | |
return $retVar; | |
} | |
}else{ | |
return false; | |
} | |
} | |
/** | |
* Get AccessToken | |
* 발급된 엑세스 토큰을 반환합니다. 엑세스 토큰 발급은 로그인 후 자동으로 이루어집니다. | |
*/ | |
function getAccess_token(){ | |
if($this->access_token){ | |
return $this->access_token; | |
} | |
} | |
/** | |
* 네이버 연결상태를 반환합니다. | |
* 엑세스 토큰 발급/저장이 이루어진 후 connected 상태가 됩니다. | |
*/ | |
function getConnectState(){ | |
return $this->nhnConnectState; | |
} | |
private function updateConnectState($strState = ''){ | |
$this->nhnConnectState = $strState; | |
} | |
/** | |
* 토근을 세션에 기록합니다. | |
*/ | |
private function saveSession(){ | |
if(isset($_SESSION) && is_array($_SESSION)){ | |
$_saveSession = array(); | |
$_saveSession['access_token'] = $this->access_token; | |
$_saveSession['access_token_type'] = $this->access_token_type; | |
$_saveSession['refresh_token'] = $this->refresh_token; | |
$_saveSession['access_token_expire'] = $this->access_token_expire; | |
$this->tokenDatas = $_saveSession; | |
foreach($_saveSession as $k=>$v){ | |
$_SESSION[NAVER_SESSION_NAME][$k] = $v; | |
} | |
} | |
} | |
private function deleteSession(){ | |
if(isset($_SESSION) && is_array($_SESSION) && $_SESSION[NAVER_SESSION_NAME]){ | |
$_loadSession = array(); | |
$this->tokenDatas = $_loadSession; | |
unset($_SESSION[NAVER_SESSION_NAME]); | |
$this->access_token = ''; | |
$this->access_token_type = ''; | |
$this->refresh_token = ''; | |
$this->access_token_expire = ''; | |
$this->updateConnectState(false); | |
} | |
} | |
/** | |
* 저장된 토큰을 복원합니다. | |
*/ | |
private function loadSession(){ | |
if(isset($_SESSION) && is_array($_SESSION) && $_SESSION[NAVER_SESSION_NAME]){ | |
$_loadSession = array(); | |
$_loadSession['access_token'] = $_SESSION[NAVER_SESSION_NAME]['access_token'] ? $_SESSION[NAVER_SESSION_NAME]['access_token'] : ''; | |
$_loadSession['access_token_type'] = $_SESSION[NAVER_SESSION_NAME]['access_token_type'] ? $_SESSION[NAVER_SESSION_NAME]['access_token_type'] : ''; | |
$_loadSession['refresh_token'] = $_SESSION[NAVER_SESSION_NAME]['refresh_token'] ? $_SESSION[NAVER_SESSION_NAME]['refresh_token'] : ''; | |
$_loadSession['access_token_expire'] = $_SESSION[NAVER_SESSION_NAME]['access_token_expire'] ? $_SESSION[NAVER_SESSION_NAME]['access_token_expire']:''; | |
$this->tokenDatas = $_loadSession; | |
$this->access_token = $this->tokenDatas['access_token']; | |
$this->access_token_type = $this->tokenDatas['access_token_type']; | |
$this->refresh_token = $this->tokenDatas['refresh_token']; | |
$this->access_token_expire = $this->tokenDatas['access_token_expire']; | |
$this->updateConnectState(true); | |
$this->saveSession(); | |
} | |
} | |
private function _getAccessToken(){ | |
$this->curl = curl_init(); | |
curl_setopt($this->curl, CURLOPT_URL, NAVER_OAUTH_URL.'token?client_id='.$this->client_id.'&client_secret='.$this->client_secret.'&grant_type=authorization_code&code='.$this->returnCode.'&state='.$this->returnState); | |
curl_setopt($this->curl, CURLOPT_POST, 1); | |
curl_setopt($this->curl, CURLOPT_POSTFIELDS, $data); | |
curl_setopt($this->curl, CURLOPT_RETURNTRANSFER,true); | |
$retVar = curl_exec($this->curl); | |
curl_close($this->curl); | |
$NHNreturns = json_decode($retVar); | |
if(isset($NHNreturns->access_token)){ | |
$this->access_token = $NHNreturns->access_token; | |
$this->access_token_type = $NHNreturns->token_type; | |
$this->refresh_token = $NHNreturns->refresh_token; | |
$this->access_token_expire = $NHNreturns->expires_in; | |
$this->updateConnectState(true); | |
$this->saveSession(); | |
if($this->autoClose){ | |
echo "<script>window.close();</script>"; | |
} | |
} | |
} | |
private function generate_state() { | |
$mt = microtime(); | |
$rand = mt_rand(); | |
$this->state = md5( $mt . $rand ); | |
} | |
} |
Class 초기화
$naver = new Naver(array(
"CLIENT_ID" => "USER_CLIENT_ID", // (*필수)클라이언트 ID
"CLIENT_SECRET" => "USER_CLIENT_SECRET", // (*필수)클라이언트 시크릿
"RETURN_URL" => "USER_RETURN_URL", // (*필수)콜백 URL
"AUTO_CLOSE" => false, // 인증 완료후 팝업 자동으로 닫힘 여부 설정 (추가 정보 기재등 추가행동 필요시 false 설정 후 추가)
"SHOW_LOGOUT" => false // 인증 후에 네이버 로그아웃 버튼 표시/ 또는 표시안함
)
);
로그인 버튼 생성
로그인 버튼은 네이버 공식 이미지로 저희 서버에서 재전송됩니다. 로그인 상태에서는 로그아웃 버튼이 표시됩니다.
// $naver->login();
<div class="login_box">
<?=$naver->login()?>
</div>
// 로그인 버튼 크기변경시
$naver->login(array(
"width"=>"200"
));
사용자 정보 취득
사용자 정보는 로그인 및 인증 완료상태에서만, 작동합니다. 네이버에서 제공되는 XML 을 JSON 으로 인코딩하여 반환합니다.
(optional) $naver->getUserProfile((string) return type(JSON, XML));
// Default : json 반환
// XML 반환시 : $naver->getUserProfile('XML');
//
출처 : http://blog.publisher.name/499
PHP 클래스로 구현한 네이버 로그인 API
힘겹게(?) 찾은 개발 가이드 문서, Sample Code 그리고 하코사 미루님이 하코사에 올려둔 글을 참고하여 하나의 클래스에 담아서 만들었다.
blog.publisher.name
[출처] [php] 네이버 로그인 api 누군가 만들어 놓으신거|작성자 노력쟁이 학제
728x90
반응형
'오픈소스 > 소셜 로그인' 카테고리의 다른 글
소셜 로그인, 그리고 복습 (0) | 2015.04.07 |
---|---|
Facebook - Authentication (0) | 2015.04.07 |