2012-11-01 77 views
0

我使用Facebook的PHP API來控制訪問我的Web應用程序的一些部分。基本上我只是檢查用戶是否登錄Facebook並且用戶在每次加載頁面時授權應用程序(基本許可),然後根據狀態打印事物。Facebook的PHP API允許用戶訪問無效的令牌

類似於,if($check_user_lo_npe) { echo 'Welcome!'; },就這麼簡單。好吧,一切工作正常,直到我意識到,如果用戶從Facebook的用戶設置中刪除應用程序,這意味着令牌失效,即使我知道令牌無效,我仍然從check_user_lo_npe 響應中得到響應因爲正如我所說,用戶刪除了該應用程序。這是怎麼了檢查權限:

function check_user_lo_npe() { 
    global $facebook; 
    global $data; 
    $fb_user_id = $facebook->getUser(); 
    if ($fb_user_id) { 
    try { 
     if(!isset($_SESSION['fb_user_profile'])) { 
      $_SESSION['fb_user_profile'] = $facebook->api('/me'); 
      $temparray = $facebook->api('/me/friends'); 
      $_SESSION['fb_user_friends'] = count($temparray[data]); 
     } 
     $data->reg_user($_SESSION['fb_user_profile'],$_SESSION['fb_user_friends']); 
     return array(true,''); 
    } catch (FacebookApiException $e) { 
     $fb_user_id = NULL; 
     return array(false,$e->getMessage()); 
    } 
    } else { 
     return array(false,''); 
    } 
} 

我需要當用戶刪除應用程序,所以我可以再次將其發送到登錄界面來實現,該功能應該檢測時,有一個例外,但不知何故,我沒有得到任何...爲什麼?

回答

1

那些$_SESSION變量是由您的應用程序設置的,而不是由Facebook SDK設置的嗎? 如果您未嘗試訪問Facebook會話,您無法確定該會話是否仍然有效/

如果您需要檢查每個頁面是否仍有活動的Facebook會話,請查看Javascript SDK中的FB.GetLoginStatus() ,或者進行API調用(例如)/me/permissions來檢查您的訪問令牌是否仍然有效

也就是說,只需要一個異常處理程序就可以輕鬆地檢測訪問Facebook API的嘗試何時失敗,讓它在當時通過認證流程發送用戶。

+0

我不認爲它已經越過了'if($ fb_user_id)'部分,但假設它是正確的。 – doublesharp

+0

我不明白爲什麼會話必須處理這個問題,我只是將一些數據存儲到會話變量中,問題是即使該令牌無效,函數返回TRUE也不會在會話變量中檢查任何內容。 – DomingoSL

+0

不會'fb_user_id'填充提供給SDK代碼的cookie中的任何內容嗎?即使該應用已從用戶的Facebook個人資料中刪除,直到您銷燬會話/清除cookie/etc – Igy

0

您的if ($fb_user_id)行可能評估爲false,這會導致您在else語句中使用return array(false,'');,從不觸發異常。

如果您確實已經通過身份證檢查,看起來您在刪除應用程序之前將數據放入$_SESSION,然後再重新檢查它。一旦你在$_SESSION中有了它,如果你不回到Facebook去驗證,沒有理由拋出異常。