CodeIgniter Laravel PHP Example Javascript jQuery MORE Videos New

How to Login with Facebook in CodeIgniter


Sql Table

 CREATE TABLE `users` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `oauth_provider` enum('facebook','google','twitter','') COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
 `oauth_uid` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 `first_name` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
 `last_name` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
 `email` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
 `gender` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
 `picture` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
 `link` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `created` datetime NOT NULL,
 `modified` datetime NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

autoload.php

$autoload['libraries'] = array('session','database');
$autoload['helper'] = array('url');

facebook.php

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

/*
| -------------------------------------------------------------------
|  Facebook API Configuration
| -------------------------------------------------------------------
|
| To get an facebook app details you have to create a Facebook app
| at Facebook developers panel (https://developers.facebook.com)
|
|  facebook_app_id               string   Your Facebook App ID.
|  facebook_app_secret           string   Your Facebook App Secret.
|  facebook_login_redirect_url   string   URL to redirect back to after login. (do not include base URL)
|  facebook_logout_redirect_url  string   URL to redirect back to after logout. (do not include base URL)
|  facebook_login_type           string   Set login type. (web, js, canvas)
|  facebook_permissions          array    Your required permissions.
|  facebook_graph_version        string   Specify Facebook Graph version. Eg v3.2
|  facebook_auth_on_load         boolean  Set to TRUE to check for valid access token on every page load.
*/
$config['facebook_app_id']                = 'Insert_Facebook_App_ID';
$config['facebook_app_secret']            = 'Insert_Facebook_App_Secret';
$config['facebook_login_redirect_url']    = 'user_authentication/';
$config['facebook_logout_redirect_url']   = 'user_authentication/logout';
$config['facebook_login_type']            = 'web';
$config['facebook_permissions']           = array('email');
$config['facebook_graph_version']         = 'v3.2';
$config['facebook_auth_on_load']          = TRUE;

Facebook.php

<?php 
defined('BASEPATH') OR exit('No direct script access allowed'); 
 
/** 
 * Facebook PHP SDK v5 for CodeIgniter 3.x 
 * 
 * Library for Facebook PHP SDK v5. It helps the user to login with their Facebook account 
 * in CodeIgniter application. 
 * 
 * This library requires the Facebook PHP SDK v5 and it should be placed in libraries folder. 
 * 
 * It also requires social configuration file and it should be placed in the config directory. 
 * 
 * @package     CodeIgniter 
 * @category    Libraries 
 * @author      CodexWorld 
 * @license     http://www.codexworld.com/license/ 
 * @link        http://www.codexworld.com 
 * @version     3.0 
 */ 
 
/* Include the autoloader provided in the SDK */
require_once APPPATH .'third_party/facebook-php-graph-sdk/autoload.php';  
 
