2012-06-07 51 views
0

請調試,這是我網站上的一個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庫來壓制錯誤。

錯誤與代碼無關。

回答

1

解決方案:嗯,我正在更新這個讓每個人都知道我確實發現了導致無限重定向循環的問題。 (這也是一個相當晚的更新,像晚了幾年,但無論如何...)

這樣做的原因是一個事實,即Facebook的庫吐出一個錯誤(缺少隱私政策內部應用程序/ Facebook的所有應用需求),而每次發生這種情況它會向用戶發送回到最後一頁(特別是install.php頁面),但是因爲我的腳本將用戶發送到Facebook,它只是進入無限循環。
Facebook將繼續發送用戶回來,而我的腳本將繼續發送用戶到Facebook。

我解決了這個問題,通過評論所有throw $e;裏面的Facebook庫來壓制錯誤。由於這只是因爲缺少隱私政策&沒有任何代碼相關,所以這樣做感覺很好。

錯誤與代碼無關。

3

我的餅乾沒有被禁用,所以我不認爲就是這樣。

不要假設 - 檢查 ...!

與重定向組合設置的Cookie有時可能會非常棘手。也許最好不要依賴cookie,而是按照它應該工作的方式實現服務器端認證。

+0

該腳本實際上並不需要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

+0

呃......有人告訴我說它適用於他們......所以我非常樂意得出結論說我必須瘋了。 :D – Mafia

+1

也適用於我。 – CBroe

0

我遇到了同樣的問題。我查了幾次代碼,所有代碼似乎都沒問題。做完所有事情之後,我檢查我的應用ID和祕密,並意識到(愚蠢的)配置數組中的祕密是錯誤的。更改密碼後,刷新問題消失。如果您只在IE中遇到此問題,請嘗試將header('P3P: CP="CAO PSA OUR"');置於頁面頂部。