请调试,这是我网站上的PHP页面,用于处理应用程序的Facebook权限。
问题 - 我的用户应该:
>> 点击我网站上的链接(“安装链接”)
>> 发送到页面:install.php
处理Facebook身份验证的内容
>> 然后重定向到目标网页:index.php
当用户点击该链接时,它最初是:
http://SITE.COM/install.php?cover=image.jpg&id=001&title=TITLE+HERE
在Firefox上,这就是发生的事情 - 用户被重定向到我无法弄清楚的无限循环,并且它永远不会结束或停止。<登记/> (我在3种浏览器上尝试过它:Chrome,Firefox和Safari - 这只发生在FIREFOX上)
http://SITE.COM/install.php?cover=image.jpg&id=001&title=TITLE+HERE&state=df50b9c92366fe3167a561b74b570ab1&code=AQAnWnd4lcDVUhb34F5OTnE4ef9y_H3wqRarcse69ELjf5cWeT_MvAbMkIELaUDeoDCTyyge3FrbLNbhnbInAF0ksk9LREmkOygzXN1WDja_yGdSmZS_z_LfL2JtCfIFZKO72ilIkCUPFy5GmoKyQf_XEEacG1Wxp5jnRD-nJeEdiq8tjVYbK0Q6LpD2r_RIhh2SnFfra_MbZu_rBEOyiHx1#_=_
添加了新参数:&state=
和&code=
,这些新参数通过刷新自身并生成新变量来保持浏览器的忙碌。这就像一场永无止境的等待。
这是处理事物的install.php
页面:
(假设已建立数据库连接,并且正确填写了秘密)
require_once('./facebook.php'); // FACEBOOK LIBRARY
$config = array(
'appId' => '#',
'secret' => '#',
'fileUpload' => true,
);
$facebook = new Facebook($config);
$user_id = $facebook->getUser();
define('REDIRECT_URI',"http://SITE.COM/covers/index.php?cover=uploaded&id=".$_GET['id']."&title=".$_GET['title']."");
// GET IMAGE FROM URL
$img = $_GET['cover'];
$photo = './covers/'.$img.''; // PATH TO THE PHOTO ON THE LOCAL FILESYSTEM
$caption = 'I found this Cover at <3 http://SITE.COM';
if($user_id) {
try {
// UPLOAD PHOTO TO USER'S PROFILE
$ret_obj = $facebook->api('/me/photos', 'POST', array(
'source' => '@' . $photo,
'message' => $caption
)
);
$login_url = $facebook->getLoginUrl($params = array('redirect_uri' => REDIRECT_URI));
echo ("<script> top.location.href='".$login_url."'</script>");
} catch(FacebookApiException $e) {
$login_url = $facebook->getLoginUrl( array(
'scope' => 'email,status_update,publish_stream,photo_upload'
));
echo '<script> window.location = "' . $login_url . '"; </script>';
error_log($e->getType());
error_log($e->getMessage());
}
$api_call = array(
'method' => 'users.hasAppPermission',
'uid' => $user_id,
'ext_perm' => 'publish_stream'
);
$can_post = $facebook->api($api_call);
if ($can_post) {
$user = $facebook->api('/me');
$photolink = 'http://graph.facebook.com/'.$user['id'].'/picture';
# ACTIVE SESSION, CHECK IF THE USER HAS ALREADY REGISTERED
$query = mysql_query("SELECT * FROM users WHERE account = 'facebook' AND userId = " . $user['id']);
$result = mysql_fetch_array($query);
# IF NOT, ADD USER TO DATABASE
if (empty($result)) {
$query = mysql_query("INSERT INTO users (oauth_uid, userId, username, first_name, last_name, email, picture, account) VALUES ('facebook', '{$user['id']}', '{$user['name']}', '{$user['first_name']}', '{$user['last_name']}','{$user['email']}', '".$photolink."', 'facebook')");
$query = mysql_query("SELECT * FROM users WHERE id = " . mysql_insert_id());
$result = mysql_fetch_array($query);
}
# NOW POST THIS ON USER'S TIMELINE
$facebook->api('/' . $user_id . '/feed', 'post', array(
'message' => 'JUST A TEST!',
'name' => 'APP TESTING',
'description' => 'THIS IS A TEST',
'caption' => 'This is just a TEST! Hooray!',
'picture' => 'http://test.com/test.jpg',
'link' => 'http://SITE.COM/'
));
echo 'Posted!';
} else {
die('Permissions required!');
}
echo '<br /><a href="' . $facebook->getLogoutUrl() . '">logout</a>';
} else {
// NOT LOGGED IN
$login_url = $facebook->getLoginUrl( array( 'scope' => 'email,status_update,publish_stream,photo_upload') );
echo '<script> window.location = "' . $login_url . '"; </script>';
}
(该脚本在Chrome和Safari上按预期工作。)
我是唯一一个测试它的人,所以当我说“用户”时,我实际上只是指自己。的 O)
我的Cookie未被禁用,所以我不认为是这样。
任何人都可以弄清楚是什么了吗?谢谢你的时间,我很感激。
如果我没有在我的脸书上安装该应用程序,它实际上会通过以下网址进入 oauth对话框页:
https://www.facebook.com/dialog/oauth?client_id=225230310923314&redirect_uri=http%3A%2F%2FWWW.SITE.COM%2Fcovers%2Finstall.php%3Fcover%3D685970AG58759_1338938036.jpg%26id%3D151%26title%3DZoidberg%2Bof%2BFuturama&state=f4bb3c13a2392fe0e24c3dc539e18aae&scope=email%2Cpublish_stream%2Cphoto_upload
然后,如果继续,请在此URL处请求额外的权限:
https://www.facebook.com/dialog/permissions.request
所以至少我们知道它走得那么远...... 现在在这个页面上,我很害怕点击“允许”,因为不可避免的重定向会发生。
但无论如何, allooow ......
奇怪的是,它重定向到BACK install.php
......即使它现在应该转到index.php
。难怪它循环!但问题是,我不知道如何解决这个问题。 @ _ @
添加'redirect_uri' => 'INDEX.PHP'
会让它停止在Chrome和Safari上工作(正确重定向但不发布图片等),虽然它修复了Firefox中的重定向错误,但它不会执行任何操作脚本中指定的操作(例如发布,上传等),所以我们现在有3个浏览器,而不是只有1个浏览器搞乱了。
所以这显然不是解决方案。
编辑 - 在尝试了所有内容之后,我意识到我是唯一一个遇到此问题的人,而且它适用于其他人。所以,YAY!
编辑:解决方案 - 好吧,我正在更新这个,让每个我真正做到的人找到问题导致无限重定向循环。
造成这种情况的原因是Facebook库正在吐出错误(缺少APP内的隐私政策),&amp;每当发生这种情况时,它会将用户发回到它所在的最后一页(特别是install.php页面),但由于我的脚本将用户发送到Facebook,这就是它进入无限循环的原因。 Facebook将继续向用户发送回信息,而我的脚本会继续将用户发送到Facebook。
我通过在Facebook库中注释掉所有// throw $e;
以解决错误来解决问题。
错误与代码无关。
答案 0 :(得分:3)
我的cookie没有被禁用,所以我不认为是这样。
不要假设 - 检查 ......!
与重定向结合使用的Cookie有时会很棘手。也许最好不要依赖cookie,并以其应该的方式实现服务器端身份验证。
答案 1 :(得分:1)
解决方案:好吧,我正在更新这个,让每个人都知道我确实找到了导致无限重定向循环的问题。 (这也是一个相当晚的更新,比如已经很晚了,但无论如何......)
造成这种情况的原因是Facebook图书馆出现了错误(缺少隐私政策在APP内部/ Facebook对所有APP的要求),每次发生这种情况都会发送错误用户回到它所在的最后一页(特别是install.php
页面),但由于我的脚本将用户发送到Facebook,它只是进入无限循环。
Facebook将继续向用户发送回信息,而我的脚本将继续将用户发送到Facebook。
我通过在Facebook库中注释掉所有throw $e;
来解决问题,以抑制错误。因为这只是因为缺少隐私政策和与代码无关,这样做感觉还可以。
错误与代码无关。
答案 2 :(得分:0)
我遇到了同样的问题。我检查了几次代码,一切似乎都没问题。做完一切后,我检查我的应用程序ID和秘密,并意识到(愚蠢的我)配置数组中的秘密是错误的。更改秘密后,刷新问题消失。如果您只在IE中遇到此问题,请尝试将header('P3P: CP="CAO PSA OUR"');
放在页面顶部。