use Facebook\Facebook as FB; 
use Facebook\Authentication\AccessToken; 
use Facebook\Exceptions\FacebookResponseException; 
use Facebook\Exceptions\FacebookSDKException; 
use Facebook\Helpers\FacebookJavaScriptHelper; 
use Facebook\Helpers\FacebookRedirectLoginHelper; 
Class Facebook 
{ 
    /** 
     * @var FB 
     */ 
    private $fb; 
    /** 
     * @var FacebookRedirectLoginHelper|FacebookJavaScriptHelper 
     */ 
    private $helper; 
 
    /** 
     * Facebook constructor. 
     */ 
    public function __construct(){ 
        /* Load fb config */
        $this->load->config('facebook'); 
        /* Load required libraries and helpers */
        $this->load->library('session'); 
        $this->load->helper('url'); 
        if (!isset($this->fb)){ 
            $this->fb = new FB([ 
                'app_id'                => $this->config->item('facebook_app_id'), 
                'app_secret'            => $this->config->item('facebook_app_secret'), 
                'default_graph_version' => $this->config->item('facebook_graph_version') 
            ]); 
        } 
        /* Load correct helper depending on login type */
        /* set in the config file */
        switch ($this->config->item('facebook_login_type')){ 
            case 'js': 
                $this->helper = $this->fb->getJavaScriptHelper(); 
                break; 
            case 'canvas': 
                $this->helper = $this->fb->getCanvasHelper(); 
                break; 
            case 'page_tab': 
                $this->helper = $this->fb->getPageTabHelper(); 
                break; 
            case 'web': 
                $this->helper = $this->fb->getRedirectLoginHelper(); 
                break; 
        } 
        if ($this->config->item('facebook_auth_on_load') === TRUE){ 
            /* Try and authenticate the user right away (get valid access token) */
            $this->authenticate(); 
        } 
    } 
     
    /** 
     * @return FB 
     */ 
    public function object(){ 
        return $this->fb; 
    } 
     
    /** 
     * Check whether the user is logged in. 
     * by access token 
     * 
     * @return mixed|boolean 
     */ 
    public function is_authenticated(){ 
        $access_token = $this->authenticate(); 
        if(isset($access_token)){ 
            return $access_token; 
        } 
        return false; 
    } 
     
    /** 
     * Do Graph request 
     * 
     * @param       $method 
     * @param       $endpoint 
     * @param array $params 
     * @param null  $access_token 
     * 
     * @return array 
     */ 
    public function request($method, $endpoint, $params = [], $access_token = null){ 
        try{ 
            $response = $this->fb->{strtolower($method)}($endpoint, $params, $access_token); 
            return $response->getDecodedBody(); 
        }catch(FacebookResponseException $e){ 
            return $this->logError($e->getCode(), $e->getMessage()); 
        }catch (FacebookSDKException $e){ 
            return $this->logError($e->getCode(), $e->getMessage()); 
        } 
    } 
     
    /** 
     * Generate Facebook login url for web 
     * 
     * @return  string 
     */ 
    public function login_url(){ 
        /* Login type must be web, else return empty string */
        if($this->config->item('facebook_login_type') != 'web'){ 
            return ''; 
        } 
        /* Get login url */
        return $this->helper->getLoginUrl( 
            base_url() . $this->config->item('facebook_login_redirect_url'), 
            $this->config->item('facebook_permissions') 
        ); 
    } 
     
    /** 
     * Generate Facebook logout url for web 
     * 
     * @return string 
     */ 
    public function logout_url(){ 
        /* Login type must be web, else return empty string */
        if($this->config->item('facebook_login_type') != 'web'){ 
            return ''; 
        } 
        /* Get logout url */
        return $this->helper->getLogoutUrl( 
            $this->get_access_token(), 
            base_url() . $this->config->item('facebook_logout_redirect_url') 
        ); 
    } 
     
    /** 
     * Destroy local Facebook session 
     */ 
    public function destroy_session(){ 
        $this->session->unset_userdata('fb_access_token'); 
    } 
     
    /** 
     * Get a new access token from Facebook 
     * 
     * @return array|AccessToken|null|object|void 
     */ 
    private function authenticate(){ 
        $access_token = $this->get_access_token(); 
        if($access_token && $this->get_expire_time() > (time() + 30) || $access_token && !$this->get_expire_time()){ 
            $this->fb->setDefaultAccessToken($access_token); 
            return $access_token; 
        } 
        /* If we did not have a stored access token or if it has expired, try get a new access token */
        if(!$access_token){ 
            try{ 
                $access_token = $this->helper->getAccessToken(); 
            }catch (FacebookSDKException $e){ 
                $this->logError($e->getCode(), $e->getMessage()); 
                return null; 
            } 
            /* If we got a session we need to exchange it for a long lived session. */
            if(isset($access_token)){ 
                $access_token = $this->long_lived_token($access_token); 
                $this->set_expire_time($access_token->getExpiresAt()); 
                $this->set_access_token($access_token); 
                $this->fb->setDefaultAccessToken($access_token); 
                return $access_token; 
            } 
        } 
        /* Collect errors if any when using web redirect based login */
        if($this->config->item('facebook_login_type') === 'web'){ 
            if($this->helper->getError()){ 
                /* Collect error data */
                $error = array( 
                    'error'             => $this->helper->getError(), 
                    'error_code'        => $this->helper->getErrorCode(), 
                    'error_reason'      => $this->helper->getErrorReason(), 
                    'error_description' => $this->helper->getErrorDescription() 
                ); 
                return $error; 
            } 
        } 
        return $access_token; 
    } 
     
    /** 
     * Exchange short lived token for a long lived token 
     * 
     * @param AccessToken $access_token 
     * 
     * @return AccessToken|null 
     */ 
    private function long_lived_token(AccessToken $access_token){ 
        if(!$access_token->isLongLived()){ 
            $oauth2_client = $this->fb->getOAuth2Client(); 
            try{ 
                return $oauth2_client->getLongLivedAccessToken($access_token); 
            }catch (FacebookSDKException $e){ 
                $this->logError($e->getCode(), $e->getMessage()); 
                return null; 
            } 
        } 
        return $access_token; 
    } 
     
    /** 
     * Get stored access token 
     * 
     * @return mixed 
     */ 
    private function get_access_token(){ 
        return $this->session->userdata('fb_access_token'); 
    } 
     
    /** 
     * Store access token 
     * 
     * @param AccessToken $access_token 
     */ 
    private function set_access_token(AccessToken $access_token){ 
        $this->session->set_userdata('fb_access_token', $access_token->getValue()); 
    } 
     
    /** 
     * @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()); 
        } 
    } 
     
    /** 
     * @param $code 
     * @param $message 
     * 
     * @return array 
     */ 
    private function logError($code, $message){ 
        log_message('error', '[FACEBOOK PHP SDK] code: ' . $code.' | message: '.$message); 
        return ['error' => $code, 'message' => $message]; 
    } 
     
    /** 
     * Enables the use of CI super-global without having to define an extra variable. 
     * 
     * @param $var 
     * 
     * @return mixed 
     */ 
    public function __get($var){ 
        return get_instance()->$var; 
    } 
}

User_authentication.php

