/**
* Facebook Login - Log in via Facebook
* @author Daniel15 <dan.cx>
*/
class FacebookLogin
{
const AUTHORIZE_URL = 'https://graph.facebook.com/oauth/authorize';
const TOKEN_URL = 'https://graph.facebook.com/oauth/access_token';
const PROFILE_URL = 'https://graph.facebook.com/me';
private $client_id;
private $client_secret;
private $my_url;
private $user_data;
/**
* Create an instance of the FacebookLogin class
*/
public function __construct($client_id, $client_secret)
{
$this->client_id = $client_id;
$this->client_secret = $client_secret;
$this->my_url = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF'];
}
/**
* Do a Facebook login - either redirects to Facebook or reads the returned result
*/
public function doLogin()
{
// Are we not returning from Facebook (ie. starting the login)?
return !isset($_GET['code']) ? $this->startLogin() : $this->verifyLogin();
}
/**
* Start a login with Facebook - Redirect to their authentication URL
*/
private function startLogin()
{
$data = array(
'client_id' => $this->client_id,
'redirect_uri' => $this->my_url,
'type' => 'web_server',
);
header('Location: ' . self::AUTHORIZE_URL . '?' . http_build_query($data));
die();
}
/**
* Verify the token we receive from Facebook is valid, and get the user's details
*/
private function verifyLogin()
{
$data = array(
'client_id' => $this->client_id,
'redirect_uri' => $this->my_url,
'client_secret' => $this->client_secret,
'code' => $_GET['code'],
);
// Get an access token
$result = @file_get_contents(self::TOKEN_URL . '?' . http_build_query($data));
parse_str($result, $result_array);
// Make sure we actually have a token
if (empty($result_array['access_token']))
throw new Exception('Invalid response received from Facebook. Response = "' . $result . '"');
// Grab the user's data
$this->access_token = $result_array['access_token'];
$this->user_data = json_decode(file_get_contents(self::PROFILE_URL . '?access_token=' . $this->access_token));
return $this->user_data;
}
/**
* Helper function to get the user's Facebook info
*/
public function getUser()
{
return $this->user_data;
}
}