TIP게시판

제목 간단한 소셜 라이브러리 입니다.
글쓴이 천재작곡가 작성시각 2016/11/18 17:40:17
댓글 : 4 추천 : 0 스크랩 : 2 조회수 : 21137   RSS

딱 회원프로필까지만 받아오는 라이브러리입니다.

Social_login 이라는 부모 클래스가 있고

Naver_login, Facebook_login, Google_login, Kakao_login 이 Social_login 을 상속받아 사용합니다.

개인 홈페이지에 소셜로그인 달려고 간단하게 만들었습니다.

 

@ application/config/social_login.php

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
 * SOCIAL Setting
 **/
$config['naver_login']['client_id'] 		= "네아로 클라이언트 ID";
$config['naver_login']['client_secret'] 	= "네아로 클라이언트 secret";
$config['naver_login']['redirect_uri']	= "네아로 Redirect URI";
$config['naver_login']['authorize_url']	= "https://nid.naver.com/oauth2.0/authorize";
$config['naver_login']['token_url']		= "https://nid.naver.com/oauth2.0/token";
$config['naver_login']['info_url']		= "https://openapi.naver.com/v1/nid/me";
$config['naver_login']['token_request_post'] = FALSE;


$config['facebook_login']['client_id']	= "페이스북 앱 ID";		// 페이스북 앱 ID 입력
$config['facebook_login']['client_secret']= "페이스북 앱 시크릿";	// 페이스북 앱 시크릿 코드 
$config['facebook_login']['redirect_uri']	= "페이스북 Redirect URI";
$config['facebook_login']['authorize_url']= "https://www.facebook.com/dialog/oauth";
$config['facebook_login']['token_url']	= "https://graph.facebook.com/v2.4/oauth/access_token";
$config['facebook_login']['info_url']		= "https://graph.facebook.com/v2.4/me";
$config['facebook_login']['token_request_post'] = FALSE;

$config['kakao_login']['client_id']		= "카카오 로그인 REST API KEY";	// REST API 키를 입력
$config['kakao_login']['client_secret']	= "";	// 카카오는 Client Secret을 사용하지 않습니다. 공백으로 지정
$config['kakao_login']['redirect_uri']	= "";
$config['kakao_login']['authorize_url']	= "https://kauth.kakao.com/oauth/authorize";
$config['kakao_login']['token_url']		= "https://kauth.kakao.com/oauth/token";
$config['kakao_login']['info_url']		= "https://kapi.kakao.com/v1/user/me";
$config['kakao_login']['token_request_post'] = FALSE;

$config['google_login']['client_id']		= "구글 클라이언트 ID";
$config['google_login']['client_secret']	= "구글 클라이언트 시크릿";
$config['google_login']['redirect_uri']		= "";
$config['google_login']['authorize_url']	= "https://accounts.google.com/o/oauth2/auth";
$config['google_login']['token_url']		= "https://www.googleapis.com/oauth2/v4/token";
$config['google_login']['info_url']			= "https://www.googleapis.com/plus/v1/people/me";
$config['google_login']['token_request_post'] = TRUE;

 

