2011-12-23 71 views
0

你應該如何處理前一段時間登錄Facebook的人。來到你的網站,你應該繼續鏈接(因爲你發現他們已經登錄到Facebook),然後在頁面上,你指示他們給你這個錯誤。Facebook PHP SDK - OAuthException - OAuth2

Fatal error: Uncaught OAuthException: An active access token must be used to query information about the current user. thrown in /var/www/html/lib/base_facebook.php on line 1039

我不明白,你應該如何避免這種情況?這是否與你回到Facebook獲得access_token的簽名信息有關?看起來像這個簽名的信息可以過期(它有一個issued_at日期)。在您的網站流程中處理這個問題的正確方法是什麼?

你希望像這樣寫代碼:

<?php 
$user = $facebook->getUser(); 
try { 
    // attempt to do a call just to see if you are going to have this issue 
    $profile = $facebook->api('/me'); 
} catch (Exception $e) { 
    $user = false; 
} 
if ($user) { ?> 
    <a href="start.php">Begin</a> 
<?php } else { ?> 
    <fb:login-button scope="email" size="large">Connect</fb:login-button> 
<?php } ?> 

取而代之的是:

<?php 
$user = $facebook->getUser(); 
if ($user) { ?> 
    <a href="start.php">Begin</a> 
<?php } else { ?> 
    <fb:login-button scope="email" size="large">Connect</fb:login-button> 
<?php } ?> 

獲取$用戶從Facebook的SDK回似乎只告訴你有一個cookie。而不是,如果這將實際上工作,當你去做API調用。

UPDATE: 所以我用這種方法唯一的問題是什麼?當用戶確實對我的網站的cookie,但是API調用失敗 - 我告訴他們Connect按鈕。用戶點擊連接按鈕,它很快出現並消失。因爲它不是真正的'auth.login',所以用戶不會通過JavaScript重定向發送到我的start.php頁面。別人如何處理這個問題?我很難過。請告訴我,我是如何嘗試這樣做的,還有其他缺陷。

+0

是否檢查該域名,APP_ID和app_secret是在這兩個網站(您檢查FB用戶的一個存在,並在其上重定向一個)一樣嗎?並且用於在第一個網站上初始化Facebook對象的域應該是更高級別的域,然後是下一個網站。 – 2011-12-23 21:36:52

+0

這些都在同一個網站上。成功登錄後,我想將我的用戶從/(或index.php)重定向到start.php – BuddyJoe 2011-12-25 17:50:00

回答

0

你希望像這樣寫代碼:

是的,你將不得不處理OAuthException

但不是使用FBML登錄按鈕,您可以將用戶重定向到您的應用程序的Facebook登錄網址。您可以使用Facebook PHP SDK提供的功能getLoginUrl獲取網址。有關更多信息,請參閱getLoginUrl

對於電子郵件的權限,你可以使用下面的數組:

$params = array('scope' => 'email'); 

一旦成功登錄後,用戶會被重定向到重定向他的Facebook登錄應用程序頁面。

+0

讓我問你這是否也是常見的,也將它納入登錄。如果您的Facebook登錄失效(換句話說,您將保持登錄Facebook全天),那麼我將使用JavaScript SDK強制您註銷並重新登錄 - http:// stackoverflow。com/questions/2764436/facebook-oauth-logout – BuddyJoe 2011-12-27 21:32:53

+0

將用戶重定向到getLoginUrl並不意味着您將他從Facebook註銷;這意味着你不確定用戶的狀態,你想用facebbok檢查。 AFA我明白你沒有登錄用戶的訪問令牌。換句話說,您的應用沒有權限查詢用戶的「信息」。如果你有訪問令牌(用於查詢),那麼你一定沒問題。但你沒有。這意味着您要麼缺少權限,用戶已註銷,或者無法讀取會話(從cookie或GET)。在這種情況下,您將用戶重定向到Facebook登錄 – 2011-12-30 19:06:20

1

嘗試將訪問令牌傳遞給API調用,驗證用戶是否已授權您的應用程序。以下是我所做的,它應該有助於緩解您正在獲得的OAuthException。

$user = $facebook->getUser(); 

if($user) { 
    $access_token = $facebook->getAccessToken(); 
    $params = array('access_token' => $access_token); 
    try { 
     $me = $facebook->api("/me", $params); 
    } catch(FacebookApiException $e) { 
     $user = null; 
    } 
} 

if($me) { 
    // proceed with authenticated user with an active access token. 
}