2012-04-28 11 views
6

Ich habe stundenlang nach der Lösung für dieses Problem gesucht, kann aber keine finden, die für mich funktioniert. Wenn ich auf meiner Website auf "Abmelden" klicke, sind die Benutzerinformationen weiterhin sichtbar und die Schaltfläche "Abmelden" wird weiterhin angezeigt. Hier ist der Code:Facebook PHP SDK - wird nicht korrekt abmelden

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 ?> 

Es scheint, dass if ($_GET['logout'] == "yes") könnte die Antwort für mich sein, aber ich kann nicht daran zu arbeiten. Ich weiß nicht, woher logout stammt oder wo es definiert ist?

Dies scheint ein häufiges Problem zu sein, aber ich kann es nicht herausfinden. Ich würde wirklich etwas Hilfe schätzen.

Antwort

20

es mit PHP SDK zu tun, ist wirklich einfach, die Dokumentation ist einfach schrecklich. Sie müssen nicht auf Facebook umleiten. Sie müssen nur die Sitzung löschen, die von der Facebook-Klasse festgelegt wird. Dafür gibt es in der Facebook-Basisklasse eine Funktion namens destroySession(). Hier mache ich es auf einen bekommen.

require_once('libs/facebook.php'); 

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

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

Die $ facebook-> getLogoutUrl() protokolliert den Benutzer aus Facebook.

+0

Vielen Dank! Dies sollte die akzeptierte Antwort sein. – celwell

+0

Danke! Ich hatte keine Ahnung, dass es mich von Facebook abgemeldet hat, bis du darauf hingewiesen hast. – Gavin

-1

Ich erinnere mich, das war ein großer Schmerz in einer meiner Apps. Es scheint, dass endlich was zu arbeiten schien, war:

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

ich über das gleiche ohne jQuery sein sollte (nur FB.logout() auf Seite Last laufen). AFAIR Ich konnte das auf der Server-Seite in PHP einfach nicht zum Laufen bringen. Ich hoffe es hilft :).

+0

So schlagen Sie ich verwende die jQuery oder einfach nur 'FB.logout () '? Wo in meinem Code sollte ich das ausdrücken? – garethdn

+0

sollten Sie 'FB.logout' in jedem 'onready'-Handler auf der Client-Seite ausführen. (jQuery ist genau das, was ich verwende, um den 'onready'-Handler zu setzen). – wroniasty

+0

Dies wird die PHP-Sitzung nicht löschen. –

3

Sie können dieses Problem lösen, indem Sie das externe Logout-Problem angeben. Sie können einen Blick auf here

für weitere Informationen werfen. Es ist ein gutes Tutorial für dieses Problem.

this helps

2

Um

... Ich weiß nicht, direkt auf Ihre Frage zu beantworten, wo Abmeldung von bekommen ist oder wo sie definiert ist?

Wenn Sie Ihre Abmeldung URL erstellen, fügen Sie zusätzliche Parameter 'Abmelden'

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

Dann in Ihrem Skript, Sie klare Sitzung und Cookies, wenn isset($_GET['logout'])

2

Hier ist, wie ich die neueste PHP-SDK logout mit:

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> 

Logout.

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

konnte ich den Benutzer aus der Liste meiner App do abzumelden mit:

$facebook->destroySession(); 

Die

$facebook->getLogoutUrl(); 

der Benutzer von Facebook abgemeldet macht, der nicht von der App.

0

Hatten einige ähnliche Probleme damit. Selbst

$facebook->destroySession(); 

funktionierte nicht richtig, bis ich

entfernt
$facebook->getLogoutUrl(); 

vollständig Anruf. getLogOutUrl() hat einige Parameter hinzugefügt, die später mit meinem .htaccess kollidierten und dazu führten, dass * "mod_fcgid: stderr: CSRF-Status-Token nicht mit einem angegebenen" * Fehler übereinstimmte.

0

Da ich noch PHP 5.3 auf meinem CentOS 6.7 Server im Jahr 2016 habe und nicht den Ärger mit der Aktualisierung der PHP Version haben möchte, benutze ich immer noch die alte facebookarchive/facebook-php-sdk statt der neueren facebook/facebook-php-sdk-v4 Bibliothek.

Und hier ist, wie ich die Abmelde in meiner app handhaben:

<?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> 

Vergessen Sie nicht zu -

  1. Get Web-Client-ID und geheime bei Facebook console
  2. die https://example.com/myapp/ bei der Autorisieren selben Ort