在PHP 3.0 SDK中,没有getSession()或Facebook api之外的任何 session 处理可用。根据 this blog entry this bug report ,几天前,facebook的开发人员还以某种方式更新了JavaScript sdk。



但是,我不知道这是否真的影响了我的问题。像在this question's answer 中一样,我正在使用PHP检索OAuth对话框的访问 token ,并将新的访问 token 保存在 session 中。

当前解决方法

以下代码显示了我如何处理此 session 。 $_REQUEST['session']是OAuth对话框的响应内容。

if(isset($_REQUEST['session'])) {

    $response = json_decode(stripslashes($_REQUEST['session']), true);

    if(isset($response['access_token'])) {
        $this->api->setAccessToken($response['access_token']);
        $_SESSION['access_token'] = $this->api->getAccessToken();
    }

}
elseif(isset($_SESSION['access_token']) && ! isset($_REQUEST['signed_request']))
    $this->api->setAccessToken($_SESSION['access_token']);
elseif(isset($_REQUEST['signed_request'])) {
    Session::invalidate('fbuser');
    $_SESSION['access_token'] = '';
}

这是我处理用户数据的方式:
try {
    $this->user = Session::getVar('fbuser');
    if ($this->user === false || is_null($this->user)) {
        $facebookUser = $this->api->api('me?fields=id,name,first_name,last_name');
        $this->user = new FBUserModel(array('fbId' => $facebookUser['fbId'], ...));
        Session::setVar('fbuser', $this->user);
    }
}

问题

测试时一切看起来都很好。仅发生一次错误:设置权限后首次 。现在,由于该应用程序处于在线状态,因此似乎该错误平均发生在第二个用户中
$facebookUser = $this->api->api('me?fields=id,name,first_name,last_name');

与错误:
An active access token must be used to query information about the current user.

问题

那么为什么会这样呢?调试非常困难,因为错误似乎仅在应用程序身份验证和访问 token 更改后,才在用户首次进入应用程序时发生。甚至不是每次都这样。我应该如何使用新的PHP SDK处理 session 和访问 token ?

任何帮助将不胜感激!

编辑

我发现iFrame中的cookie/ session 存在一些IE问题。如图所示 in this blog post 。有了这个提示和进一步研究,我在 bootstrap 中添加了以下几行:
ini_set('session.use_trans_sid', 1);
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');

现在,它的功能要好得多,但是在步骤登录页面(身份验证)->公式->和注册之间,丢失了大约50个用户中的2个用户的信息。因此,我仍然错过了一些东西。

编辑2

我从编辑了我的用户处理
if ($this->user === false || is_null($this->user)) {
    // get user data
}


if ((is_object($this->user) && $this->user->fbId == '') || $this->user === false || is_null($this->user)) {
    // get user data
}

这似乎有所帮助。我认为主要问题是在我的 session 中的某个地方。

此外,我添加了一个try/catch块,以查看是否在我的应用程序中某处引发了Facebook OAuthException。在这种情况下,我将顶部位置重定向到Facebook页面和选项卡,以获得新签名的请求。尽管这可能有助于解决此问题,但我想防止我的应用程序不得不重定向用户。

编辑3

经过几天的密集调试和日志记录,我发现来自 FB.uiPermissions.request方法$_REQUEST['session']很少为空。

这是我的处理方式:

这是我一直包含的内容:
FB.provide("UIServer.Methods", {'permissions.request': {size : {width: 575, height: 300}, url: 'connect/uiserver.php', transform : FB.UIServer.genericTransform}});

并在表单提交上调用此功能。一直为我工作,但尽管如此,它仍然通过session == ''发送表单。
function getPermission(form) {

    session = $('#' + $(form).attr('id') + ' input[name="session"]');

    if($(session).val() != '') {
        form.submit();
        return;
    }

    FB.ui({method: "permissions.request", "perms": 'user_photos'}, function callback(info){
        if(info.status=='connected' && info.session !== null) {
            $(session).val(JSON.stringify(info.session));
            form.submit();
        }
    });
    return;
}

最佳答案

我现在正在使用 PHP SDK 3.x ,没有任何问题。

Naitik类的作者删除了 getSession()函数,现在,如果您想知道用户是否已通过身份验证,请使用 getUser()

对于访问 token ,这非常简单,使用此函数 getAccessToken(),您将获得访问 token 以进行 Graph或Rest API 调用。

$user = $facebook->getUser();

if ($user) {
//USER Logged-In
}
else {
//USER not Logged-In
}

//TO GET ACCESS TOKEN
$access_token = $facebook->getAccessToken();


//MAKE AN API CALL WITH IT
$user_info = $facebook->api('me?fields=id,name,first_name,last_name&access_token='.$access_token);

09-25 17:01
查看更多