2012-04-28 49 views
6

He estado buscando horas para la solución a este problema, pero no puedo encontrar una que funcione para mí. Cuando hago clic en "Cerrar sesión" en mi sitio, la información del usuario sigue siendo visible y aún se muestra el botón de cerrar sesión. Aquí está el código:Facebook PHP SDK - no cerrará sesión correctamente

require 'facebook-php-sdk/src/facebook.php'; 

$facebook = new Facebook(array(
    'appId' => 'xxxx', 
    'secret' => 'xxxx', 
)); 

// Get User ID 
$user = $facebook->getUser(); 
var_dump($user); 
if ($user) { 
    try { 
    // Proceed knowing you have a logged in user who's authenticated. 
    $user_profile = $facebook->api('/me'); 
    } catch (FacebookApiException $e) { 
    error_log($e); 
    $user = null; 
    } 
} 

// Login or logout url will be needed depending on current user state. 

if ($_GET['logout'] == "yes") { 
setcookie('fbs_'.$facebook->getAppId(), '', time()-100, '/', 'http://gno.....ment/index.php'); 
session_destroy(); 
header("Location: ".$_SERVER['PHP_SELF'].""); 
} 

if ($user_profile) { 
    $logoutUrl = $facebook->getLogoutUrl; 
} else { 
    $loginUrl = $facebook->getLoginUrl(array('scope' => 'email,publish_stream,user_status', 
    'canvas' => 1, 
    'fbconnect' => 0, 
    'redirect_uri' => 'http://gno.....ment/index.php')); 
} 

..... .....

<?php if ($user): ?> 
<h3>You</h3> 
<img src="https://graph.facebook.com/<?php echo $user; ?>/picture"> 

<h3>Your User Object (/me)</h3> 
<pre><?php print_r($user_profile); ?></pre> 
<?php else: ?> 
<strong><em>You are not Connected.</em></strong> 
<?php endif ?> 

<?php if ($user): ?> 
<a href="<?php echo $logoutUrl; ?>">Logout of FB</a> 
<?php else: ?> 
<div> 
Login using OAuth 2.0 handled by the PHP SDK: 
<a href="<?php echo $loginUrl; ?>">Login with Facebook</a> 
</div> 
<?php endif ?> 

Parece que if ($_GET['logout'] == "yes") podría ser la respuesta para mí, pero no puedo hacerlo funcionar. No sé de dónde se obtiene logout o dónde se define?

Esto parece ser un problema común pero no lo puedo resolver. Realmente agradecería algo de ayuda.

Respuesta

20

Hacerlo con PHP SDK es realmente fácil, la documentación es realmente horrible. No necesita redireccionar a Facebook. Solo tiene que borrar la sesión que establece la clase de Facebook, hay una función para eso en la clase base de Facebook llamada destroySession(). Aquí lo estoy haciendo en un get.

require_once('libs/facebook.php'); 

$facebook = new Facebook(array(
    'appId' => '1121111110112', 
    'secret' => 'bcfsaasaaaaaa2b7adsae3a4dd5' 
)); 

if(isset($_GET['action']) && $_GET['action'] === 'logout'){ 
    $facebook->destroySession(); 
} 

El $ facebook-> getLogoutUrl() registra el usuario de Facebook.

+0

¡Gracias! Esta debería ser la respuesta aceptada. – celwell

+0

Gracias! No tenía idea de que me estaba desconectando de Facebook hasta que lo señaló. – Gavin

-1

Recuerdo que esto fue un gran dolor en una de mis aplicaciones. Parece que por fin lo que parecía el trabajo era:

jQuery(function() { 
    /* ... */ 
    FB.logout(); 
    window.location = 'some url'; 
}); 

que debería ser aproximadamente la misma sin jQuery (sólo ejecute FB.logout() en la carga de la página). AFAIR: No pude hacer que esto funcione en el lado del servidor en PHP. Espero eso ayude :).

+0

¿Está sugiriendo que use el jQuery o simplemente 'FB.logout () ' ¿Dónde en mi código debería poner esto? – garethdn

+0

debe ejecutar 'FB.logout' en cualquier controlador' onready' en el lado del cliente. (jQuery es justo lo que uso para configurar el controlador 'onready'). – wroniasty

+0

Esto no borrará la sesión de PHP .. –

3

Puede resolver este problema especificando el problema de cierre de sesión externo. Puede echar un vistazo a here

para obtener información detallada. Es un buen tutorial para este problema.

Esperanza esto ayuda

2

Para responder directamente a su pregunta

... No sé donde se incorpora cierre de sesión, ni a dónde se define?

Al crear su URL de cierre de sesión, añadir parámetro adicional 'Cerrar sesión'

$logoutUrl = $facebook->getLogoutUrl(array(
    'next'=>'http://yourdomain.com/facebook-test-search.php?logout=yes' 
)); 

Luego, en la secuencia de comandos, que se borre cookies de sesión y cuando isset($_GET['logout'])

2

Así es como puedo cierre de sesión utilizando la última PHP-SDK:

login.php

require_once("php-sdk/facebook.php"); 

// Create our Application instance (replace this with your appId and secret). 
$facebook = new Facebook(array(
    'appId' => 'xxx', 
    'secret' => 'xxx', 
)); 

// Get User ID 
$user = $facebook->getUser(); 

// We may or may not have this data based on whether the user is logged in. 
// 
// If we have a $user id here, it means we know the user is logged into 
// Facebook, but we don't know if the access token is valid. An access 
// token is invalid if the user logged out of Facebook. 

