2010-12-22 19 views
7

Estoy usando Facebook php-sdk en mi aplicación iframe de Facebook para obtener el estado de inicio de sesión del usuario. Inmediatamente después de cerrar la sesión usando Facebook Account> Log out link, la sesión no se destruye aún. Debo esperar unos minutos antes de que caduque la sesión anterior, luego mi aplicación volverá a obtener el estado de inicio de sesión correcto.Facebook API - La sesión aún existe después de que el usuario cierra la sesión

Espero que el facebook se mate y la sesión cuando el usuario cierre la sesión. ¿Cómo mato manualmente la sesión?

Aquí está mi código:

$initParams = array(
    'appId' => $conf['app_id'], 
    'secret' => $conf['secret_api_key'], 
    'cookie' => TRUE, 
); 

$fb = new Facebook($initParams); 
$fb->getSession(); // will return a session object eventhough user signed out! 

resuelto:

llamando $fb->api('/me') destruirá la sesión si el usuario ha iniciado sesión previamente. he cambiado mi código de la siguiente manera:

if ($session) 
{ 
    try 
    { 
     $fbuid = $fb->getUser(); 
     $me = $fb->api('/me'); 
    } 
    catch(FacebookApiException $e){} 
} 

Si la llamada a la API no tiene éxito, $session se establecerá en NULL. Comportamiento muy extraño, no explico todo lo que está pasando aquí, pero resolvió mi problema de tener el objeto residual de la sesión no actualizado mediante el método getSession().

+0

Si el El enlace de la url de cierre de sesión se ha creado correctamente, no debería haber ningún problema con su código. ¿Puede mostrarnos su página de inicio? – ifaour

+1

No creo que sea un comportamiento extraño, ya que está claramente establecido en los comentarios [aquí] (https://github.com/facebook/php-sdk/blob/master/examples/example.php) _No sabemos si sigue siendo válido hasta que realicemos una llamada a la API utilizando la sesión. – ifaour

+0

de hecho, es malo que no haya leído correctamente los comentarios del código de ejemplo. Gracias por su entrada – flochtililoch

Respuesta

0

Facebook debe desasociar la sesión de la cuenta a la que pertenecía la sesión. Puede utilizar Facebook :: getUser() para comprobar si esto se hizo:

if ($fb->getUser() === null) { 
    // User logged out 
} else { 
    // User logged in 
} 
+2

El código del método getUser() se basa en getSession(). La sesión todavía existe después de un inicio de sesión de Facebook estándar función pública getUser() { $ session = $ this-> getSession(); return $ session? $ session ['uid']: null; } – flochtililoch

0

Trate $facebook->setSession(null) o el uso de JavaScript <a href="/logout/" onclick="FB.logout();">Logout</a>

+1

Eso funcionaría si estuviera manejando el bit de cierre de sesión, supongo, pero no tengo forma de saber cuándo se ha realizado el cierre de sesión con el menú de cierre de sesión de – flochtililoch

0

Salir no funciona de la manera que lo hace.

Intente publicar este enlace en su navegador, después de iniciar sesión en Facebook.

https://www.facebook.com/logout.php

Qué ocurre? te lleva a tu facebook No logout en absoluto.

Lo que sea que hagas, verifica la función (depende de tu API) handleLogout y verifica el resultado. En mi caso, devuelve la página completa de facebook html.

1

Trate de encontrar la función FormatData en algún lugar en LoginWindow (AS3) y encontrar esta línea:.

vars.redirect_uri = FacebookURLDefaults.LOGIN_SUCCESS_URL 

Cambiar el valor de http://www.facebook.com/ y cierre de sesión de esa página HTML cuando se haya identificado

Esta es una Solución temporal de para desconectarse si usted es desarrollador, no el usuario final.

7

Estoy usando $ fb-> getUser() y lo que hice fue casi idéntico al tuyo.

if ($fb->getUser()) 
{ 
    try 
    { 
     $me = $fb->api('/me'); 
    } 
    catch(FacebookApiException $e){ 
     **$fb->destroySession();** 
    } 
} 

He descubierto que utilizando sólo la API para comprobar si FB se registra a cabo o no a veces es inconsistente, pero con destroySession(), la sesión seguramente serán destruidos.

+2

de Facebook. Lo intenté, pero fallé ... si el usuario se desconectó de su/su facebook (no desde la aplicación) $ fb-> getUser() todavía le da el uid. incluso si un nuevo usuario tiene inicio de sesión en Facebook, el $ fb-> getUser() aún devuelve el uid anterior. –

0

La única forma que he conseguido resolver este problema era la limpieza de la sesión mediante la solicitud firmada y verificar la identificación del usuario:

$facebook = Membership::getFacebookApp(); 
$signed_request = $facebook->getSignedRequest(); 
if(isset($_SESSION['facebook_id']) && $signed_request['user_id'] != (int)$_SESSION['facebook_id']){ 
    $_SESSION = array(); 
} 
Cuestiones relacionadas