<?php 
defined('BASEPATH') OR exit('No direct script access allowed'); 
 
class User_Authentication extends CI_Controller { 
    function __construct() { 
        parent::__construct(); 
         
        /* Load facebook oauth library */
        $this->load->library('facebook'); 
         
        /* Load user model */
        $this->load->model('user'); 
    } 
     
    public function index(){ 
        $userData = array(); 
         
        /* Authenticate user with facebook */
        if($this->facebook->is_authenticated()){ 
           /* Get user info from facebook */
            $fbUser = $this->facebook->request('get', '/me?fields=id,first_name,last_name,email,link,gender,picture'); 
 
            /* Preparing data for database insertion */
            $userData['oauth_provider'] = 'facebook'; 
            $userData['oauth_uid']    = !empty($fbUser['id'])?$fbUser['id']:'';; 
            $userData['first_name']    = !empty($fbUser['first_name'])?$fbUser['first_name']:''; 
            $userData['last_name']    = !empty($fbUser['last_name'])?$fbUser['last_name']:''; 
            $userData['email']        = !empty($fbUser['email'])?$fbUser['email']:''; 
            $userData['gender']        = !empty($fbUser['gender'])?$fbUser['gender']:''; 
            $userData['picture']    = !empty($fbUser['picture']['data']['url'])?$fbUser['picture']['data']['url']:''; 
            $userData['link']        = !empty($fbUser['link'])?$fbUser['link']:'https://www.facebook.com/'; 
             
            /* Insert or update user data to the database */
            $userID = $this->user->checkUser($userData); 
             
            /* Check user data insert or update status */
            if(!empty($userID)){ 
                $data['userData'] = $userData; 
                 
                /* Store the user profile info into session */
                $this->session->set_userdata('userData', $userData); 
            }else{ 
               $data['userData'] = array(); 
            } 
             
            /* Facebook logout URL */
            $data['logoutURL'] = $this->facebook->logout_url(); 
        }else{ 
            /* Facebook authentication url */
            $data['authURL'] =  $this->facebook->login_url(); 
        } 
         
        /* Load login/profile view */
        $this->load->view('user_authentication/index',$data); 
    } 
 
    public function logout() { 
        /* Remove local Facebook session */
        $this->facebook->destroy_session(); 
        /* Remove user data from session */
        $this->session->unset_userdata('userData'); 
        /* Redirect to login page */
        redirect('user_authentication'); 
    } 
}

User.php

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

class User extends CI_Model {
    function __construct() {
        $this->tableName = 'users';
        $this->primaryKey = 'id';
    }
    
    /*
     * Insert / Update facebook profile data into the database
     * @param array the data for inserting into the table
     */
    public function checkUser($userData = array()){
        if(!empty($userData)){
            /* check whether user data already exists in database with same oauth info */
            $this->db->select($this->primaryKey);
            $this->db->from($this->tableName);
            $this->db->where(array('oauth_provider'=>$userData['oauth_provider'], 'oauth_uid'=>$userData['oauth_uid']));
            $prevQuery = $this->db->get();
            $prevCheck = $prevQuery->num_rows();
            
            if($prevCheck > 0){
                $prevResult = $prevQuery->row_array();
                
                /* update user data */
                $userData['modified'] = date("Y-m-d H:i:s");
                $update = $this->db->update($this->tableName, $userData, array('id' => $prevResult['id']));
                
                /* get user ID */
                $userID = $prevResult['id'];
            }else{
                /* insert user data */
                $userData['created']  = date("Y-m-d H:i:s");
                $userData['modified'] = date("Y-m-d H:i:s");
                $insert = $this->db->insert($this->tableName, $userData);
                
                /* get user ID */
                $userID = $this->db->insert_id();
            }
        }
        
        /* return user ID */
        return $userID?$userID:FALSE;
    }
}

user_authentication/index.php

<!-- Display login button / Facebook profile information -->
<?php if(!empty($authURL)){ ?>
	<h2>CodeIgniter Facebook Login</h2>
    <a href="<?php echo $authURL; ?>"><img src="<?php echo base_url('assets/images/fb-login-btn.png'); ?>"></a>
<?php }else{ ?>
    <h2>Facebook Profile Details</h2>
    <div class="ac-data">
        <img src="<?php echo $userData['picture']; ?>"/>
        <p><b>Facebook ID:</b> <?php echo $userData['oauth_uid']; ?></p>
        <p><b>Name:</b> <?php echo $userData['first_name'].' '.$userData['last_name']; ?></p>
        <p><b>Email:</b> <?php echo $userData['email']; ?></p>
        <p><b>Gender:</b> <?php echo $userData['gender']; ?></p>
        <p><b>Logged in with:</b> Facebook</p>
        <p><b>Profile Link:</b> <a href="<?php echo $userData['link']; ?>" target="_blank">Click to visit Facebook page</a></p>
        <p><b>Logout from <a href="<?php echo $logoutURL; ?>">Facebook</a></p>
    </div>
<?php } ?>