@ application/libraries/Social_login.php

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Social_login {
	
	protected $CI;
	protected $social_provider;
	protected $social_setting;
	
	function __construct()
	{
		$this->CI =& get_instance();
		
		$this->CI->load->helper('url');
		$this->CI->load->library('session');
		$this->CI->load->config('social_login');
		
		$this->social_provider = strtolower(get_called_class());
		$this->social_setting = $this->CI->config->item( $this->social_provider );
	}
	
	function get_profile()
	{
		if($code = $this->CI->input->get("code", TRUE) ) 
		{
			// AccessToken을 요청하고 받은값이 없으면 종료
			if(! $access_token_array = $this->_get_access_token($code) ) exit("Failed to get Access Token");
			if( isset($access_token_array['error']) && $access_token_array['error'] ) {
				exit("Failed to get Access Token : ".$access_token_array['error']);
			}
			if(! $profile = $this->_get_info($access_token_array['access_token'])) exit("Failed to get User Info");
			
			return $profile;
		}
		else
		{
			if( $error = $this->CI->input->get('error', TRUE) )
			{
				// 코드를 받지 못한상태인데 Error GET값이 잇을경우
				echo "error : " . $this->CI->input->get('error', TRUE) . PHP_EOL;
				echo "error_descrption : ". $this->CI->input->get('error_description', TRUE);
				exit();
			}
			// oAuth 인증코드를 받지못한경우 
			// 로그인 처리후 이동할 페이지를 세션으로 저장해 둡니다. 
			$reurl = $this->CI->input->get('reurl', TRUE) ? $this->CI->input->get('reurl', TRUE) : base_url();
			$this->CI->session->set_userdata('reurl', $reurl);			
			// oAuth Code를 받기위해 이동한다.
			$this->_redirect_authorize();
		}
	}
	
	/**
	 * oAuth 코드를 받아올때 필요한 패러미터를 가져온다.
	 */
	protected function _get_authorize_param() {
		
		$param = array();	
		$param['response_type'] = "code";
		$param['client_id'] = $this->social_setting['client_id'];
		$param['redirect_uri'] = $this->social_setting['redirect_uri'];
		
		return $param;
	}
	
	/**
	 * Access Token 을 얻기위해 넘겨야할 패러미터를 가져온다.
	 */
	protected function _get_token_param($code) {
		$param = array();
		
		$param['grant_type'] = "authorization_code";
		$param['code'] = $code;
		$param['state'] = $this->CI->session->userdata($this->social_provider."_state");
		$param['client_id'] = $this->social_setting['client_id'];
		$param['client_secret'] = $this->social_setting['client_secret'];
		$param['redirect_uri'] = $this->social_setting['redirect_uri'];
		
		return $param;
	}
	
	/**
	 * oAuth 인증절차
	 */
	protected function _redirect_authorize() 
	{		
		// State 값을 만들고, Session에 저장해둡니다.
		$state = md5(microtime().mt_rand());
		$this->CI->session->set_userdata( $this->social_provider."_state", $state);
		
		// 만든 State 값을 parameter에 추가한다.
		$param = $this->_get_authorize_param();
		$param['state'] = $state;
				
		// 요청 페이지 고고씽
		redirect($this->social_setting['authorize_url'].'?'.http_build_query($param));
		exit;
	}
	
	/**
	 * Curl을 통해 AccessToken을 얻어옵니다.
	 */
	protected function _get_access_token($code) 
	{
		$param = $this->_get_token_param($code);
		$this->social_setting['token_url'] .= ( $this->social_setting['token_request_post'] ) ? '':'?'.http_build_query($param);
		$ch = curl_init();
		curl_setopt ($ch, CURLOPT_URL, $this->social_setting['token_url']); 
		curl_setopt ($ch, CURLOPT_POST, $this->social_setting['token_request_post']);
		if( $this->social_setting['token_request_post'] )
		{
			curl_setopt ($ch, CURLOPT_POSTFIELDS, http_build_query($param));
		}
		curl_setopt ($ch, CURLOPT_RETURNTRANSFER, TRUE);
				
		$result = curl_exec ($ch);
		$result_json = json_decode($result, TRUE);
		return $result_json;
	}
	
	/**
	 * 사용자 프로필 조회요청
	 */
	protected function _get_info($access_token, $add_param="")
	{
		if(empty($access_token) OR ! $access_token) return FALSE;
		
		$url = $this->social_setting['info_url'].$add_param;
		$header = array("Authorization: Bearer {$access_token}");
		$ch = curl_init(); 
		curl_setopt ($ch, CURLOPT_URL, $url);
		curl_setopt ($ch, CURLOPT_HTTPHEADER, $header);
		curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
		$result = curl_exec($ch);
		
		return $result;
	}	
}

 

@ application/libraries/Naver_login.php

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
require_once APPPATH . "libraries/Social_login.php";

class Naver_login extends Social_login {
	/**
	 * 사용자 프로필 받아오기
	 */
	protected function _get_info( $access_token, $add_param="" )
	{
		$result = json_decode(parent::_get_info($access_token), TRUE);
		
		if( $result['resultcode'] == '00') {
			return $result;
		}
		else {
			return NULL;
		}				
	}
}

 

