2010-04-22 52 views
15

我有一個帶有多個PHP頁面的Facebook Iframe應用程序。Facebook的iframe應用程序在Safari會話中的多個頁面變量不會持續

我有一些鏈接指向我的「iframe文件夾」內的文件。

在iframe中遇到會話變量的一些問題。我設置了一些會話變量,但它們不會從一個頁面持續到另一個頁面。

這可以在其他瀏覽器上工作。

我一直在閱讀Safari不支持跨域cookie,這可能是問題,但我不知道如何解決這個問題。

任何幫助?

+0

您是否找到任何解決方案? – cdpnet 2010-07-09 22:55:03

回答

10

我寫了the blog post多米尼克在他的回答中提到。

問題是Safari的默認行爲是僅接受來自您訪問的網站的Cookie。這不包括「第三方」cookies。 Safari將IFRAME中的頁面視爲第三方網站,直到您與該內容交互(例如,通過單擊鏈接),它將拒絕這些cookie。

您的PHP代碼需要在使用會話的第一個頁面上設置一個cookie,以便該會話從一個頁面持續到另一個頁面,但是如果會話變量位於IFRAME的第一頁中,雞和雞蛋的問題。

我的解決方案是保留所有特殊的Facebook參數,直到加載到IFRAME的第二頁。因爲你已經和它交互了,所以在第二頁上設置的cookies將會持續存在,並且這可以讓你的PHP代碼保持與Facebook交流所需的任何狀態。

雖然這不會幫助你的PHP會話,所以我建議在第一頁上的鏈接添加另一個參數,允許第二頁查看會話或重新創建它。

+0

Steve,我正在使用單點登錄Facebook身份驗證。 Facebook爲我的託管域設置cookie以提供單點登錄。但是,正如你所說,Safari會拒絕它。而該應用程序留下了facebook上沒有cookie的問題。如果我設置了cookie,這是不同的情況。 – cdpnet 2010-07-08 23:23:59

+0

任何人都可以確認此解決方案在最新的Safari版本中不起作用嗎? – Eydun 2012-05-09 10:30:13

+2

這種技術在Safari 6中不起作用 – 2012-08-20 20:49:56

11

我相信這個解決方案已經被Safari的最新版本(6.0和更高版本)所淘汰。

默認情況下,Safari不允許從第三方設置Cookie。這會影響Facebook的iframe應用程序,因爲用戶正在訪問從apps.facebook.com提供的頁面,但iframe是從yourdomain.com(這種情況下爲「第三方」)提供的。

在網絡上提到了幾種解決方案。我發現的最好的和Facebook推薦的miscellaneous issues列表中的一個是使用JQuery將POST請求僞造成yourdomain.com。該解決方案由Anant Garg詳細描述,適用於不同的主機/ iframe域,需要適用於Facebook應用。關鍵的部分是:

$("body").append(' 
<iframe id="sessionframe" name="sessionframe" onload="submitSessionForm()" src="http://www.yourdomain.com/blank.php" style="display:none;"></iframe> 
<form id="sessionform" enctype="application/x-www-form-urlencoded" 
    action="http://www.yourdomain.com/startsession.php" 
    target="sessionframe" method="post"></form>'); 
var firstTimeSession = 0; 
function submitSessionForm() { 
    if (firstTimeSession == 0) { 
    firstTimeSession = 1; 
    $("#sessionform").submit(); 
    } 
} 

通過Will Henderson另一種方法是用儀器使用JavaScript函數會話信息的頁面上的每個環節。然後修改您的服務器代碼以通過從GET參數中讀取會話信息來捕獲該會話信息。

+3

不適用喬納森! – 2012-04-04 09:08:30

+0

@UğurÖzpınar是的,除了通過頁面之間的會話之外,現在沒有辦法了。 Safari用最近的Google隱私侵犯慘敗修正了人造POST。 – kniteli 2012-04-06 00:22:18

0

並感謝所有的輸入。我通過在每個頁面上附加「signed_request」參數來解決問題。我只是把它作爲一個隱藏的領域,並將其置於代碼後面。這樣,我設法讓它在Safari中運行。希望它也適用於你。

+0

謝謝你的回答!太簡單! =)但是由於這個答案已經被低估了很多,我不知道缺點是什麼? (猜猜我馬上就會知道......) – 2013-02-27 17:18:37

+1

你是怎麼使用signed_request參數的?有代碼示例嗎?這種技術是否可以工作? – 2013-11-12 10:57:35

0

如果你使用.NET,那麼這個問題有一個更簡單的解決方案。

只需在web.config中將cookieless設置爲false即可。例如:

sessionState mode="InProc" cookieless="true" timeout="60" 

它比發佈iframe或使用iframe的url打開彈出窗口要容易得多。

親切的問候,

大衛

+1

我的項目中有第三方cookie的類似問題。但是這個解決方案並沒有幫助我...我嘗試將cookie設置爲false,UseUri,AutoDetected。但我接受異常。也許這是一個原因: 「當你配置一個支持AJAX的ASP.NET Web站點時,只使用UseCookies的默認值作爲cookieless屬性。ASP.NET AJAX不支持使用URL中編碼的cookie的設置客戶端腳本庫「。 – 2012-03-24 08:55:32

1

我認爲最好的辦法是打電話session_start();之前手動跟蹤會話ID,即通過使用session_id($_GET['session]);只要確保你做到這一點,一切正常。

1

Safari只接受來自用戶導航到的頁面的cookie。解決此問題的最簡單和最有效的方法是使用top.location.href將您的畫布應用的着陸頁的請求重定向到您域中的其他頁面,並將用戶重定向到該頁面的畫布應用。

例如,如果abc.php是您的登錄頁面,並且畫布網址是facebook.com/abc。首先將請求從abc.php重定向到不同的頁面,如xyz.php,然後再從xyz.php重定向到facebook.com/abc。不要忘記在xyz.php中開始會話。

這是簡單的解決...

-1

我用這個標題用PHP,即解決我的問題

if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE')) header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'); 
0

使用Safari 7的發佈,不僅是第三方的cookie被阻止。本地存儲以及WebDB,任何類型的網站數據都被阻止。當您轉到Safari首選項(CMD +逗號),在Safari 7的隱私選項卡下,它現在說:「阻止Cookie 和其他網站」,最初是「阻止Cookie」。這證實了這些變化。

其他瀏覽器可能會在未來經歷。很可能是Firefox。鉻,咳嗽 *咳嗽*可能不是。

您可能不得不採用一些使用重定向技術的解決方法,或者彈出類似於disqus的方法。

相關問題