当前位置: 首页 > 面试题库 >

如何使用Facebook PHP SDK 3.0正确处理会话和访问令牌?

莫欣悦
2023-03-14
问题内容

在PHP 3.0 SDK中,没有getSession()或没有来自Facebook api的会话处理可用。根据
此博客条目
此错误报告
,几天前,facebook的开发人员还以某种方式更新了JavaScript sdk 。

在过去的几天中,托管的JS SDK进行了更改,从而破坏了它与当前PHP SDK(2.x和3.x)之间的所有兼容性。在其网站上同时使用JS和PHP
SDK的开发人员可能会看到服务器端API失败。

但是,我不知道这是否真的影响了我的问题。就像在
这个问题的答案中 一样,我正在使用PHP检索OAuth对话框的访问令牌,并将新的访问令牌保存在会话中。

当前解决方法

以下代码显示了我如何处理此会话。$_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.

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

任何帮助将不胜感激!

编辑

我发现iFrame中的cookie /会话存在一些IE问题 。有了这个提示和进一步的研究,我在引导程序中添加了以下几行:

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
}

这似乎有所帮助。我认为主要问题出在我的会议上。

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

编辑3

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

这是我的处理方式:

这是我一直包含的内容:

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;
}

问题答案:

我的解决方案

好吧,由于在新的JS
SDK推出之前,我所做的只是一个解决方法,因此似乎没有最佳实践。设置session.use_trans_sid为1并添加P3P标头有助于克服IE
iFrame cookie问题(请参阅我的第一个编辑)。经过几天的大量调试,我发现FB.ui
permission_request不会每次都发送新的访问令牌(<5%)。

如果发生这种情况,那就出问题了。但是,这点小事使我发疯。由于这种情况很少发生,因此我可以将用户重定向回Facebook选项卡以获取新的签名请求。希望有了新的JS
SDK,这将不再发生。



 类似资料:
  • 我正在Codeigniter中创建API。在这个API中,我为用户提供了一个登录函数。如果登录成功,我将在CI会话中设置用户数据,并将会话返回给用户。 现在,用户可以使用该会话ID来验证他自己的所有其他请求,如添加/更新/删除。基本上,我希望当用户发送下一个请求时,我可以根据他的会话ID验证他的凭据。 客户请求代码: 上面是一个从客户端到服务器的登录请求示例。在服务器端,服务器验证客户端提供的凭据

  • 问题内容: 如何以一种优雅的方式通过id获取任何HTTP会话或Web应用程序(Java 2 EE)中当前所有活动的HTTP会话? 当前,我有一个会话,一旦创建,便将其放入,一切正常,我可以随时通过会话ID从该映射中检索HTTP会话,但是看起来对象将永远不会完成……即使会话使该映射无效仍然引用无效的会话对象…我也已经阅读了这篇文章,在我看来,这是不可接受的… 换句话说,我需要一种可能性来查看任何Ht

  • 我已经将我的nodejs应用程序配置为使用MongoDB。我可以成功地连接和添加数据到我的mongodb实例。我的应用程序配置如下(敏感信息编辑): 如果我点击endpoint,那么pizza文档就会很好地在数据库中创建,但我注意到连接从未关闭;这意味着endpoint从不将“all good”字符串作为响应发送。而且,对的任何后续请求都会抛出以下错误: 我似乎没有正确处理promise和asyn

  • 我有下面的方法,每隔几秒钟插入一大批记录。运行一段时间后,我得到如下错误: 错误:通信链接失败 从服务器成功接收的最后一个数据包是523毫秒前。上次成功发送到服务器的数据包是8毫秒前。 May 16, 2013 9:48:30 AM com.mchange.v2.c3p0.stmt.GooGooStatementCache checkinStatement INFO: 签入语句问题,丢弃。 com

  • 我试图从URL列表中下载.html中的网页,但其中一些网站使用会话cookie,当我尝试Jsoup.connect(“URL”)时,我得到了403。 因此,我使用了Map/HashMap作为如何使用Jsoup管理cookies、维护cookies、使用Jsoup进行会话、检索cookies..,但仍然是403。 真正让我吃惊的是,一个像Mac Automator这样简单的应用程序可以完成这项工作,

  • 我试图找出如何单击按钮“停用”。这是html代码: 我试着这样点击这个按钮: 但是这没有帮助