2

我試圖嘗試的是在登錄時註銷我的網站,但未登出Facebook。這是我的代碼的簡化版本,從Facebook提供的示例中改編而來。Facebook api php destroySession不會破壞javascript會話/ cookie

目前會發生什麼事是,當註銷被擊中,會話被銷燬,重新加載頁面,然後將事件auth.login和auth.logout火訂閱頁面加載和發送的頁面進入重定向循環。

我試過在單獨的頁面上註銷代碼部分並給用戶一個點擊返回到該網站的鏈接,但auth.login在頁面加載時觸發並且將用戶重新登錄。

我在問的是如何以不會將用戶從Facebook註銷的方式銷燬會話,但不會在我的網站上自動重新授權用戶。無論我嘗試auth.login自動觸發並重新授權用戶!

<?php 


require 'include/facebook/facebook.php'; 

$facebook = new Facebook(array(
    'appId' => 'API KEY', 
    'secret' => 'API SECRET', 
)); 

if(isset($_POST['logout'])){ 
$facebook->destroySession(); 



if (isset($_SERVER['HTTP_COOKIE'])) { 
     $cookies = explode(';', $_SERVER['HTTP_COOKIE']); 
     foreach($cookies as $cookie) { 
      $parts = explode('=', $cookie); 
      $name = trim($parts[0]); 
      setcookie($name, '', time()-3600); 
      setcookie($name, '', time()-3600, '/'); 
      setcookie($name, '', time()-3600, '/','MY DOMAIN'); 

     } 
    } 

    $signed_request_cookie = 'fbsr_' . API KEY; 
    setcookie($signed_request_cookie, "", time()-3600, '/', 'MY DOMAIN'); 


} 
// See if there is a user from a cookie 
$user = $facebook->getUser(); 

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



?> 
<!DOCTYPE html> 
<html xmlns:fb="http://www.facebook.com/2008/fbml"> 
<body> 
    <?php if ($user) { ?>  


Your user profile is 
    <pre> 
    <?php print htmlspecialchars(print_r($user_profile, true)) ?> 
    </pre> 

    <form action = "" method = "post"> 

    <input type = "submit" name = "logout" value = "logout"/> 
    </form> 
<?php } else { ?> 
    <fb:login-button></fb:login-button> 
<?php } ?> 
<div id="fb-root"></div> 
<script> 
    window.fbAsyncInit = function() { 
    FB.init({ 
     appId: '<?php echo $facebook->getAppID() ?>', 
     channelUrl : '/channel.php', // Channel File 
     cookie: true, 
     xfbml: true, 
     oauth: true, 
     status: true 
    }); 
    FB.Event.subscribe('auth.login', function(response) { 

     alert('logging'); 
     window.location.reload(); 
    }); 
    FB.Event.subscribe('auth.logout', function(response) { 

     alert('logging out'); 
     window.location.reload(); 
    }); 
    }; 
    (function() { 
    var e = document.createElement('script'); e.async = true; 
    e.src = document.location.protocol + 
     '//connect.facebook.net/en_US/all.js'; 
    document.getElementById('fb-root').appendChild(e); 
    }()); 
</script> 
<br /> 
POST: 
<?php 
print_r($_POST); 
?> 

回答

0

它感覺像一個非常骯髒的方式來做到這一點,但我剛剛結束了包裝JS Facebook的初始化,並只有當有人點擊FB登錄按鈕時才運行它。我仍然不確定這是我創建的錯誤還是FB API的不足,如果任何人都可以給我任何指示,我會很感激。

function login_fb(){ 


    window.fbAsyncInit = function() { 
     FB.init({ 
     appId: '<?php echo $facebook->getAppID() ?>', 
     channelUrl : '/channel.php', // Channel File 
     cookie: true, 
     xfbml: true, 
     oauth: true, 
     status: true 
     }); 



     FB.Event.subscribe('auth.login', function(response) { 

     window.location.reload(); 
     }); 
     FB.Event.subscribe('auth.logout', function(response) { 

     window.location.reload(); 
     }); 
    }; 
    (function() { 
     var e = document.createElement('script'); e.async = true; 
     e.src = document.location.protocol + 
      '//connect.facebook.net/en_US/all.js'; 
     document.getElementById('fb-root').appendChild(e); 
     }()); 

} 


<a href ="#" onclick = "javascript:login_fb()">login</a> 
0

我注意到在你的事件訂閱,你不看從呼叫回來的響應,並一味地重新加載頁面。您應該檢查響應值,並且只在您確實需要時重定向。我很驚訝Facebook JS SDK將會在這些事件發生時甚至會發生一些不同的事情。

+0

該目的是填充有有關的Facebook用戶信息,並指示它們連接。這是問題,我通過使用PHP銷燬會話和cookie,然後由於某種原因JS可以在此之後重新驗證。 – MarkR 2012-02-15 18:10:38