請調試,這是我網站上的一個PHP頁面,用於處理應用程序的Facebook權限。Facebook無限循環(&state =和&code = params保持刷新,但只在FIREFOX上)PHP
問題 - 我的用戶應該:
>>點擊一個鏈接在我的網站(「安裝環節」)
>>獲取發送到一個頁面: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)
我的餅乾沒有禁用,所以我不認爲就是這樣。
任何人都可以弄清楚怎麼了?謝謝你的時間,我很感激。
如果我沒有在我的Facebook安裝的應用程序做,它實際上到達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
然後如果你繼續,在被要求額外權限這個網址:
https://www.facebook.com/dialog/permissions.request
所以至少我們知道它去那麼遠......
現在在這個頁面上,我很害怕點擊「允許」,因爲不可避免的重定向會發生。
但無論如何,allooow ...
奇怪的是,它重定向到回install.php
...即使它現在應該頭部到index.php
。難怪它循環!但事情是,我不知道如何解決這個問題。 @ _ @
添加'redirect_uri' => 'INDEX.PHP'
使其停止在Chrome和Safari上正常工作(重定向正確但不會發布圖像等),儘管它修復了Firefox中的重定向錯誤,但它也不會執行任何操作在腳本中指定的操作(例如發佈,上傳等),所以我們現在有3個瀏覽器而不是1個瀏覽器。
所以這顯然不是解決方案。
編輯 - 嘗試過一切後,我意識到,我有這個問題的唯一一個,和它的作品爲別人着想。所以,YAY!
編輯:解 - 嗯,我更新這讓大家,其實我沒有找到這引起了無限重定向循環的問題。
原因是Facebook庫發出錯誤(APP內缺少隱私策略),&每當發生這種情況時,它都會將用戶返回到最後一頁(特別是安裝.php頁面),但是因爲我的腳本將用戶發送到Facebook,這就是爲什麼它會陷入無限循環。 Facebook會繼續發送用戶,而我的腳本將繼續發送用戶到Facebook。
我解決了這個問題,通過評論所有// throw $e;
裏面的Facebook庫來壓制錯誤。
錯誤與代碼無關。
該腳本實際上並不需要cookie,頁面('install.php')應該會將用戶發送到服務器端身份驗證,但它甚至不會到達那裏。它停止無處不在,只是一個永遠刷新的瀏覽器,它的URL上現在有'&state ='&'&code ='參數。通常情況下(在Chrome和Safari上),該頁面會直接發送到服務器端身份驗證的FB,然後再發送回其重定向URI。但在FF上,它的行爲有所不同。 [試一試?](http://cute-spot.com/covers/install.php?cover=183391AG94673_1338950361.jpg&id=156&title=Bob+Marley+in+Reggae+Colors) – Mafia
呃......有人告訴我說它適用於他們......所以我非常樂意得出結論說我必須瘋了。 :D – Mafia
也適用於我。 – CBroe