我对Facebook的平台不断变化的,脆弱的结构以及缺乏体面和最新的文档感到有点生气。
目前,我正在从 FBML 迁移一个应用程序,因为它已弃用到 iFrame 应用程序,并且在身份验证时遇到问题。目前,我有一个全局引导脚本,该脚本在每个页面视图上加载,其中包含与身份验证相关的以下内容:
// attempt to authenticate against Facebook platform
require dirname(__FILE__) . '/facebook.php';
$facebook = new Facebook(array(
'appId' => APP_ID,
'secret' => SECRET,
'cookie' => true
));
$session = $facebook->getSession();
$user = null;
if ($session) {
try {
$uid = $facebook->getUser();
$user = $facebook->api('/me');
}
catch (FacebookApiException $e) {
error_log($e);
}
}
if (!$user) {
$loginUrl = $facebook->getLoginUrl(array(
'req_perms' => 'email,user_likes',
'next' => CANVAS_URL.'/'
));
echo '<script>top.location.href="'.$loginUrl.'";</script>';
exit;
}
这是根据官方Facebook PHP SDK和开发人员文档中的示例组合在一起的,但是当第一次加载应用程序时,它只是在一个讨厌的重定向圈中兜兜转转,我不知道从哪里开始调试,因为我没有什么可参考的Facebook。
是否有人获得了验证Facebook iFrame应用程序的工作样本,或者可以看到我上面的代码片段存在固有问题?
提前谢谢。
编辑:忘了提到它与上面的代码一起进入重定向循环,但是如果我从调用中删除参数数组$facebook->getLoginUrl()
那么它最终会脱离循环并脱离Facebook本身,而是转到Facebook的iFrame容器之外的画布URL。例如,URL 变为 http://www.woohoobingo.com/facebookv2/?session={...}
而不是 http://apps.facebook.com/woohoobingo/
。
破解
了它。在我的index.php
文件顶部使用了以下 HTTP 标头:
header('P3P: CP="IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA"');
这条线对我有用
header('P3P: CP="IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA"');
但正如您所说,它在 safari 中不起作用,因为它不会修补它来存储 cookie,那么您可以使用替代方案关闭饼干
$facebook = new Facebook(array(
'appId' => APP_ID,
'secret' => SECRET,
'cookie' => false
));
并尝试在身份验证后使用访问令牌 @access_token 是在初始 POST 请求中传递到画布页面的 OAuth access_token。
$facebook->api('/me?access_token='.$access_token);
希望它有效