2010-11-24 16 views
5

Estoy trabajando en una aplicación que utiliza Facebook Connect para iniciar sesión en los usuarios que usan su cuenta de Facebook.Eliminar la cookie de sesión de Facebook de mi aplicación en usuarios cerrar sesión

Todo funciona bien, excepto en el caso siguiente:

  1. usuario se desconectó de mi página web y facebook.
  2. El usuario intenta iniciar sesión nuevamente en mi aplicación.

En este caso cuando se abre la ventana emergente de Facebook Connect dice "error en la aplicación".

Descubrí que la razón es que la antigua cookie fbs no se elimina cuando los usuarios se desconectan. He agregado el código para eliminar la cookie al cerrar la sesión de mi aplicación, pero la cookie no se elimina.

Aquí está mi código (usando Symfony.)

$fbCookie = 'fbs_'.sfConfig::get('app_facebook_application_id'); 
      $cookie = $request->getCookie($fbCookie); 
      if(!is_null($cookie)){ 
      setCookie($fbCookie," ", time()-3600); 
      }  

Esto no funciona. La cookie sigue siendo la misma. La función setCookie devuelve "1" como se esperaba.

¿Cuál puede ser el problema?

+1

No estoy tratando de eliminar las cookies de facebook.com. Al usar facebook connect, la API crea una cookie en mi dominio. Parece que hubo un problema con localhost. He puesto el sitio en línea y funcionó. – brpaz

+1

¿por qué aceptaste la respuesta de Efazati? No creo que sea correcto. De hecho, creo que su comentario anterior es la respuesta correcta: es un problema, ¡eso solo aparece en localhost! ¡No acepte respuestas incorrectas, solo para mejorar su tasa de aceptación! –

Respuesta

0

Como dijo;) se trata de la cookie que establece su secuencia de comandos local, no una en Facebook.com, por lo que su pregunta es legítima.

Me encuentro con el mismo problema aquí. El PHPSDK no le da la posibilidad de eliminar la cookie. Así que, o tienes que correr toda la sesión sin cookies:

$facebook = new Facebook(array(
    'appId' => FB_APPID, 
    'secret' => FB_APPSECRET, 
    'cookie' => false, 
)); 

o redirigir al usuario a la URL de cierre de sesión en facebook:

header('Location: ' . $facebook->getLogoutUrl(array('next'=>URL_AFTER_LOGOUT))'); 

El único problema parece ser que el usuario está conectado a cabo de Facebook también.

Si puede utilizar Javascript intente esto:

<script src="http://connect.facebook.net/en_US/all.js"></script> 
<script> 
FB.init({appId: '<?php echo FB_APPID;?>', status: true, cookie: true, xfbml: true}); 
FB.Event.subscribe('auth.logout', function(response) { 
    window.location.href='YOUR_LOCAL_LOGOUTSCRIPT'; 
}); 
</script> 
+0

El problema es que la función '$ facebook-> getLogoutUrl();' no borra correctamente los datos de la sesión, y no que el usuario haya cerrado sesión en Facebook durante este proceso. –

+0

Es por eso que hay una 'matriz ('siguiente' => URL_AFTER_LOGOUT))' en el código. Es lógico para mí que el script en URL_AFTER_LOGOUT tenga su propio mecanismo destructor de sesión. – Patrick

0

Por alguna razón no se puede eliminar la cookie, a pesar de que, obviamente, tiene permiso para leerlo (porque había que leer el señal_acceso).

Pero de todos modos: este problema solo aparece en localhost. ¡En su servidor no debería encontrarse con el problema! La cookie tampoco se elimina en su servidor, pero no se reconoce como un access_token válido cuando intenta iniciar sesión de nuevo.

9

Estoy bastante seguro de que tuve problemas con esto también ... debes asegurarte de matar la sesión de Facebook justo después de que elimines la cookie, de lo contrario, solo aparecerá una copia de seguridad ... aquí hay un ejemplo

// Assuming that $facebook is your facebook object populated with your settings 
    $facebook = new Facebook(array(
      'appId' => FB_APPID, 
      'secret' => FB_APPSECRET, 
      'cookie' => true)); 

    $fb_key = 'fbs_'.sfConfig::get('app_facebook_application_id'); 
    set_cookie($fb_key, '', '', '', '/', ''); 
    $facebook->setSession(NULL); 
+0

¿Qué devuelve '.sfConfig :: get ('app_facebook_application_id')'? ¿Es ese el mismo valor que tu 'FB_APPID'? – Richard

+0

Sí ... básicamente respondía a la sintaxis de la pregunta sobre el uso del marco sinfónico ... pero no estoy seguro de si todo esto sigue siendo cierto para el SDK actual, porque han realizado algunos cambios ya que esta respuesta fue publicado – tgriesser

+0

hola tgriesser, ¿sabe cómo utilizar correctamente el access_token para cerrar la sesión. Acabo de probar el código predeterminado https://developers.facebook.com/docs/reference/php/facebook-api/ pero cuando cierro la sesión de FB, mi aplicación todavía piensa que estoy iniciando sesión, también cuando inicio sesión como un usuario diferente . ¿Algun consejo? – alex

0

Estaba teniendo problemas con esto también, y contrario a la respuesta de Efazati, mi problema fue con las cookies establecidas en mi propio dominio por la biblioteca php api de Facebook. Lo que estaba pasando por alto fue al eliminar la cookie, utilizando el dominio exacto y la ruta con la que se estableció la cookie. Esta es la línea que eliminó exitosamente la cookie para mí.

setcookie("fbs_" . $app_id, '', time()-3600, "/", ".mydomain.com"); 

El comentario de tgriesser también fue útil.

+1

Tuve este problema. Por alguna razón 'setcookie ($ facebook-> getSignedRequestCookieName(), '', time() - 3600);' no funcionó, y 'setcookie ($ facebook-> getSignedRequestCookieName(), '', time() - 3600, '/'); 'funcionó. – gerard

1

Tuve el mismo problema y ninguna de las soluciones que encontré en la web funcionó para mí. Entonces, de repente otra aplicación con el mismo código funcionaba bien, así que comprueba la configuración avanzada en la aplicación y funcionó cuando cambié: OAuth 2.0 para lienzo habilitada, eventos Zona horaria-menos habilitada y Promueve a solicitudes 2.0 ENABLED

Espero que ayude

0

Tuve el mismo problema e intenté todo lo anterior, pero luego sospeché que los nombres de las cookies no son lo que espero que sean, ¡y de hecho! Así que acaba de imprimir mis galletas y comprobar cuidadosamente cuál de ellos Quiero quitar:

guión
//print the cookies just to make sure what is the exact name of the cookie 
foreach ($_COOKIE as $key => $value) { 
    print $key . "=" . $value . "</br>"; 
} 

//delete 
if (isset($_COOKIE['fbsr_' . $app_id])) { 
    setcookie('fbsr_' . $app_id, $_COOKIE['fbsr_' . $app_id], time() - 3600, "/"); 
    setcookie('PHPSESSID', $_COOKIE['PHPSESSID'], time() - 3600, "/"); 

    unset($_COOKIE['fbsr_' . $app_id]); 
    unset($_COOKIE['PHPSESSID']); 
} 

Este php debe ejecutar después de llamar a FB.logout en su parte JS:

function logout() { 
    FB.init({appId: '[your app id]', status: true, cookie: true,xfbml: true}); 
    var flag = confirm("logout from your facebook account as well"); 
    if (flag) { 
     FB.logout(function(response) { window.location='logout.php' }); 
    } 
} 
0
<?php 

// include the Facebook SDK 
include_once 'src/facebook.php'; 

// Define crutial perams 
define('APPID', ''); 
define('SECRET', ''); 
define('URL',  'http://fb.domain.co.uk'); 

// shake my hand! 
$facebook = new Facebook(array('appId' => APPID, 'secret' => SECRET, 'fileUpload' => true)); 

// if we are being visited by someone trying to logout, lets me sure they get logged out! 
if(isset($_GET['logged_out'])) { 
    setcookie("PHPSESSID", "", (time()-3600)); 
    header("location: " . URL); 
    exit(); 
} 

// lets try to get the users id 
$user_id = $facebook->getUser(); 
// try to get their access token 
$access_token = $facebook->getAccessToken(); 

// if we have an id 
if($user_id) { 

    // from the offset, we're good to go... 
    $logged_in = true; 

    echo "<h1>Logged in</h1>"; 
    $params = array('next' => URL . '?logged_out'); 
    $return .= '<br /><a href="' . $facebook->getLogoutUrl($params) . '">logout</a>'; 

}else{ 

    // login man! 
    $login_url = $facebook->getLoginUrl( 
     array( 
      'scope' => 'read_stream, publish_stream, manage_pages, photo_upload', 
      'next' => URL . '?logged_in' 
     ) 
    ); 
    $return .= 'Please <a href="' . $login_url . '">login.</a>'; 

} 

echo $return 

?> 
+0

Siempre cerrará la sesión con éxito y al eliminar la identificación de la sesión después del intercambio, el SDK no puede continuar la sesión. –

1

Asegúrese de utilizar el siguiente código:

$params = array('next' => 'https://yourUrl/logout'); 
     $data['logoutUrl'] = $this->facebook->getLogoutUrl($params); 

para redirigir la página a un controlador de cierre de sesión o una página y luego matan a las sesiones de esa página.

Cuestiones relacionadas