| 제목 | 간단한 소셜 라이브러리 입니다. | ||
|---|---|---|---|
| 글쓴이 | 천재작곡가 | 작성시각 | 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
우와, 소중한 자료 감사합니다~ :)
|
소중한 코드 감사 합니다.
유용하게 사용하겠습니다.