summaryrefslogtreecommitdiffstats
path: root/includes/HybridAuth/Providers/Facebook.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/HybridAuth/Providers/Facebook.php')
-rw-r--r--includes/HybridAuth/Providers/Facebook.php271
1 files changed, 271 insertions, 0 deletions
diff --git a/includes/HybridAuth/Providers/Facebook.php b/includes/HybridAuth/Providers/Facebook.php
new file mode 100644
index 0000000..fa40c96
--- /dev/null
+++ b/includes/HybridAuth/Providers/Facebook.php
@@ -0,0 +1,271 @@
+<?php
+/*!
+* HybridAuth
+* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
+* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
+*/
+
+/**
+ * Hybrid_Providers_Facebook provider adapter based on OAuth2 protocol
+ *
+ * Hybrid_Providers_Facebook use the Facebook PHP SDK created by Facebook
+ *
+ * http://hybridauth.sourceforge.net/userguide/IDProvider_info_Facebook.html
+ */
+class Hybrid_Providers_Facebook extends Hybrid_Provider_Model
+{
+ // default permissions, and alot of them. You can change them from the configuration by setting the scope to what you want/need
+ public $scope = "email, user_about_me, user_birthday, user_hometown, user_website, read_stream, offline_access, publish_stream, read_friendlists";
+
+ /**
+ * IDp wrappers initializer
+ */
+ function initialize()
+ {
+ if ( ! $this->config["keys"]["id"] || ! $this->config["keys"]["secret"] ){
+ throw new Exception( "Your application id and secret are required in order to connect to {$this->providerId}.", 4 );
+ }
+
+ if ( ! class_exists('FacebookApiException', false) ) {
+ require_once Hybrid_Auth::$config["path_libraries"] . "Facebook/base_facebook.php";
+ require_once Hybrid_Auth::$config["path_libraries"] . "Facebook/facebook.php";
+ }
+
+ if ( isset ( Hybrid_Auth::$config["proxy"] ) ) {
+ BaseFacebook::$CURL_OPTS[CURLOPT_PROXY] = Hybrid_Auth::$config["proxy"];
+ }
+
+ $this->api = new Facebook( ARRAY( 'appId' => $this->config["keys"]["id"], 'secret' => $this->config["keys"]["secret"] ) );
+
+ if ( $this->token("access_token") ) {
+ $this->api->setAccessToken( $this->token("access_token") );
+ $this->api->setExtendedAccessToken();
+ $access_token = $this->api->getAccessToken();
+
+ if( $access_token ){
+ $this->token("access_token", $access_token );
+ $this->api->setAccessToken( $access_token );
+ }
+
+ $this->api->setAccessToken( $this->token("access_token") );
+ }
+
+ $this->api->getUser();
+ }
+
+ /**
+ * begin login step
+ *
+ * simply call Facebook::require_login().
+ */
+ function loginBegin()
+ {
+ $parameters = array("scope" => $this->scope, "redirect_uri" => $this->endpoint, "display" => "page");
+ $optionals = array("scope", "redirect_uri", "display");
+
+ foreach ($optionals as $parameter){
+ if( isset( $this->config[$parameter] ) && ! empty( $this->config[$parameter] ) ){
+ $parameters[$parameter] = $this->config[$parameter];
+ }
+ }
+
+ // get the login url
+ $url = $this->api->getLoginUrl( $parameters );
+
+ // redirect to facebook
+ Hybrid_Auth::redirect( $url );
+ }
+
+ /**
+ * finish login step
+ */
+ function loginFinish()
+ {
+ // in case we get error_reason=user_denied&error=access_denied
+ if ( isset( $_REQUEST['error'] ) && $_REQUEST['error'] == "access_denied" ){
+ throw new Exception( "Authentication failed! The user denied your request.", 5 );
+ }
+
+ // try to get the UID of the connected user from fb, should be > 0
+ if ( ! $this->api->getUser() ){
+ throw new Exception( "Authentication failed! {$this->providerId} returned an invalid user id.", 5 );
+ }
+
+ // set user as logged in
+ $this->setUserConnected();
+
+ // store facebook access token
+ $this->token( "access_token", $this->api->getAccessToken() );
+ }
+
+ /**
+ * logout
+ */
+ function logout()
+ {
+ $this->api->destroySession();
+
+ parent::logout();
+ }
+
+ /**
+ * load the user profile from the IDp api client
+ */
+ function getUserProfile()
+ {
+ // request user profile from fb api
+ try{
+ $data = $this->api->api('/me');
+ }
+ catch( FacebookApiException $e ){
+ throw new Exception( "User profile request failed! {$this->providerId} returned an error: $e", 6 );
+ }
+
+ // if the provider identifier is not recived, we assume the auth has failed
+ if ( ! isset( $data["id"] ) ){
+ throw new Exception( "User profile request failed! {$this->providerId} api returned an invalid response.", 6 );
+ }
+
+ # store the user profile.
+ $this->user->profile->identifier = (array_key_exists('id',$data))?$data['id']:"";
+ $this->user->profile->displayName = (array_key_exists('name',$data))?$data['name']:"";
+ $this->user->profile->firstName = (array_key_exists('first_name',$data))?$data['first_name']:"";
+ $this->user->profile->lastName = (array_key_exists('last_name',$data))?$data['last_name']:"";
+ $this->user->profile->photoURL = "https://graph.facebook.com/" . $this->user->profile->identifier . "/picture?width=150&height=150";
+ $this->user->profile->profileURL = (array_key_exists('link',$data))?$data['link']:"";
+ $this->user->profile->webSiteURL = (array_key_exists('website',$data))?$data['website']:"";
+ $this->user->profile->gender = (array_key_exists('gender',$data))?$data['gender']:"";
+ $this->user->profile->description = (array_key_exists('bio',$data))?$data['bio']:"";
+ $this->user->profile->email = (array_key_exists('email',$data))?$data['email']:"";
+ $this->user->profile->emailVerified = (array_key_exists('email',$data))?$data['email']:"";
+ $this->user->profile->region = (array_key_exists("hometown",$data)&&array_key_exists("name",$data['hometown']))?$data['hometown']["name"]:"";
+
+ if( array_key_exists('birthday',$data) ) {
+ list($birthday_month, $birthday_day, $birthday_year) = explode( "/", $data['birthday'] );
+
+ $this->user->profile->birthDay = (int) $birthday_day;
+ $this->user->profile->birthMonth = (int) $birthday_month;
+ $this->user->profile->birthYear = (int) $birthday_year;
+ }
+
+ return $this->user->profile;
+ }
+
+ /**
+ * load the user contacts
+ */
+ function getUserContacts()
+ {
+ try{
+ $response = $this->api->api('/me/friends');
+ }
+ catch( FacebookApiException $e ){
+ throw new Exception( "User contacts request failed! {$this->providerId} returned an error: $e" );
+ }
+
+ if( ! $response || ! count( $response["data"] ) ){
+ return ARRAY();
+ }
+
+ $contacts = ARRAY();
+
+ foreach( $response["data"] as $item ){
+ $uc = new Hybrid_User_Contact();
+
+ $uc->identifier = (array_key_exists("id",$item))?$item["id"]:"";
+ $uc->displayName = (array_key_exists("name",$item))?$item["name"]:"";
+ $uc->profileURL = "https://www.facebook.com/profile.php?id=" . $uc->identifier;
+ $uc->photoURL = "https://graph.facebook.com/" . $uc->identifier . "/picture?width=150&height=150";
+
+ $contacts[] = $uc;
+ }
+
+ return $contacts;
+ }
+
+ /**
+ * update user status
+ */
+ function setUserStatus( $status )
+ {
+ $parameters = array();
+
+ if( is_array( $status ) ){
+ $parameters = $status;
+ }
+ else{
+ $parameters["message"] = $status;
+ }
+
+ try{
+ $response = $this->api->api( "/me/feed", "post", $parameters );
+ }
+ catch( FacebookApiException $e ){
+ throw new Exception( "Update user status failed! {$this->providerId} returned an error: $e" );
+ }
+ }
+
+ /**
+ * load the user latest activity
+ * - timeline : all the stream
+ * - me : the user activity only
+ */
+ function getUserActivity( $stream )
+ {
+ try{
+ if( $stream == "me" ){
+ $response = $this->api->api( '/me/feed' );
+ }
+ else{
+ $response = $this->api->api('/me/home');
+ }
+ }
+ catch( FacebookApiException $e ){
+ throw new Exception( "User activity stream request failed! {$this->providerId} returned an error: $e" );
+ }
+
+ if( ! $response || ! count( $response['data'] ) ){
+ return ARRAY();
+ }
+
+ $activities = ARRAY();
+
+ foreach( $response['data'] as $item ){
+ if( $stream == "me" && $item["from"]["id"] != $this->api->getUser() ){
+ continue;
+ }
+
+ $ua = new Hybrid_User_Activity();
+
+ $ua->id = (array_key_exists("id",$item))?$item["id"]:"";
+ $ua->date = (array_key_exists("created_time",$item))?strtotime($item["created_time"]):"";
+
+ if( $item["type"] == "video" ){
+ $ua->text = (array_key_exists("link",$item))?$item["link"]:"";
+ }
+
+ if( $item["type"] == "link" ){
+ $ua->text = (array_key_exists("link",$item))?$item["link"]:"";
+ }
+
+ if( empty( $ua->text ) && isset( $item["story"] ) ){
+ $ua->text = (array_key_exists("link",$item))?$item["link"]:"";
+ }
+
+ if( empty( $ua->text ) && isset( $item["message"] ) ){
+ $ua->text = (array_key_exists("message",$item))?$item["message"]:"";
+ }
+
+ if( ! empty( $ua->text ) ){
+ $ua->user->identifier = (array_key_exists("id",$item["from"]))?$item["from"]["id"]:"";
+ $ua->user->displayName = (array_key_exists("name",$item["from"]))?$item["from"]["name"]:"";
+ $ua->user->profileURL = "https://www.facebook.com/profile.php?id=" . $ua->user->identifier;
+ $ua->user->photoURL = "https://graph.facebook.com/" . $ua->user->identifier . "/picture?type=square";
+
+ $activities[] = $ua;
+ }
+ }
+
+ return $activities;
+ }
+}