|
|
|
@ -13,19 +13,9 @@ |
|
|
|
|
|
|
|
|
|
require_once dirname(__FILE__) . '/../../inc/global.inc.php'; |
|
|
|
|
require_once dirname(__FILE__) . '/facebook.init.php'; |
|
|
|
|
require_once dirname(__FILE__) . '/facebook-php-sdk/autoload.php'; |
|
|
|
|
|
|
|
|
|
use Facebook\FacebookSession; |
|
|
|
|
use Facebook\FacebookRedirectLoginHelper; |
|
|
|
|
use Facebook\FacebookRequest; |
|
|
|
|
use Facebook\FacebookSDKException; |
|
|
|
|
use Facebook\FacebookRequestException; |
|
|
|
|
|
|
|
|
|
require_once dirname(__FILE__) . '/functions.inc.php'; |
|
|
|
|
|
|
|
|
|
// dont rename $facebook_config to $facebookConfig otherwise get a "Facebook\\FacebookSDKException" |
|
|
|
|
FacebookSession::setDefaultApplication($facebook_config['appId'], $facebook_config['secret']); |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* This function connect to facebook and retrieves the user info |
|
|
|
|
* If user does not exist in chamilo, it creates it and logs in |
|
|
|
@ -33,74 +23,144 @@ FacebookSession::setDefaultApplication($facebook_config['appId'], $facebook_conf |
|
|
|
|
*/ |
|
|
|
|
function facebookConnect() |
|
|
|
|
{ |
|
|
|
|
global $facebook_config; |
|
|
|
|
global $helper; |
|
|
|
|
$fb = new \Facebook\Facebook([ |
|
|
|
|
'app_id' => $GLOBALS['facebook_config']['appId'], |
|
|
|
|
'app_secret' => $GLOBALS['facebook_config']['secret'], |
|
|
|
|
'default_graph_version' => 'v2.2' |
|
|
|
|
]); |
|
|
|
|
|
|
|
|
|
$helper = $fb->getRedirectLoginHelper(); |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
$accessToken = $helper->getAccessToken(); |
|
|
|
|
} catch(Facebook\Exceptions\FacebookResponseException $e) { |
|
|
|
|
Display::addFlash( |
|
|
|
|
Display::return_message('Facebook Graph returned an error: ' . $e->getMessage(), 'error') |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
header('Location: ' . api_get_path(WEB_PATH)); |
|
|
|
|
exit; |
|
|
|
|
} catch(Facebook\Exceptions\FacebookSDKException $e) { |
|
|
|
|
Display::addFlash( |
|
|
|
|
Display::return_message('Facebook SDK returned an error: ' . $e->getMessage(), 'error') |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
header('Location: ' . api_get_path(WEB_PATH)); |
|
|
|
|
exit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!isset($accessToken)) { |
|
|
|
|
if (!$helper->getError()) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (isset($_GET['loginFailed'])) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$error = implode('<br>', [ |
|
|
|
|
'Error: ' . $helper->getError(), |
|
|
|
|
'Error Code: ' . $helper->getErrorCode(), |
|
|
|
|
'Error Reason: ' . $helper->getErrorReason(), |
|
|
|
|
'Error Description: ' . $helper->getErrorDescription() |
|
|
|
|
]); |
|
|
|
|
|
|
|
|
|
Display::addFlash( |
|
|
|
|
Display::return_message($error, 'error', false) |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
header('Location: ' . api_get_path(WEB_PATH)); |
|
|
|
|
exit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$oAuth2Client = $fb->getOAuth2Client(); |
|
|
|
|
$tokenMetadata = $oAuth2Client->debugToken($accessToken); |
|
|
|
|
$tokenMetadata->validateAppId($GLOBALS['facebook_config']['appId']); |
|
|
|
|
$tokenMetadata->validateExpiration(); |
|
|
|
|
|
|
|
|
|
if (!$accessToken->isLongLived()) { |
|
|
|
|
try { |
|
|
|
|
$accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken); |
|
|
|
|
} catch (Facebook\Exceptions\FacebookSDKException $e) { |
|
|
|
|
Display::addFlash( |
|
|
|
|
Display::return_message('Error getting long-lived access token: ' . $e->getMessage(), 'error') |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
header('Location: ' . api_get_path(WEB_PATH)); |
|
|
|
|
exit; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
$helper = new FacebookRedirectLoginHelper($facebook_config['return_url']); |
|
|
|
|
$session = $helper->getSessionFromRedirect(); |
|
|
|
|
// see if we have a session |
|
|
|
|
if (isset($session)) { |
|
|
|
|
// graph api request for user data |
|
|
|
|
$request = new FacebookRequest($session, 'GET', '/me?fields=id,first_name,last_name,email,locale'); |
|
|
|
|
$response = $request->execute(); |
|
|
|
|
// get response |
|
|
|
|
$graphObject = $response->getGraphObject(Facebook\GraphUser::className()); |
|
|
|
|
$username = changeToValidChamiloLogin($graphObject->getProperty('email')); |
|
|
|
|
$email = $graphObject->getProperty('email'); |
|
|
|
|
$locale = $graphObject->getProperty('locale'); |
|
|
|
|
$language = facebookPluginGetLanguage($locale); |
|
|
|
|
if (!$language) { |
|
|
|
|
$language='en_US'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//Checks if user already exists in chamilo |
|
|
|
|
$u = array( |
|
|
|
|
'firstname' => $graphObject->getProperty('first_name'), |
|
|
|
|
'lastname' => $graphObject->getProperty('last_name'), |
|
|
|
|
'status' => STUDENT, |
|
|
|
|
'email' => $graphObject->getProperty('email'), |
|
|
|
|
'username' => $username, |
|
|
|
|
'language' => $language, |
|
|
|
|
'password' => 'facebook', |
|
|
|
|
'auth_source' => 'facebook', |
|
|
|
|
// 'courses' => $user_info['courses'], |
|
|
|
|
// 'profile_link' => $user_info['profile_link'], |
|
|
|
|
// 'worldwide_bu' => $user_info['worlwide_bu'], |
|
|
|
|
// 'manager' => $user_info['manager'], |
|
|
|
|
'extra' => array() |
|
|
|
|
$response = $fb->get('/me?fields=id,first_name,last_name,locale,email', $accessToken->getValue()); |
|
|
|
|
} catch(Facebook\Exceptions\FacebookResponseException $e) { |
|
|
|
|
Display::addFlash( |
|
|
|
|
Display::return_message('Graph returned an error: ' . $e->getMessage(), 'error') |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
header('Location: ' . api_get_path(WEB_PATH)); |
|
|
|
|
exit; |
|
|
|
|
} catch(Facebook\Exceptions\FacebookSDKException $e) { |
|
|
|
|
Display::addFlash( |
|
|
|
|
Display::return_message('Facebook SDK returned an error: ' . $e->getMessage(), 'error') |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
header('Location: ' . api_get_path(WEB_PATH)); |
|
|
|
|
exit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$user = $response->getGraphUser(); |
|
|
|
|
$language = facebookPluginGetLanguage($user['locale']); |
|
|
|
|
|
|
|
|
|
if (!$language) { |
|
|
|
|
$language = 'en_US'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$u = [ |
|
|
|
|
'firstname' => $user->getFirstName(), |
|
|
|
|
'lastname' => $user->getLastName(), |
|
|
|
|
'status' => STUDENT, |
|
|
|
|
'email' => $user->getEmail(), |
|
|
|
|
'username' => changeToValidChamiloLogin($user->getEmail()), |
|
|
|
|
'language' => $language, |
|
|
|
|
'password' => 'facebook', |
|
|
|
|
'auth_source' => 'facebook', |
|
|
|
|
'extra' => array() |
|
|
|
|
]; |
|
|
|
|
$chamiloUinfo = api_get_user_info_from_email($user->getEmail()); |
|
|
|
|
|
|
|
|
|
$_user['uidReset'] = true; |
|
|
|
|
$_user['language'] = $language; |
|
|
|
|
|
|
|
|
|
if ($chamiloUinfo === false) { |
|
|
|
|
// We have to create the user |
|
|
|
|
$chamilo_uid = external_add_user($u); |
|
|
|
|
|
|
|
|
|
if ($chamilo_uid === false) { |
|
|
|
|
Display::addFlash( |
|
|
|
|
Display::return_message(get_lang('UserNotRegistered'), 'error') |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
$chamiloUinfo = api_get_user_info_from_email($email); |
|
|
|
|
if ($chamiloUinfo === false) { |
|
|
|
|
// we have to create the user |
|
|
|
|
$chamilo_uid = external_add_user($u); |
|
|
|
|
if ($chamilo_uid !== false) { |
|
|
|
|
$_user['user_id'] = $chamilo_uid; |
|
|
|
|
$_user['uidReset'] = true; |
|
|
|
|
$_SESSION['_user'] = $_user; |
|
|
|
|
header('Location:' . api_get_path(WEB_PATH)); |
|
|
|
|
exit(); |
|
|
|
|
} else { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
// User already exists, update info and login |
|
|
|
|
$chamilo_uid = $chamiloUinfo['user_id']; |
|
|
|
|
$u['user_id'] = $chamilo_uid; |
|
|
|
|
external_update_user($u); |
|
|
|
|
$_user['user_id'] = $chamilo_uid; |
|
|
|
|
$_user['uidReset'] = true; |
|
|
|
|
$_SESSION['_user'] = $_user; |
|
|
|
|
header('Location:' . api_get_path(WEB_PATH)); |
|
|
|
|
exit(); |
|
|
|
|
} |
|
|
|
|
header('Location: ' . api_get_path(WEB_PATH)); |
|
|
|
|
exit; |
|
|
|
|
} |
|
|
|
|
} catch (FacebookRequestException $ex) { |
|
|
|
|
echo $ex; |
|
|
|
|
} catch (Exception $ex) { |
|
|
|
|
// When validation fails or other local issues |
|
|
|
|
|
|
|
|
|
$_user['user_id'] = $chamilo_uid; |
|
|
|
|
$_SESSION['_user'] = $_user; |
|
|
|
|
|
|
|
|
|
header('Location: ' . api_get_path(WEB_PATH)); |
|
|
|
|
exit(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// User already exists, update info and login |
|
|
|
|
$chamilo_uid = $chamiloUinfo['user_id']; |
|
|
|
|
$u['user_id'] = $chamilo_uid; |
|
|
|
|
external_update_user($u); |
|
|
|
|
$_user['user_id'] = $chamilo_uid; |
|
|
|
|
$_SESSION['_user'] = $_user; |
|
|
|
|
|
|
|
|
|
header('Location: ' . api_get_path(WEB_PATH)); |
|
|
|
|
exit(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
@ -109,11 +169,16 @@ function facebookConnect() |
|
|
|
|
*/ |
|
|
|
|
function facebookGetLoginUrl() |
|
|
|
|
{ |
|
|
|
|
global $facebook_config; |
|
|
|
|
$helper = new FacebookRedirectLoginHelper($facebook_config['return_url']); |
|
|
|
|
$loginUrl = $helper->getLoginUrl( |
|
|
|
|
array('scope' => 'email') |
|
|
|
|
); |
|
|
|
|
$fb = new \Facebook\Facebook([ |
|
|
|
|
'app_id' => $GLOBALS['facebook_config']['appId'], |
|
|
|
|
'app_secret' => $GLOBALS['facebook_config']['secret'], |
|
|
|
|
'default_graph_version' => 'v2.2' |
|
|
|
|
]); |
|
|
|
|
|
|
|
|
|
$helper = $fb->getRedirectLoginHelper(); |
|
|
|
|
$loginUrl = $helper->getLoginUrl(api_get_path(WEB_PATH) . '?action=fbconnect', [ |
|
|
|
|
'email' |
|
|
|
|
]); |
|
|
|
|
|
|
|
|
|
return $loginUrl; |
|
|
|
|
} |
|
|
|
|