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