@ application/libraries/Kakao_login.php

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
require_once APPPATH . "libraries/Social_login.php";

class Kakao_login extends Social_login {
	
	/**
	 * 사용자 프로필 받아오기
	 */
	protected function _get_info( $access_token, $add_param=""  )
	{
		$result = json_decode(parent::_get_info($access_token), TRUE);
		
		if( empty($result['id'] )) {
			return NULL;
		}
		else {
			return $result;
		}				
	}
	
}

 

@ application/libraries/Facebook_login.php

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
require_once APPPATH . "libraries/Social_login.php";

class Facebook_login extends Social_login {
	
	/**
	 * oAuth 코드를 받아올때 필요한 패러미터를 가져온다.
	 */
	protected function _get_authorize_param()
	{
		$param = parent::_get_authorize_param();
		$param['scope'] = "public_profile,email";
		return $param;
	}
	
	/**
	 * 사용자 프로필 받아오기
	 */
	protected function _get_info( $access_token, $add_param=""  )
	{
		$fields = 'id,name,picture.width(1000).height(1000),link,email,verified,about,website,birthday,gender';
		$add_param = sprintf('?access_token=%s&fields=%s',$access_token, $fields);
		
		$result = json_decode(parent::_get_info($access_token, $add_param), TRUE);
		print_r($result);
		
		if( $result['id'] ) {
			return $result;
		}
		else {
			return NULL;
		}				
	}
}

 

@ application/libraries/Google_login.php

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
require_once APPPATH . "libraries/Social_login.php";

class Google_login extends Social_login {
	
	protected function _get_authorize_param() {
		$scope_array = array(
			"https://www.googleapis.com/auth/plus.login",
			"https://www.googleapis.com/auth/userinfo.email",
			"https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/plus.me");
					
		$param = parent::_get_authorize_param();
		$param['access_type'] = "offline";
		$param['scope'] = implode(" ", $scope_array);
		
		return $param;
	}
	
}

 

@ 각 redirect URL에 해당하는 컨트롤러

class Login extends CI_Controller {
    public function naver()
	{
		$this->load->library("naver_login");
		$result = $this->naver_login->get_profile();
		
		print_r($result);
	}
	
	public function facebook()
	{
		$this->load->library("facebook_login");
		$result = $this->facebook_login->get_profile();
		
		print_r($result);
	}
	
	public function kakao()
	{
		$this->load->library("kakao_login");
		$result = $this->kakao_login->get_profile();
		
		print_r($result);
	}
	
	public function google()
	{
		$this->load->library("google_login");
		$result = $this->google_login->get_profile();
		
		print_r($result);
	}

}

 

 네이버로그인 redirect url 이 http://www.도메인.com/login/naver  로 설정했다면

위와같이 컨트롤러를 생성하면됩니다.

 

정말 말그대로 사용자 정보만 받아오는 것이며,

access_token 갱신이나 access_token 삭제가 없습니다.

얻어온 정보는 각 소셜사이트마다 다르게 리턴하므로,

print_r 로 찍혀진 데이타를 가공해서 용도에 맞게 사용해야 합니다.

 

Github : https://github.com/songwritersg/codeigniter-social-login

관련링크 https://github.com/songwritersg/codeigniter-social-login
 다음글 CI3 IE Session 정상 작동 안될 때 Tip (2)
 이전글 php를 잘 모르시는 퍼블리셔 분들과의 협업을 위한 소... (1)

댓글

한대승(불의회상) / 2016/11/21 17:26:06 / 추천 0

소중한 코드 감사 합니다.

유용하게 사용하겠습니다.

Dexter / 2016/11/22 03:35:38 / 추천 0

추후 작업떄 시간이 많이 단축될것 같네요.

감사합니다.

변종원(웅파) / 2016/11/22 09:40:26 / 추천 0
자료 감사합니다. ^^
하늘치 / 2016/11/22 15:58:56 / 추천 0
우와, 소중한 자료 감사합니다~ :)