if ($user) { 
    try { 
    // Proceed knowing you have a logged in user who's authenticated. 
    $user_profile = $facebook->api('/me'); 
    } catch (FacebookApiException $e) { 
    error_log($e); 
    $user = null; 
    } 
} 

// Login or logout url will be needed depending on current user state. 
if ($user) { 
    $logout_params = array('next'=>'http://www.pittsburghpartycentral.com/logout.php'); 
    $logoutUrl = $facebook->getLogoutUrl($logout_params); 
} else { 
    $login_params = array(
         'scope' => 'email', 
         'display' => 'popup' 
         ); 
    $loginUrl = $facebook->getLoginUrl($login_params); 
} 

// This call will always work since we are fetching public data. 
$naitik = $facebook->api('/naitik'); 

?> 
<!doctype html> 
<html xmlns:fb="http://www.facebook.com/2008/fbml"> 
    <head> 
    <title>php-sdk</title> 
    <style> 
     body { 
     font-family: 'Lucida Grande', Verdana, Arial, sans-serif; 
     } 
     h1 a { 
     text-decoration: none; 
     color: #3b5998; 
     } 
     h1 a:hover { 
     text-decoration: underline; 
     } 
    </style> 
    </head> 
    <body> 
    <h1>php-sdk</h1> 
    <?php if ($user): ?> 
     <a href="<?php echo $logoutUrl; ?>">Logout (<?php echo $user_profile[first_name]; ?>)</a> 
    <?php else: ?> 
     <div> 
     Login using OAuth 2.0 handled by the PHP SDK: 
     <a href="<?php echo $loginUrl; ?>" onclick="javascript:void window.open('<?php echo $loginUrl; ?>','fb_popup','width=600,height=300,toolbar=0,menubar=0,location=0,status=0,scrollbars=0,resizable=0,left=0,top=0');return false;">Login with Facebook</a> 
     </div> 
    <?php endif ?> 

    <h3>PHP Session</h3> 
    <pre><?php print_r($_SESSION); ?></pre> 

    <?php if ($user): ?> 
     <h3>You</h3> 
     <img src="https://graph.facebook.com/<?php echo $user; ?>/picture"> 

     <h3>Your User Object (/me)</h3> 
     <pre><?php print_r($user_profile); ?></pre> 
    <?php else: ?> 
     <strong><em>You are not Connected.</em></strong> 
    <?php endif ?> 

    <h3>Public profile of Naitik</h3> 
    <img src="https://graph.facebook.com/naitik/picture"> 
    <?php echo $naitik['name']; ?> 
    </body> 
</html> 

de cierre de sesión.php

<?php 
    session_start();   //start session 
    $_SESSION = array(); //clear session array 
    session_destroy();  //destroy session 
?> 
<!doctype html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>Log Out</title> 
</head> 

<body> 
<p>You have successfully logged out!</p> 
<p>Return to the <a href="connect.php">connect</a> page</p> 

</body> 
</html> 
1

pude hacer cerrar la sesión al usuario de mi aplicación usando:

$facebook->destroySession(); 

El

$facebook->getLogoutUrl(); 

hace que el usuario se registra a partir de facebook, no de su aplicación.

0

Tuve algún tipo de problema similar con eso. Incluso

$facebook->destroySession(); 

no funcionó correctamente hasta que me quita

$facebook->getLogoutUrl(); 

llamada por completo. getLogOutUrl() agregó algunos parámetros que entraron en conflicto posteriormente con mi .htaccess y me llevaron a * "mod_fcgid: stderr: el token de estado CSRF no coincide con uno proporcionado" * error.

0

porque todavía tengo PHP 5.3 en mi servidor CentOS 6.7 en el año 2016 y no quiero tomar la molestia de actualizar la versión de PHP - Puedo seguir utilizando el antiguo facebookarchive/facebook-php-sdk en lugar de la más reciente facebook/facebook-php-sdk-v4 biblioteca.

Y aquí es cómo manejar el cierre de sesión en mi aplicación:

<?php 

require_once('facebook-php-sdk-3.2.3/src/facebook.php'); 

const TITLE  = 'My amazing app'; 
const REDIRECT = 'https://example.com/myapp/'; 

#Facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYPEER] = false; 
#Facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYHOST] = 2; 

$client = new Facebook(array(
     'appId' => REPLACE_ME, 
     'secret' => REPLACE_ME, 
)); 

if (isset($_REQUEST['logout'])) { 
     $client->destroySession(); 
     header('Location: ' . REDIRECT); 
     exit(0); 
} 

if ($client->getUser()) { 
     try { 
       $me = $client->api('/me?fields=id,first_name,gender'); 
       $body = '<PRE>' . print_r($me, TRUE) . '</PRE>'; 
     } catch (FacebookApiException $ex) { 
       error_log($ex); 
       $body = '<PRE>' . htmlspecialchars($e->getMessage()) . '</PRE>'; 
     } 
} else { 
     $body = sprintf('<P><A HREF="%s">Login</A></P>', $client->getLoginUrl()); 
} 

?> 

<!DOCTYPE HTML> 
<HTML> 
<HEAD> 
     <TITLE><?= TITLE ?></TITLE> 
</HEAD> 
<BODY> 
     <?= $body ?> 
     <P><A HREF="<?= REDIRECT ?>?logout">Logout</A></P> 
</BODY> 
</HTML> 

No se olvide de -

  1. Obtener ID de cliente web y secreto en Facebook console
  2. autorizar la https://example.com/myapp/ en el En el mismo lugar
Cuestiones relacionadas