ci =& get_instance(); $this->ci->load->library('session'); $this->ci->config->load('facebook'); $this->ci->load->helper('url'); if (! isset($_SESSION)) { session_start(); } $this->facebook_default_scope = explode(',', $this->ci->config->item("facebook_default_scope")); $facebook_app_id = $this->ci->config->item("facebook_app_id"); $facebook_app_secret = $this->ci->config->item("facebook_app_secret"); $this->facebook_login_url = base_url() . $this->ci->config->item("facebook_login_redirect_url").'/'; $this->facebook_logout_url = base_url() . $this->ci->config->item("facebook_logout_redirect_url").'/'; // init app with app id and secret $this->fb = new Facebook([ 'app_id' => $facebook_app_id, // Replace {app-id} with your app id 'app_secret' => $facebook_app_secret, 'default_graph_version' => 'v2.2', ]); $this->helper = $this->fb->getRedirectLoginHelper(); } /** * @return FB */ public function object() { return $this->fb; } /** * Check if user are logged in by checking if we have a Facebook * session active. * * @return mixed|boolean */ public function is_authenticated() { $access_token = $this->authenticate(); if (isset($access_token)) { return $access_token; } return false; } /** * Destroy our local Facebook session */ public function destroy_session() { $this->session->unset_userdata('fb_access_token'); } public function getLoginUrl() { return $this->helper->getLoginUrl($this->facebook_login_url, $this->facebook_default_scope); } public function getLogoutUrl() { return $this->helper->getLogoutUrl($this->get_access_token(), $this->facebook_logout_url); } public function get_access_token() { return $this->session->userdata('fb_access_token'); } /** * @return mixed */ private function get_expire_time() { return $this->session->userdata('fb_expire'); } /** * @param DateTime $time */ private function set_expire_time(DateTime $time = null) { if ($time) { $this->session->set_userdata('fb_expire', $time->getTimestamp()); } } public function authenticate() { $accessToken = $this->get_access_token(); if ($accessToken && $this->get_expire_time() > (time() + 30) || $accessToken && !$this->get_expire_time()) { $this->fb->setDefaultAccessToken($accessToken); return $accessToken; } // If we did not have a stored access token or if it has expired, try get a new access token try { $accessToken = $this->helper->getAccessToken($this->facebook_login_url); } catch(Facebook\Exceptions\FacebookResponseException $e) { // When Graph returns an error return $this->constructResult(NULL, 'Graph returned an error: ' . $e->getMessage()); } catch(Facebook\Exceptions\FacebookSDKException $e) { // When validation fails or other local issues return $this->constructResult(NULL, 'Facebook SDK returned an error: ' . $e->getMessage()); } if (! isset($accessToken)) { if ($this->helper->getError()) { /*header('HTTP/1.0 401 Unauthorized'); echo "Error: " . $helper->getError() . "\n"; echo "Error Code: " . $helper->getErrorCode() . "\n"; echo "Error Reason: " . $helper->getErrorReason() . "\n"; echo "Error Description: " . $helper->getErrorDescription() . "\n"; */ return $this->constructResult(NULL, 'Unauthorized: '.$this->helper->getErrorDescription()); } else { return $this->constructResult(NULL, 'Bad request'); } } // The OAuth 2.0 client handler helps us manage access tokens $oAuth2Client = $this->fb->getOAuth2Client(); // Get the access token metadata from /debug_token ///$tokenMetadata = $oAuth2Client->debugToken($accessToken); if (! $accessToken->isLongLived()) { // Exchanges a short-lived access token for a long-lived one try { $accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken); $this->set_expire_time($accessToken->getExpiresAt()); $this->set_access_token($accessToken); $this->fb->setDefaultAccessToken($accessToken); } catch (Facebook\Exceptions\FacebookSDKException $e) { return $this->constructResult(NULL, "
Error getting long-lived access token: " . $this->helper->getMessage() . "
\n\n"); } //var_dump($accessToken->getValue()); } $_SESSION['fb_access_token'] = (string) $accessToken; return $accessToken; } public function getData($accessToken) { $user = NULL; try { // Returns a `Facebook\FacebookResponse` object if ($accessToken!="") { $response = $this->fb->get('/me?fields=id,name,email', $accessToken); $user = $response->getGraphUser(); } } catch(Facebook\Exceptions\FacebookResponseException $e) { return $this->constructResult(NULL,'Graph returned an error: ' . $e->getMessage()); } catch(Facebook\Exceptions\FacebookSDKException $e) { return $this->constructResult(NULL,'Facebook SDK returned an error: ' . $e->getMessage()); } return $this->constructResult($user, NULL); } private function constructResult($me,$error) { $fb_data = array( 'me' => $me, 'error' => $error ); $this->ci->session->set_userdata('fb_data', $fb_data); return $fb_data; } /** * Enables the use of CI super-global without having to define an extra variable. * I can't remember where I first saw this, so thank you if you are the original author. * * Borrowed from the Ion Auth library (http://benedmunds.com/ion_auth/) * * @param $var * * @return mixed */ public function __get($var) { return get_instance()->$var; } }