Files
jubaboxweb/wwwjuba/application/libraries/Lib_login.php
T
2019-10-02 10:48:28 -04:00

218 lines
7.1 KiB
PHP

<?php if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Name: Facebook Login Library
*
* Author: appleboy
*
*/
require 'vendor/autoload.php';
//require_once 'vendor/facebook/php-sdk-v4/src/Facebook/autoload.php';
use Facebook\Facebook;
use Facebook\FacebookRequestException;
use Facebook\FacebookRedirectLoginHelper;
class Lib_login
{
/**
* CodeIgniter global
*
* @var string
**/
protected $ci;
/**
* @var FB
*/
private $fb;
private $helper;
private $facebook_default_scope;
private $facebook_login_url;
private $facebook_logout_url;
/**
* __construct
*
* @return void
* @author Ben
**/
public function __construct()
{
if (!session_id()) {
session_start();
}
$this->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, "<p>Error getting long-lived access token: " . $this->helper->getMessage() . "</p>\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;
}
}