Hola amigos, la verdad es que estuve bastante complicado buscando por internet un tutorial de como mis usuarios pudiesen hacer el login con facebook, la verdad es que después de vagar muchas horas encontré algo bastante simple y explicativo que se puede encontrar aquí:
http://www.youtube.com/watch?v=MxSIKGWxztA
Sin embargo y para evitar el video les entrego la librería que se crea en ese tutorial más algunas modificaciones, a mi me ha funcionado a la perfección. Espero a algunos les sirva :)
Lo que hay que tener presente es que los archivos de la api (base_facebook.php, facebook.php y fa_ca_chain_bundle.crt) se ubican en /application/libraries/facebook/
Luego nuestros archivos:
/application/config/facebook.php
Código PHP:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
$config['appId'] = 'TuAppID';
$config['secret'] = 'TuAppSecretKey';
/application/libraries/fbconnect.php
Código PHP:
<?php
include(APPPATH . 'libraries/facebook/facebook.php');
class Fbconnect extends Facebook {
public $user = null;
public $userId = null;
public function Fbconnect() {
$CI = &get_instance();
$CI->config->load('facebook', TRUE);
$config = $CI->config->item('facebook');
parent::__construct($config);
parse_str(substr(strrchr($_SERVER['REQUEST_URI'], '?'), 1), $_REQUEST);
// Se comprueba si está logeado
// Si se puede tomar la información del usuario
$this->userId = $this->getUser();
// Sí tiene una sesión abierta
if($this->isLogedIn()) {
try {
// Se obtiene la info del usuario
$this->user = $this->api('/me');
}
catch(FacebookApiException $e) {
error_log($e);
}
}
}
// Devuelve URL foto de perfil
public function profilePic($uid=FALSE) {
if(!$uid) {
$uid = $this->userId;
}
return 'http://graph.facebook.com/' . $uid . '/picture';
}
// Realizar peticiones a través de FQL: Tabla, Scopes, Array u Objeto, Where
// $this->fbconnect->fqlQuery('user', 'current_location');
public function fqlQuery($table, $scopes, $as_object=TRUE, $where='uid=me()') {
$array = $this->api(array('method'=>'fql.query','query'=>"SELECT " . $scopes . " FROM " . $table . " WHERE " . $where));
return ($as_object ? json_decode (json_encode ($array[0]), FALSE) : $array[0]);
}
// Comprobar si está logeado
public function isLogedIn() {
return ($this->userId);
}
// Datos del usuario para manejo en controlador
// $this->fbconnect->userData()->email;
public function userData($obj=TRUE) {
if($this->user) {
return ($obj ? json_decode (json_encode ($this->user), FALSE) : $this->user);
}
return array();
}
// Acción de login. Directo en el controlador
// $this->fbconnect->doLogin('http://ejemplo.com/login/facebook', 'email');
public function doLogin($redirect, $scope='') {
redirect($this->getLoginUrl(array('redirect_uri' => $redirect, 'scope' => $scope)));
}
}
Y ahora un pequeño ejemplo, obviamente que primero tenemos que crear nuestra aplicación en facebook para obtener la API Key y la clave secreta, luego de eso:
Código PHP:
class Prueba extends CI_Controller {
public function index() {
// Cargamos la librería
$this->load->library('fbconnect');
// Hizo el login con facebook?
if($this->fbconnect->isLogedIn()) {
// Mostramos primer nombre
echo 'Hola ' . $this->fbconnect->userData()->first_name . '<br />';
// Mostramos foto de perfil
echo '<img src="' . $this->fbconnect->profilePic() . '" /><br />';
// Mostramos el resto de los datos que nos entrega facebook
echo '<pre>';
print_r($this->fbconnect->userData());
echo '</pre>';
}
// Si no ha hecho el login le mostramos el link
else {
echo anchor('/prueba/fblogin', 'Login con facebook');
}
}
public function fblogin() {
// Cargamos la librería
$this->load->library('fbconnect');
// Se hace el login, primer parámetro la dirección donde los devolverá y el segundo los "scopes" (Info adicional que queremos pedirle a facebook)
$this->fbconnect->doLogin(site_url('/prueba'), 'email,user_birthday,user_location');
}
Eso es todo, espero a alguien más le sirva ya que a mi me complicó bastante en un principio.
Saludos!