2013-05-10 73 views
1

我開發了一個帶有PHP SDK的Facebook粉絲頁應用程序,並且已成功運行它。我已經實施了一個Fan Gate,也就是說,用戶必須先喜歡該頁面才能使用該應用。防止Facebook標籤頁應用程序在iframe外運行

什麼我不能解決,直到這是:我想阻止我的應用程序運行在Facebook的iframe之外。截至目前,當用戶複製並粘貼(iframe src的)URL時,我的應用程序可以在新的瀏覽器選項卡或窗口中運行。在這一點上,我想提供一個錯誤消息,如「這個應用程序只能在Facebook選項卡中運行」。

我正在捕獲signed_request,但由於我的應用程序有子頁面和例程,我必須將signed_request存儲在會話變量中。

任何建議?

回答

0

好的,所以我通常會在app_data字段signed_request中提供數據來知道要加載哪個頁面。 POSTing時,處理有效負載後,我直接重定向到選項卡。

所以,有兩種方法可以請求一個頁面,即實際上是一個Facebook標籤:GET和POST。

GET

當使用GET,標籤應經常使用Facebook的URL請求。例如:該標籤的子頁面「form」應該有一個URL:http://www.facebook.com/pages/xXx/[page_id]?sk=app_[app_id] & app_data =表格

在您的服務器在解碼signed_request(參見12)之後,您將識別app_data中的數據。 在指向表單頁面的鏈接中,還必須添加target="parent"屬性。 通過這個,Facebook重新加載和選項卡感覺比直接鏈接子頁面時慢。但是你有URL來標識子頁面,這是我們更喜歡的。 此外,您可以預計每個GET請求都有signed_request。如果沒有,它不會通過Facebook調用,並且您可以顯示錯誤消息或我建議的重定向到您的選項卡(子頁面)。

POST

的POST從未有signed_request。但通常,瀏覽時,瀏覽器使用GET請求。所以你可以假設,如果你收到一個POST請求,它可能來自你自己的形式或黑客攻擊的企圖。 在這兩種情況下,您都檢查該請求的有效性值。

如果他們是有效,您將它們保存到您的數據庫並重定向到「成功」頁面。例如。如果您打算參加比賽,則應顯示一張確保用戶已成功參加的頁面。

如果數據是無效,您將錯誤消息保存到會話中並重定向回顯示它們的表單。

我總是建議你在POST請求後重定向,不管你是否在Facebook選項卡中。但在Facebook標籤,重定向必須使用JavaScript,因爲它是一個IFRAME內完成,並且希望整個頁面重新加載:

<script type="text/javascript"> 
    parent.location.href = 'http://www.facebook.com/pages/xXx/[page_id]?sk=app_[app_id]&app_data=form'; 
</script> 

郵政scriptum 1:對於我來說,形式始終使用POST請求。

郵政scriptum 2:如果你不喜歡整個Facebook的「幀」重新加載每次點擊的想法,你能想到做一些AJAX魔術的這個請求是「五香」與額外的數據你承認他們是「你的」。

+0

謝謝你的回答。確實有些非常有用的信息。我還無法找到解決這個問題的直接方法。基於會話的解決方案沒有幫助,因爲無論是否在iframe中,瀏覽器都提供相同的會話。這裏有一個類似的話題:http://stackoverflow.com/questions/7783786/how-to-know-if-my-page-is-running-in-a-bookbook-iframe-or-not – 2013-05-12 09:48:34

+0

這是真的,但我的解決方案通過不依賴會話來避免這種情況 – 2013-05-13 02:21:50

相關問題