Buenas, voy a explicar algunas cosas acerca de la librería facebook sdk para php aplicado para codeigniter, aunque puede servir como entendimiento tanto para php como para otros frameworks de php.
Para explicarlo, primero hemos de tener instalado facebook sdk para php, con lo que, para seguir bien este articulo, has de leer primero este otro INSTALAR FACEBOOK SDK EN CODEIGNITER
Instalando el facebook sdk para php podemos hacer, por ejemplo, el login a través de facebook en nuestra web, y este SDK tiene muchos helpers que nos ayudarán a facilitar este u otros procesos.
Teníamos una libreria nueva en codeigniter llamada lib_login.php, al principio de ella hemos de llamar a la librería facebook sdk para php:
require 'vendor/autoload.php';// llamamos al autoload
//añadimos los helpers que vayamos a usar o que necesitemos, que están en la carpeta ../vendor/facebook/php-sdk-v4/src/Facebook
use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;
use Facebook\FacebookRedirectLoginHelper;
Una vez hecho esto, ya podemos usar los maravillosos helpers que nos proporciona facebook para hacer el login a través de facebook, o lo que necesitemos. Tal y como nos dice la documentación oficial de facebook para desarrolladores, para iniciar la app (una vez tengamos hecha una aplicación en facebook) hemos de indicar esto:
FacebookSession::setDefaultApplication('YOUR_APP_ID', 'YOUR_APP_SECRET');
Pero, si seguisteis el articulo anterior, estos datos ya lo definiamos en la carpeta config, con lo que lo único que hemos de hacer es incluirlo así:
$this->ci->config->load('facebook');
// init app with app id and secret
$facebook_default_scope = explode(',', $this->ci->config->item("facebook_default_scope"));
$facebook_app_id = $this->ci->config->item("facebook_app_id");
$facebook_api_secret = $this->ci->config->item("facebook_api_secret");
FacebookSession::setDefaultApplication($facebook_app_id, $facebook_api_secret);
Centrándonos en el caso del login con facebook, usaremos el método FacebookRedirectLoginHelper :
$helper = new FacebookRedirectLoginHelper('tu url aqui'); //en nuestro caso la url era site_url('login/facebook')
En nuestro ejemplo, vamos a trabajar también con sesiones y por ello incluimos la libreria session:
$this->ci->load->library('session');
Explicación de los condicionantes IF de la libreria:
Si existe una $_SESSION y por lo tanto tengo el access token, recupero la FacebookSession ($datos_fb) asi:
$datos_fb = new FacebookSession('access token here');
si no tengo la FacebookSession, se procesa la respuesta desde Facebook con el método getSessionFromRedirect() de esta forma:
$datos_fb = $helper->getSessionFromRedirect();
Lo que nos devuelve una FacebookSession almacenada en la variable $datos_fb que es lo que necesitamos.
Esta FacebookSession se puede obtener así, pero también se puede obtener de otras formas si usas el Facebook SDK for JavaScript (usariamos el método FacebookJavaScriptLoginHelper) o si tu aplicación está en un Facebook Canvas (usaríamos el método FacebookCanvasLoginHelper). Incluso también la podemos obtener si hemos obtenido el access token por cualquier otro lado.
y si por último tenemos la FacebookSession (almacenada en $datos_fb), primero la grabamos en la $_SESSION:
$_SESSION['fb_token'] = $session->getToken();
Creamos de nuevo una FacebookSession usando el token guardado en la sesión, o el nuevo que hemos generado al logarnos
$datos_fb = new FacebookSession($session->getToken());
Una vez logados en Facebook, sacamos los datos del graph api request del usuario:
$request = new FacebookRequest($session, 'GET', '/me');
$respuesta = $request->execute();
// get response
$graphObject = $respuesta->getGraphObject()->asArray();
$fb_data = array(
'me' => $graphObject,
'loginUrl' => $helper->getLoginUrl($facebook_default_scope)
);
$this->ci->session->set_userdata('fb_data', $fb_data);
Y si no tenemos la FacebookSession:
$fb_data = array(
'me' => null,
'loginUrl' => $helper->getLoginUrl($facebook_default_scope)
);
$this->ci->session->set_userdata('fb_data', $fb_data);
Con esto obtenemos el array $fb_data que nos proporciona el $loginUrl que hay que poner en un enlace o boton para que nos lleve a facebook para la autenticación, y $me con los datos del usuario para tratarlos.
Espero os haya servido de ayuda. Gracias!