2012-04-28 50 views
6

我一直在尋找解決這個問題的小時數,但找不到適合我的解決方案。當我在我的網站上點擊「註銷」時,用戶信息仍然可見,並且註銷按鈕仍然顯示。下面是代碼:Facebook的PHP SDK - 將不會正常註銷

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

似乎if ($_GET['logout'] == "yes")可能是我的答案,但我不能得到它的工作。我不知道logout從哪裏得到或從哪裏定義?

這似乎是一個常見問題,但我不明白。我真的很感謝一些幫助。

回答

20

與PHP SDK做起來真的容易,文件是真的awfull。你不需要重定向到Facebook。你只需要清除Facebook類設置的會話,在Facebook基類中有一個名爲destroySession()的函數。在這裏,我正在做一個get。

require_once('libs/facebook.php'); 

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

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

$ facebook-> getLogoutUrl()會將用戶從Facebook中註銷。

+0

謝謝!這應該是被接受的答案。 – celwell 2014-03-21 00:35:39

+0

謝謝!直到你指出它之前,我都不知道它會將我從Facebook註銷。 – Gavin 2014-03-29 11:36:03

-1

我記得這是我的一個應用程序中的一個巨大的痛苦。看來,終於什麼似乎工作是:

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

我應約jQuery的不一樣(只是運行FB.logout()在頁面加載)。 AFAIR我只是不能在PHP中的服務器端工作。希望能幫助到你 :)。

+0

那麼你建議我使用jQuery或只是'FB.logout( )'?我應該把這個代碼放在哪裏? – garethdn 2012-04-28 18:54:48

+0

您應該在客戶端的任何'onready'處理程序中運行'FB.logout'。 (jQuery就是我用來設置'onready'處理程序的東西)。 – wroniasty 2012-04-28 19:35:36

+0

這不會清除PHP會話。 – 2013-10-30 12:37:08

3

您可以通過指定外部註銷問題來解決此問題。你可以看看here

瞭解詳細信息。這是一個很好的教程來解決這個問題。

希望這有助於

2

直接回答你的問題

... 我不知道在哪裏註銷從得到或定義它?

當您創建的退出網址,添加附加參數「退出」

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

然後在你的腳本,你清楚會話和cookie時isset($_GET['logout'])

2

這裏是我登出瞭如何使用最新的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> 

註銷。

$facebook->destroySession(); 

$facebook->getLogoutUrl(); 

使用戶可以從Facebook註銷,而不是從你的應用程序: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

我使用能夠執行從我的應用程序註銷用戶。

0

有一些類似的麻煩。 即使

$facebook->destroySession(); 

不正確,直到我刪除

$facebook->getLogoutUrl(); 

通話完全工作。 getLogOutUrl()添加了一些參數,這些參數稍後與我的.htaccess衝突並導致*「mod_fcgid:stderr:CSRF狀態令牌與提供的*錯誤不匹配。

0

因爲我在2016年的CentOS 6.7服務器上仍然有PHP 5.3,並且不想冒更新PHP版本的麻煩 - 我仍然使用舊的facebookarchive/facebook-php-sdk而不是新的facebook/facebook-php-sdk-v4庫。

這裏是我如何處理我的應用程序註銷:

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

不要忘記 -

  1. 獲取網絡客戶端ID和祕密在Facebook console
  2. 授權的https://example.com/myapp/在相同的地方