2011-08-24 54 views
1

我正在嘗試創建一個Rails應用程序,該應用程序將作爲Canvas應用程序(apps.facebook.com/example)顯示在Facebook上,並且還將顯示在單獨的URL(example.com)上。我有最艱難的時間試圖獲得用戶認證/權限爲兩個接入點工作。如何檢測Facebook畫布應用程序?

我目前遇到的主要問題是無法檢測到正在使用哪個接入點。好像檢測signed_request應該是一條路,但是,在Canvas應用程序的iFrame內部導航時,該變量不會顯示出來。例如,signed_request用於應用的主頁,但在點擊指向另一個應用頁面的鏈接後,signed_request消失。如果我直接導​​航到應用的頁面(apps.facebook.com/example/another_page),它會再次出現。

任何想法我應該如何處理這個?

回答

0

我建議你用會話。您第一次看到請求中包含signed_request參數時,您可以將其解密並將其存儲到會話中。然後,您將始終能夠知道入口點是否通過Facebook,用戶是誰等等......無論用戶是否在您的iframe中的某處點擊並且sign_request參數不再被接收到。

+1

這似乎工作,直到我從'apps.facebook.com/example'跳到'example.com' ......會話仍然被設置爲在Facebook上,這會導致事情中斷。我意識到這是一個附帶案件,但這是我肯定會出現的。圍繞那一個的任何想法? –

+0

@MattFordham你能解決上述問題嗎? – seesoe

0

signed_request首先作爲POST變量到達您。

最簡單的方法是將其存儲在cookie或某種會話變量中。 (我不熟悉Rails,因此不確定使用什麼是正確的東西)。並測試簽名請求的POST或SESSION變體的存在性,如果它存在於其Facebook會話中,並且希望仍然在iFrame中。

您也可以檢測的iFrame存在有一些JavaScript

夫婦的方法在這裏:Detect iFrame embedding in Javascript

我用線沿線的東西:

<script type="text/javascript"> 
if(location.href != top.location.href){ alert('the content has been loaded into an IFRAME');} 
</script> 
0

我使用signed_request。已簽名的請求顯示哪個頁面將該應用程序用作TAB。據我所知,Facebook計劃將簽名的請求變量擴展到畫布頁面。所以我提到你解碼已簽名的請求,獲取頁面ID。如果page_id不存在(已簽名的請求不存在,或將來canvas_id中不存在page_id,則在canvas模式下使用您的應用程序)。

1

根據您的託管環境,會話的使用不會總是有效。我的特定設置不允許。然而,解決這個問題的方法之一是將它保存在一個cookie中,在您的代碼中調用一個函數來驗證cookie並查找適當的用戶。請注意,安全性通常很重要,因此請確保爲cookie添加一些哈希。但是如果你能控制你的會話的工作方式,那麼通常這是理想的。

相關問題