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['libraries'] = array('session','database');
$autoload['helper'] = array('url');
<?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;
<?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;
}
}
<?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');
}
}
<?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;
}
}
<!-- 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 } ?>