Source for file NAVER.php
Documentation is available at NAVER.php
* Project: NAVER :: 네이버 로그인(oauth2) pear package<br>
* - {@link http://pear.oops.org/docs/li_HTTPRelay.html oops/HTTPRelay}
* - {@link http://pear.oops.org/docs/li_myException.html oops/myException}
* - {@link http://kr1.php.net/manual/en/book.curl.php curl extension}
* oops/NAVER pear package는
* {@link http://developer.naver.com/wiki/pages/NaverLogin 네이버 아이디로 로그인}
* 을 pear package로 구현을 한 것이다.
* {@link http://developer.naver.com/wiki/pages/NaverLogin 네이버 아이디로 로그인}은
* {@link http://developer.naver.com/wiki/pages/OAuth2 네이버 OAuth}와는 다른 API로서
* 로그인 사용자의 개인 식별 정보를 활용할 수 있으며, OAuth2 방식으로 구현이 되어있다.
* 이 package를 사용하기 위해서는 먼저 Naver에서 ClientID와 ClientSecret을 발급받아야
* 한다. http://developer.naver.com/wiki/pages/NaverLogin 를 참고하라.
* oops/NAVER pear package는 더이상 개발되지 않습니다.
* {@link http://pear.oops.org/docs/li_oops-OAUTH2.html oops/OAUTH2 package}를
* @author JoungKyun.Kim <http://oops.org>
* @copyright (c) 2018, OOPS.org
* @link http://pear.oops.org/package/NAVER
* @since File available since release 1.0.0
* @example NAVER/tests/test.php NAVER pear package 예제 코드
require_once 'HTTPRelay.php';
* Naver pear pcakge의 main class
* OAuth2를 이용하여 네이버 로그인을 진행하고, 로그인된 사용자의
* oops/NAVER pear package는 더이상 개발되지 않습니다.
* {@link http://pear.oops.org/docs/li_oops-OAUTH2.html oops/OAUTH2 package}를
* @author JoungKyun.Kim <http://oops.org>
* @copyright (c) 2018, OOPS.org
* @link http://pear.oops.org/package/NAVER
* @since File available since release 1.0.0
* @example NAVER/tests/test.php NAVER pear 예제 코드
private $sessid = 'NaverOauth';
private $reqAuth = 'https://nid.naver.com/oauth2.0/authorize';
private $reqToken = 'https://nid.naver.com/oauth2.0/token';
private $reqUser = 'https://apis.naver.com/nidlogin/nid/getUserProfile.xml';
* @var stdClass memebr는 다음과 같음
* - id : Naver login CliendID key
* - secret : Naver login ClientSecret key
* - callback : 이 class를 호출하는 페이지
// {{{ +-- public (void) __construct ($v)
* Naver 로그인 인증 과정을 수행한다. 인증 과정 중에
* 에러가 발생하면 myException 으로 에러 메시지를
* - id 발급받은 Naver login ClientID key
* - secret 발급받은 Naver login ClientScret key
* - callback 이 클래스가 호출되는 url
if ( ! isset ($_SESSION[$this->sessid]) ) {
$_SESSION[$this->sessid] = new stdClass;
$_SESSION[$this->sessid]->appId = (object) $v;
$this->sess = &$_SESSION[$this->sessid];
$this->consumer = (object) $v;
if ( isset ($_GET['logout']) ) {
$this->reqAccessToken ();
// {{{ +-- private (string) mkToken (void)
private function mkToken () {
return md5 ($mt . $rand);
// {{{ +-- private (void) reqLogin (void)
private function reqLogin () {
$cons = &$this->consumer;
$this->sess->state = $this->mkToken ();
if ( $_GET['code'] || isset ($this->sess->oauth) )
'%s?client_id=%s&response_type=code&redirect_uri=%s&state=%s',
Header ('Location: ' . $url);
// {{{ +-- private (void) reqAccessToken (void)
* Authorization code를 발급받아 session에 등록
* NAVER::$sess->oauth 를 stdClass로 생성하고 다음의
* - access_token: 발급받은 access token. expires_in(초) 이후 만료
* - refresh_token: access token 만료시 재발급 키 (14일 expire)
* - token_type: Bearer or MAC
* - expires_in: access token 유효시간(초)
* - error_description: error 상세값
private function reqAccessToken () {
$cons = &$this->consumer;
if ( ! $_GET['code'] || isset ($sess->oauth) )
'%s?client_id=%s&client_secret=%s&grant_type=authorization_code&state=%s&code=%s',
$this->reqToken, $cons->id, $cons->secret, $sess->state, $_GET['code']
$buf = $http->fetch ($url);
$this->error ($r->error_description);
$sess->oauth = (object) $r;
// {{{ +-- private (void) checkError (void)
private function checkError () {
$this->error ($_GET['error_description']);
if ( $_GET['state'] && $_GET['state'] != $sess->state )
$this->error ('Invalude Session state: ' . $_GET['state']);
// {{{ +-- private (void) error ($msg)
private function error ($msg) {
$msg = $_SERVER['HTTP_REFERER'] . "\n" . $msg;
// {{{ +-- public (stdClass) getUser (void)
* 로그인 과정이 완료되면 발급받은 NAVER::$sess->oauth 에 등록된
* 키를 이용하여 로그인 사용자의 정보를 가져온다.
* @return stdClass 다음의 object를 반환
* - email 이메일(ID@naver.com)
* - gender 성별 (F:여성/M:남성/U:확인불가)
* - birth 생일 (MM-DD 형식으로 반환)
if ( ! isset ($sess->oauth) )
$req = $sess->oauth->token_type . ' ' . $sess->oauth->access_token;
$header = array ('Authorization' => $req);
$buf = $http->fetch ($this->reqUser);
if ( $xml->result->resultcode != '00' )
$this->error ($r->result->message);
'id' => (string) $xmlr->enc_id->{0},
'name' => (string) $xmlr->nickname->{0},
'email' => (string) $xmlr->email->{0},
'gender' => (string) $xmlr->gender->{0},
'age' => (string) $xmlr->age->{0},
'birth' => (string) $xmlr->birthday,
'img' => (string) $xmlr->profile_image
// {{{ +-- public (void) reqLogout (void)
* 네이버 로그인의 authorization key를 만료 시키고
* 세션에 등록된 정보(NAVER::$sess)를 제거한다.
$cons = &$this->consumer;
if ( ! isset ($sess->oauth) )
// guide에는 refresh_token을 넣으라고 되어 있는데,
// 실제로는 access_token을 넣어야 한다.
'%s?grant_type=delete&client_id=%s&client_secret=%s&' .
'access_token=%s&service_provider=NAVER',
$this->reqToken, $cons->id, $cons->secret, $sess->oauth->access_token
$buf = $http->fetch ($url);
$this->error ($r->error_description);
unset ($_SESSION[$this->sessid]);
* vim600: noet sw=4 ts=4 fdm=marker
* vim<600: noet sw=4 ts=4
|