제목 | 간단한 소셜 라이브러리 입니다. | ||
---|---|---|---|
글쓴이 | 천재작곡가 | 작성시각 | 2016/11/18 17:40:17 |
|
|||
딱 회원프로필까지만 받아오는 라이브러리입니다. 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
우와, 소중한 자료 감사합니다~ :)
|
소중한 코드 감사 합니다.
유용하게 사용하겠습니다.