2011-04-30 42 views
3

从thinkdiff.net开始tutorial我已经构建了一个简单的测试页面(本地环境)与facebook登录/注销链接。如果登录我想回显出fb用户API。Facebook PHP SDK错误验证访问令牌

Im使用最新facebook PHP SDK (v.2.1.2)

看来工作,但是当我退出,我收到此异常:

FacebookApiException Object 
(
[result:protected] => Array 
    (
     [error] => Array 
      (
       [type] => OAuthException 
       [message] => Error validating access token: The session is invalid because the user logged out or because auth.expireSession was invoked. 
      ) 

    ) 

[message:protected] => Error validating access token: The session is invalid because the user logged out or because auth.expireSession was invoked. 
[string:Exception:private] => 
[code:protected] => 0 
[file:protected] => C:\wamp\www\fb\facebook.php 
[line:protected] => 543 
[trace:Exception:private] => Array 
    (
     [0] => Array 
      (
       [function] => _graph 
       [class] => Facebook 
       [type] => -> 
       [args] => Array 
        (
         [0] => /me 
        ) 

      ) 

     [1] => Array 
      (
       [file] => C:\wamp\www\fb\facebook.php 
       [line] => 492 
       [function] => call_user_func_array 
       [args] => Array 
        (
         [0] => Array 
          (
           [0] => Facebook Object 
            (
             [appId:protected] => 1819654718***** 
             [apiSecret:protected] => a2fccb8e93638b50c8d6b2********** 
             [session:protected] => 
             [signedRequest:protected] => 
             [sessionLoaded:protected] => 1 
             [cookieSupport:protected] => 1 
             [baseDomain:protected] => 
             [fileUploadSupport:protected] => 
            ) 

           [1] => _graph 
          ) 

         [1] => Array 
          (
           [0] => /me 
          ) 

        ) 

      ) 

     [2] => Array 
      (
       [file] => C:\wamp\www\fb\fb.php 
       [line] => 33 
       [function] => api 
       [class] => Facebook 
       [type] => -> 
       [args] => Array 
        (
         [0] => /me 
        ) 

      ) 

    ) 

[previous:Exception:private] => 
) 

这是我的测试页面代码

$fbconfig['appid'] = "18196**********";  
$fbconfig['api'] = "5c6910be575e4e688ac6d**********";  
$fbconfig['secret'] = "a2fccb8e93638b50c8d6b2**********"; 

try 
{   
    include_once "facebook.php"; 
}  
catch(Exception $o) 
{   
echo '<pre>';   
print_r($o);   
echo '</pre>';  
}  
// Create our Application instance.  
$facebook = new Facebook(array('appId' => $fbconfig['appid'],'secret' => $fbconfig['secret'],'cookie' => true));  

$session = $facebook->getSession();  
$fbme = null;  
// Session based graph API call.  
if (!empty($session)) 
{  
    d($session); 
    try 
    {   
    $uid = $facebook->getUser();   
    $fbme = $facebook->api('/me');  
    } 
    catch (FacebookApiException $e) 
    {   
    d($e);  
    }  
}  
function d($d) 
{   
echo '<pre>';   
print_r($d);   
echo '</pre>';  
} 


if ($fbme) 
{ 
    $logoutUrl = $facebook->getLogoutUrl(); 
    echo"<a href='{$logoutUrl}'>logout</a>"; 
    d($fbme); 
} 
else 
{ 
    $loginUrl = $facebook->getLoginUrl(array('req_perms' => 'email,read_stream,user_birthday')); 
    echo"<a href='{$loginUrl}'>login</a>"; 
} 

感谢

卢卡

回答

5

我会尝试在注销时手动清除会话。把GET参数上返回URL,或者使用不同的返回URL,然后做到这一点:

$facebook->destroySession(); 

的问题是,用户登录后,即使退出会话cookie仍然存在。当用户返回您的页面时,您正尝试使用该过期的会话发出请求。祝你好运。

+0

是啊,但为什么这个问题不会在??我不知道该教程发生= )也许取决于错误的设置? – luca 2011-04-30 09:16:50

+0

这是一个一年的教程,从那以后平台变了很多。他们使用fbml作为注销按钮,而不是PHP SDK,而fbml现在已被弃用,这是不可靠的。从我可以告诉你在这里写的代码是你的代码,只是基于教程。 – DannyKK 2011-04-30 09:24:22

+0

好吧,但你认为我的登录和登出fb用户的正确方法(设置会话为空)还是我应该做其他事情?=) – luca 2011-04-30 10:54:44

1

尼斯的答案,你必须调用destroySession()之前,首先

facebook->destroySession(); 

,那么你可以调用getLoginUrl()

+0

这适用于最新的API从10/05/2012。 '$ facebook-> setSession(null);' 不再有效。 “setSession()”不是一种方法。 – 2012-05-10 20:58:21

相关问题