2013-01-07 46 views
0

我正在使用Facebook PHP SDK。我根本不想使用JS SDK。Facebook PHP SDK使用獨立 - Facebook會話/ Cookie如何工作?

因爲getUser();從SDK可以返回一個用戶ID,即使用戶沒有登錄,我都選擇了使用try/catch語句來檢查,如果用戶登錄。

try 
{ 
    $me = $CI->facebook->api('/me'); 
    $CI->our_fb['is_fb']='YES'; 
    echo "hello"; 
} 
    catch(FacebookApiException $e) 
{    
    echo "catch"; 
} 

本聲明包含在全球包括我所有文件的文件(爲簡單起見)。

因此,根據情況,我生成一個Facebook登錄URL。預期的功能是用戶登錄到Facebook,授權應用程序,返回到設置在登錄URL中的重定向URI,try語句將在該點執行,並且$ CI-> our_fb ['is_fb']將被設置。

然而這並未發生。

  • 如果用戶已經登錄到Facebook並且該應用程序已獲得授權,則該功能完美無缺。 SUCCESS

  • 如果用戶沒有登錄到Facebook,一旦重定向變量未設置。失敗

  • 如果用戶已登錄,但重定向後未授權應用程序,則該變量未設置。失敗。

在後兩種情況下,如果您只是刷新頁面,變量設置爲 - SUCCESS。刷新頁面是不必要的/毫無意義的額外努力。

我的問題是,如果您需要登錄FB /或授權應用程序,例如您第一次使用FB登錄時,您有一個額外的不必要的刷新,我不知道爲什麼。

我懷疑這是與cookie/session有關嗎?哪一個保存我假設的訪問令牌會自動返回/傳遞給SDK,而不是同時設置?

任何人有任何想法?

+0

當你說「變量沒有設置」時,你是否也看到了「catch」?換句話說,是否拋出異常? – Madbreaks

+0

是的。拋出異常。對不清楚的道歉。 –

+0

你是否檢查過異常,看看它是什麼?例如'echo print_r($ e,true);'在catch塊中? – Madbreaks

回答

0

如果您在臉書(標籤或畫布)上有應用程序,由於signed_request與請求一起發送到您的應用程序,因此PHP SDK僅在初始加載頁面時獲取用戶標識。

但是,當應用程序刷新時,signed_request會丟失(因爲它是發送它的Facebook)。

因此,在這種情況下,您可以將signed_request附加到您在應用中使用的每個網址 - 但這並不是最優的,因爲signed_request不會被重新生成 - 也不會刷新。

您唯一真正的選擇是依靠JS SDK正確設置cookie並允許getUser按預期工作。這是必需的,因爲您被視爲Facebook中的第三方應用程序(位於iframe中),並且大多數瀏覽器都會阻止您設置cookie - 所以您需要爲JS處理JSF的工作。您可以搜索cross-domain cookiesthird-party cookie以獲得有關解決方法的說明,但這些解決方法只能通過JS腳本和iframe管理進行。

此外,一定要建立在JS SDK正確:channel filecookie allowed,併發送P3P頭(用於IE)。

您還可以檢查此相關的問題:A proper approach to FB auth

關於網站,同大多停留(但你沒有signed_request)。在這一點上,認真考慮使用JS SDK,因爲它更容易。否則,您可以確保您的應用流遵循以下指導原則:https://developers.facebook.com/docs/concepts/login/login-architecture/

+0

我指的是在外部網站上執行登錄功能,而不是應用程序選項卡/畫布。 –

+0

然後你只是沒有'signed_request'。免費發送,但同樣的想法大多停留,使用JS SDK更容易。如果你只想使用PHP,比確保你的流程實現如下:https://developers.facebook.com/docs/concepts/login/login-architecture/ –

+0

我對什麼更容易不感興趣:)我我有興趣單獨使用PHP。可悲的是,這並沒有回答關於Facebook PHP SDK如何與會話/ cookie一起工作的問題,因此爲什麼它不能在兩種概述的情況下工作。 –

0

我看到的方式是,如果用戶未登錄並且在頁面已經登錄之後嘗試避免刷新最初加載。 所以你可以做的是向你的網站上的另一個頁面發出ajax請求,例如id.php,它只是加載php sdk和echo $ userid;然後你可以在沒有刷新的情況下登錄後獲取用戶ID。

+0

這是一種解決方法,但從我的調查中使其工作需要刷新同一頁(我不知道爲什麼)+這是一個修復,而不是解釋爲什麼..我真的尋找一個解釋爲什麼/如何PHP的SDK與FB工作。謝謝 –

+0

好,所以我現在瞭解了一點,你必須做一個額外的(完全不必要的)刷新額外的重定向(技術上是刷新),所以是的,我好像會話訪問令牌正在保存但不是傳遞給facebook對象在第一次刷新時需要第二次傳遞它,這很奇怪。在重定向中有一個?code =跟蹤重定向url,你可以編寫自己的獲取訪問令牌的方法,避免第二次重定向http://developers.facebook.com/docs/howtos/login/login-對於桌面/,這樣你可以控制 –

0

基本上cookie用於保存簽名的請求,會話用於保存'狀態','代碼','access_token','user_id'。如果上述情況存在,則PHP SDK使用它們,而不管它們是否有效。

我認爲你的問題在於facebook發送的CODE。具體來說,這些線路在base_facebook.php:

if ($code && $code != $this->getPersistentData('code')) { 
    $access_token = $this->getAccessTokenFromCode($code); 

...

protected function getAccessTokenFromCode($code, $redirect_uri = null) { 
if (empty($code)) { 
    return false; 
} 

if ($redirect_uri === null) { 
    $redirect_uri = $this->getCurrentUrl(); 
} 
... 

因爲代碼是爲特定的URL發出有時會有這樣的情況:遊客到達www.example.com上。他授予權限並被重定向到example.com/login。但是代碼在那裏無效,所以getUserAccessToken返回false。當你刷新頁面時,你會得到相同的URL,一切都很好。

您正處於不使用getUser()的正確軌道上,因爲正如我在上面所寫的那樣,它會從會話中獲取(如果可用)。

+0

使用PHP SDK沒有簽名的請求..對吧?所以這隻有在與JS SDK集成時纔有意義。我明白你的意思 - 這是最接近答案的。也許你可以澄清?該代碼是爲特定頁面發佈的,因此爲什麼在同一頁面上進行刷新。它根據返回的代碼獲取訪問令牌,然後在連續的頁面上我們沒有代碼,訪問令牌必須通過getUser()和我相信的保存的會話獲得。所以我們得到這個訪問令牌並嘗試查詢API。如果它捕捉到一個異常,訪問令牌是無效的,我們shuld relgin? –

+0

當您的應用程序從Facebook中加載時,已簽名的請求可用。 你應該繼續使用getUser()就是不要依賴它。使用$ facebook-> getAccessToken()方法獲取accces標記並查詢圖形。如果有錯誤重定向到Facebook權限對話框。您應該獲得新的代碼並在重定向後使用getUser()重置所有會話數據。 –

+0

這個答案已經最接近回答這個問題了。我正在進一步研究,並將在週末之後跟進,然後將其標記爲完整且正確的答案。 –