2011-04-14 3 views
6

Estoy utilizando con éxito el SDK de Facebook (PHP) para conectar a los usuarios a mi sitio, pero estoy teniendo problemas cuando autentican su cuenta. Su cuenta se autentica con éxito, pero por alguna razón las sesiones de mi sitio se borran.Facebook API SDK (PHP) sesiones de sitios de borrado

flujo:

  • usuario se registra en mi sitio (nombre de usuario y contraseña locales)
  • usuario se conecta a Facebook en una ventana emergente
  • Facebook autentifica el usuario y devuelve de nuevo a mi sitio
  • Mis sitios la sesión ahora no es válida (tanto en el menú emergente como en la ventana principal) y el usuario ha cerrado sesión

Estoy usando sesión el SDK de Facebook (PHP) y mi sitio usa el marco de CakePHP

Cualquier ayuda será muy apreciada.

+0

¿Está utilizando el Javascript SDK para mostrar la ventana emergente o lo está haciendo manualmente? – pleasedontbelong

+0

Lo estoy haciendo manualmente. Solo estoy usando el PHP SDK – bpneal

Respuesta

1

no pude averiguar por qué se reinició la sesión, por lo que decidieron no usar el SDK para la autenticación. Esto es lo que usé en su lugar.

$code = (isset ($_REQUEST['code']) ? $_REQUEST['code'] : null); 

if (empty ($code)) { 
    $dialogUrl = 'http://www.facebook.com/dialog/oauth?client_id=' . $this->appId . '&redirect_uri=' . urlencode($this->url) . '&scope=' . implode(',', $this->scope); 
    header('Location: ' . $dialogUrl); 
    die; 
} 
else { 
    $tokenUrl = 'https://graph.facebook.com/oauth/access_token?client_id=' . $this->appId . '&redirect_uri=' . urlencode($this->url) . '&client_secret=' . $this->secret . '&code=' . $code; 
    $accessToken = file_get_contents($tokenUrl); 

    $this->Session->write('facebookAccessToken', $accessToken); 

    $graphUrl = 'https://graph.facebook.com/me?' . $accessToken; 
    $fbUser = json_decode(file_get_contents($graphUrl)); 

    if ($fbUser) { 
     ... 
    } 
} 
1

Podría valer la pena verificar el nivel de seguridad de la torta, podría estar haciendo comprobaciones de referencia (creo que hace esto en la configuración "alta", tal vez el "medio" también), lo que invalidaría la sesión.

+0

Gracias Griff, esta fue mi primera idea, pero he intentado bajar el nivel a 'bajo' y todavía tengo el mismo problema. También estoy usando la API de Twitter de la misma manera y esto no produce el mismo error. Debe ser algo en el SDK de Facebook – bpneal

2

No puedo decir qué está suprimiendo la sesión, pero es posible que desee probar este (funciona para mí)

utilizar el SDK Javascript para visualizar los botones de inicio de sesión que se abrirá la ventana emergente para conectarse a FB

añadir el SDK js a su página de la siguiente manera:

<div id="fb-root"></div> 
<script> 
    window.fbAsyncInit = function() { 
    FB.init({appId: '<?php echo FB_API_ID; ?>', status: true, cookie: true, xfbml: true}); 
    FB.Event.subscribe('auth.login', function() { 
     new Request({ 
      'method': 'get', 
      'url': '<?php echo $this->Html->url(array('controller'=>'users','action'=>'login_fb'));?>', 
      'onSuccess': function(result){ 
       window.location.reload();  
      } 
     }).send(); 
    }); 
    }; 
    (function() { 
    var e = document.createElement('script'); e.async = true; 
    e.src = document.location.protocol + 
     '//connect.facebook.net/en_US/all.js'; 
    document.getElementById('fb-root').appendChild(e); 
    }()); 
</script> 

en el caso auth.login estoy usando una llamada AJAX a/usuarios/login_fb que va a utilizar el SDK de Facebook para comprobar la sesión de facebook:

App::import('Lib', 'facebook_sdk/facebook'); 
    // "MyAuth" is a custom Auth Component that extends the normal Auth component 
    $this->MyAuth->facebook = new Facebook(array(
     'appId' => FB_API_ID, 
     'secret' => FB_SECRET, 
     'cookie' => true, 
    )); 

    $me = null; 
    $session = $this->MyAuth->facebook->getSession(); 
    if ($session) { 
     try { 
     $uid = $this->MyAuth->facebook->getUser(); 
     $me = $this->MyAuth->facebook->api('/me'); 
     } catch (FacebookApiException $e) { 
     error_log($e); 
     } 
    } 

    if ($me) { 
     $this->Session->write('FbLogin.session',$session); 
     $this->Session->write('FbLogin.user',$me); 
     $UserModel = ClassRegistry::init('User'); 
     $user = $UserModel->findByUid($me['id']); 
     if(!$user){ 
      $UserModel->create(); 
      $user_data = array('username'=>$me['username'], 
         'name'=>$me['first_name'], 
         'lastname'=>$me['last_name'], 
         'email'=>$me['email'], 
         'group_id'=>GROUP_VISITOR, 
         'uid'=>$me['id'] 
         ); 
      $UserModel->save($user_data); 
      $user['User']['id'] = $UserModel->id; 
     } 
     $this->Session->write($this->MyAuth->sessionKey, $user['User']); 
     $this->MyAuth->_loggedIn = true; 
     } 
} 

la idea principal es que .. en js que yo llamo una ajax para comprobar la sesión fb y luego guardarlo en la sesión de la torta, y el js a actualizar la página

+0

Gracias, esto se ve bien, pero he decidido no usar el SDK para la autenticación más – bpneal

+0

Este es un enfoque inteligente, se ve bastante kool – Herr