0

我正在使用 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,'');
    }
}

我需要意识到用户何时删除应用程序,以便我可以再次将它们发送到登录屏幕,该功能应该检测何时出现异常,但不知何故我没有得到任何......为什么?

4

2 回答 2

1

这些$_SESSION变量是由您的应用程序设置的,而不是由 Facebook SDK 设置的,对吗?如果不尝试访问 Facebook 会话,您无法确定该会话是否仍处于活动状态/

如果您需要在每个页面上检查是否仍有活动的 Facebook 会话,请查看Javascript SDK 中的FB.GetLoginStatus(),或进行 API 调用(例如)/me/permissions以检查您的访问令牌是否仍然有效

也就是说,如果有一个异常处理程序来检测访问 Facebook API 的尝试何时失败,并在此时通过身份验证流程发送给用户,这可能很容易。

于 2012-11-01T21:11:49.127 回答
0

您的if ($fb_user_id)行可能评估为假,这会导致您return array(false,'');在 else 语句中,永远不会触发异常。

如果您确实通过了 ID 检查,那么您似乎是$_SESSION在他们删除应用程序之前将数据放入其中,然后没有重新检查它。一旦你有它$_SESSION,如果你不返回 Facebook 验证,没有理由会抛出异常。

于 2012-11-01T21:10:44.887 回答