请调试,这是我网站上的一个 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
处理事情的页面:(
假设建立了数据库连接并且正确填写了appId和Secret)
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 没有被禁用,所以我不认为就是这样。
谁能弄清楚发生了什么?谢谢你的时间,我很感激。
如果我的 Facebook 上没有安装该应用程序,它实际上会使用以下 URL 进入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
所以至少我们知道它走了那么远......
现在在这个页面上,我害怕点击“允许”,因为不可避免的重定向会发生。
但无论如何,请允许...
奇怪的是,它重定向到 BACK to install.php
... 即使它应该转到index.php
现在。难怪它循环!但问题是,我不知道如何解决这个问题。@_@
添加'redirect_uri' => 'INDEX.PHP'
使它停止在 Chrome 和 Safari 上工作(正确重定向但不发布图像等),虽然它修复了 Firefox 中的重定向错误,但它不会执行脚本中指定的任何操作(例如发布、上传等),所以我们现在有 3 个浏览器,而不是只有 1 个浏览器。
所以这显然不是解决方案。
编辑- 在尝试了一切之后,我意识到我是唯一一个遇到这个问题的人,它适用于其他人。所以,耶!
编辑:解决方案- 好吧,我正在更新这个,让我实际做过的每个人都找到导致无限重定向循环的问题。
造成这种情况的原因是 Facebook 库正在吐出一个错误(APP 内缺少隐私政策),并且每次发生这种情况时,它都会将用户返回到它所在的最后一个页面(特别是 install.php 页面) ,但是因为我的脚本将用户发送到 Facebook,这就是它进入无限循环的原因。Facebook 会继续将用户发送回去,而我的脚本会继续将用户发送到 Facebook。
我通过注释掉// throw $e;
Facebook 库中的所有内容以抑制错误来解决了这个问题。
这些错误与代码无关。