CI =& get_instance(); $this->CI->load->helper('url'); $this->CI->load->library('session'); $this->social_provider = strtolower(get_called_class()); $this->social_setting = new stdClass(); $this->social_setting->client_id = NULL; $this->social_setting->client_secret = NULL; $this->social_setting->redirect_url = NULL; $this->social_setting->authorize_url = NULL; $this->social_setting->token_url = NULL; $this->social_setting->info_url = NULL; $this->social_setting->token_request_post = NULL; } function get_profile() { if( empty($this->social_provider) OR empty($this->social_setting->client_id) ) { return FALSE; } 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 $this->_generate_profile($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(); } } protected function _generate_profile($profile) { return $profile; } /** * 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_url; 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_url; 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; } }