我使用facebook php api来控制对我的webapp的某些部分的访问。基本上我只是检查用户是否登录到Facebook并且每次加载页面时用户都授权应用程序(基本权限),然后根据状态打印内容。
类似于if($check_user_lo_npe) { echo 'Welcome!'; }
,就像那样简单。好吧,一切都运行正常,直到我意识到如果用户从Facebook的用户设置中删除应用程序,这意味着令牌失效,我仍然从函数true
收到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,'');
}
}
我需要意识到当用户删除应用程序以便我可以再次将它们发送到登录屏幕时,该功能应该检测何时有异常,但不知何故我没有得到任何...为什么?
答案 0 :(得分:1)
那些$_SESSION
变量是由您的应用设置的,而不是由Facebook SDK设置的吗?
如果不尝试访问Facebook会话,您无法确定该会话是否仍处于活动状态/
如果您需要检查每个页面是否仍有活动的Facebook会话,请查看Javascript SDK中的FB.GetLoginStatus(),或拨打(例如)/me/permissions
进行API调用以进行检查您的访问令牌仍然有效
也就是说,只有一个异常处理程序可以很容易地检测到访问Facebook API的尝试何时失败,并让它在此时通过身份验证流程向用户发送。
答案 1 :(得分:0)
您的if ($fb_user_id)
行可能评估为false,这会导致您在else语句中return array(false,'');
,从不触发异常。
如果您确实通过了ID检查,看起来您在删除应用程序之前将数据放入$_SESSION
,然后再重新检查它。一旦你在$_SESSION
中拥有它,如果你没有回到Facebook进行验证,就没有理由抛出异常。