Facebook Login With Codeigniter


CREATE TABLE `users` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `oauth_provider` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 `oauth_uid` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `first_name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 `last_name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 `email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `gender` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
 `locale` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
 `cover` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
 `picture` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `link` varchar(255) 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['libraries'] = array('session','database');
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_type           string   Set login type. (web, js, canvas)
|  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_permissions          array    Your required permissions.
|  facebook_graph_version        string   Specify Facebook Graph version. Eg v2.10
|  facebook_auth_on_load         boolean  Set to TRUE to check for valid access token on every page load.
*/$config['facebook_app_id']              = 'InsertAppId';$config['facebook_app_secret']          = 'InsertAppSecret';$config['facebook_login_type']          = 'web';$config['facebook_login_redirect_url']  = 'user_authentication';$config['facebook_logout_redirect_url'] = 'user_authentication/logout';$config['facebook_permissions']         = array('email');$config['facebook_graph_version']       = 'v2.10';$config['facebook_auth_on_load']        = TRUE;



Libraries

Facebook.php
The Facebook class helps to integrate Facebook PHP SDK v5 in CodeIgniter 3.x application. Using this Facebook library, you can easily add the login with Facebook functionality using PHP SDK v5 to the CodeIgniter application.
<?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 facebook 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     2.0
 */

// Include the autoloader provided in the SDKrequire_once 'facebook-php-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;
    }
}

Controllers (User_authentication.php)

User_Authentication controller contains three functions, __construct()index(), and logout().
  • __construct() – The Facebook library and User model are loaded in this method.
  • index() – The following functionalities are implemented in this method.
    • Connect with Facebook Graph API using the Facebook library, pass the user profile information to the User model for insert into the database.
    • Pass the user data to the view and load the profile details view for authenticated user.
    • Load the login view for the non-authenticated user.
  • logout() – This method destroys the Facebook session, remove the user data from session and logout the user from their Facebook account.
<?php defined('BASEPATH') OR exit('No direct script access allowed');
class User_Authentication extends CI_Controller{
    function __construct() {
        parent::__construct();
        
        // Load facebook library
        $this->load->library('facebook');
        
        //Load user model
        $this->load->model('user');
    }
    
    public function index(){
        $userData = array();
        
        // Check if user is logged in
        if($this->facebook->is_authenticated()){
            // Get user facebook profile details
            $fbUserProfile $this->facebook->request('get''/me?fields=id,first_name,last_name,email,link,gender,locale,cover,picture');

            // Preparing data for database insertion
            $userData['oauth_provider'] = 'facebook';
            $userData['oauth_uid'] = $fbUserProfile['id'];
            $userData['first_name'] = $fbUserProfile['first_name'];
            $userData['last_name'] = $fbUserProfile['last_name'];
            $userData['email'] = $fbUserProfile['email'];
            $userData['gender'] = $fbUserProfile['gender'];
            $userData['locale'] = $fbUserProfile['locale'];
            $userData['cover'] = $fbUserProfile['cover']['source'];
            $userData['picture'] = $fbUserProfile['picture']['data']['url'];
            $userData['link'] = $fbUserProfile['link'];
            
            // Insert or update user data
            $userID $this->user->checkUser($userData);
            
            // Check user data insert or update status
            if(!empty($userID)){
                $data['userData'] = $userData;
                $this->session->set_userdata('userData',$userData);
            }else{
               $data['userData'] = array();
            }
            
            // Get logout URL
            $data['logoutURL'] = $this->facebook->logout_url();
        }else{
            // Get login 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');
    }
}

Models (User.php)

User model contains one function called checkUser(), it is used to insert or update the user profile information into the database.
<?php if ( ! defined('BASEPATH')) 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;
    }
}

Views (user_authentication/index.php)

If the user already logged in with their Facebook account, this view will display the profile details, otherwise, Facebook login button will be shown.
<?phpif(!empty($authURL)) {
    echo '<a href="'.$authURL.'"><img src="'.base_url().'assets/images/flogin.png" alt=""/></a>';
}else{?>
<div class="wrapper">
    <h1>Facebook Profile Details </h1>
    <div class="welcome_txt">Welcome <b><?php echo $userData['first_name']; ?></b></div>
    <div class="fb_box">
        <div style="position: relative;">
            <img src="<?php echo $userData['cover']; ?>" />
            <img style="position: absolute; top: 90%; left: 45%;" src="<?php echo $userData['picture']; ?>"/>
        </div>
        <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>Locale : </b><?php echo $userData['locale']; ?></p>
        <p><b>You are login 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></b></p>
    </div>
</div>
<?php ?>

Comments

Popular posts from this blog

Forgot password using codeigniter

Insert and Update or Edit Data using jQuery Dialogify with PHP Ajax