2011-06-03 55 views
2

我在CodeIgniter框架內的github.com/facebook上使用修改後的版本php-sdk版本3.0.0示例代碼作爲幫助。Facebook上的OAuthException圖形API註銷,刷新後工作

我的問題是,正如標題所說:當我點擊註銷錨(由$Facebook->getLogoutUrl()提供)我重定向回到同一頁面,並收到OAuthException:

Fatal error: Uncaught OAuthException: Error validating access token: The session is invalid because the user logged out. thrown in [...]/base_facebook.php on line 959 

當我刷新,它加載像通常那樣的「登錄」錨點。在最初的重定向上沒有發生的刷新/回發上發生了什麼?

我意識到這是有限的信息,但由於這個問題,我認爲這可能是一個簡單的修復。

編輯:這個職位似乎是相關的:http://forum.developers.facebook.net/viewtopic.php?id=71219

特別是這一行:

setcookie('fbs_'.$facebook->getAppId(), '', time()-100, '/', '.domain.com'); 

但是,我不知道如何實現這一點,仍然使用$facebook->getLogoutUrl();

在此先感謝,只是讓我知道是否有更多的信息是必要的。

回答

2

我有同樣的問題,幾乎把我的頭髮拉出來。然而,經過一番調查,問題似乎是一個違規的cookie。上登出這條線應該修復它:

setcookie('fbs_'.$facebook->getAppId(), '', time()-100, '/', '.domain.com');

確保添加」。'如果子域名正在被使用,則在域名之前。

我希望這有助於!

+0

是的,我在Facebook開發者論壇上也遇到過這個問題。資料來源:http://forum.developers.facebook.net/viewtopic.php?pid=273884#p273884 – 2011-06-23 12:18:37

1

從你的錯誤看起來你的網站仍然會嘗試使用SDK連接到Facebook。當您運行Facebook提供的註銷功能時,請務必清除觸發Facebook調用的會話或存儲空間。

這很可能是他們沒有被清除之前,你嘗試你的Facebook註銷,這就是爲什麼它仍然認爲你有一個連接,但工作得很好刷新。

+0

這似乎是這個問題。我希望有處理一個簡單的方法它比製作我自己的註銷網址(儘管這不是太困難)。爲什麼會話不能從facebook.com重定向到我的doma在,但它會刷新? – 2011-06-07 13:06:27

1

我最終什麼事做的是:

  1. $facebook->getLogoutUrl(array('next' => site_url('logout')));
  2. 然後在 '退出' 控制器:
    $_SESSION = array();
    $this->load->view('myoriginalview');

在註銷,Facebook的註銷網址的查詢字符串redirect_uri值被設置爲重定向到'註銷'控制器,然後清除會話並加載視圖首先存在註銷按鈕。一切正常。現在我只需要弄清楚如何處理過期的會話,而不是登出用戶-_-

編輯:
我現在所做的是作爲描述無效以適當方式餅乾Facebook開發者論壇。我真的希望他們的文檔更好,並將其描述爲他們的PHP SDK。

2

至於建議,我想:

setcookie('fbs_'.$facebook->getAppId(), '', time()-100, '/', '.domain.com');

這沒有奏效。我所做的,是剛剛從FB示例代碼複製:

// 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) { 
    $logoutUrl = $facebook->getLogoutUrl(); 
} else { 
    $loginUrl = $facebook->getLoginUrl(); 
} 

中間部分,與如果試圖獲得user_profile,是一個測試,以獲取用戶的個人資料,如果失敗,用戶標識將被取消設置。這將使getLoginUrl()和getLogoutUrl()的最後部分正確。

我相信設置cookie是比較正確的,而不是試圖請求,看看它是否失敗......但自從setCookie方法沒有工作,我沒有選擇:(

愚蠢Facebook的返回令牌與此$user = $facebook->getUser();,在實際的用戶將被註銷。

希望這有助於那些誰是有需要。