5

所以我試圖用與Facebook的JS SDK中的圖形API和我得到的Safari以下錯誤:使用Facebook圖形API被打破

「OAuthException:必須使用活動的訪問令牌來查詢有關當前用戶的信息。」

我懷疑它與Safari對x域cookie設置非常嚴格的事實有關,所以我在Firefox中試過它,cookie選項在FB.init()中設置爲false。我的確發現我的FB.api()請求中出現同樣的錯誤。

FB.init({ 
    appId: "<%= app_id %>", 
    status: true, // check login status 
    // We cannot rely on this cookie being set in an iframe. I found this 
    // out because the Graph API was not working in Safari. 
    // cookie: true, // enable cookies to allow the server to access the session 
    xfbml: true, // parse XFBML 
    channelUrl: window.location.protocol + '//' + window.location.host + '/fb/canvas/channel.html' 
}); 

所以我不知道...有手動設置在FB.api()請求access_token查詢參數的好辦法?

如果FB.init() Cookie會設置正確,這個是什麼FB.api()請求參數如下所示:

access_token xxxxxxxxxxxx|1.xxxxxxxxxxxxxxxxxxxxxx__.3600.xxxxxxxxxx-xxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx 
callback  FB.ApiServer._callbacks.xxxxxxxxxxxxxxx 
pretty  0 
sdk   joey 

在Safari瀏覽器(或當cookieFB.init()選項未設置)的FB.api()請求參數如下所示:

callback  FB.ApiServer._callbacks.xxxxxxxxxxxxxxx 
pretty  0 
sdk   joey 

現在...顯然我的應用程序有能力在服務器端生成access_token ...我想知道是否有任何方法我可以手動設置FB.api()使用我的服務器端生成的access_token

+0

我想有另一種方法來做到這一點。基本上,由於我們有一次機會在填充iFrame的初始post請求中設置cookie,所以我們可以使用這個機會來模擬FB JS中在FB.init()期間嘗試設置的`fbs_xxxxxxxxx` cookie。現在... SDK設置的cookie值如下所示:`fbs_xxxxxxxxx =「access_token = xxx&expires = xxx&secret = xxx&session_key = xxx&sig = xxx&uid = xxx」`。 `access_token`和`expires`部分很容易。但我在計算其他部分時遇到了一些麻煩。 – 2011-02-01 17:01:19

回答

4

好,我得到它的工作找到一個很好的例子。我原來你不需要FB.init()cookie: true選項,以便使用FB.api() - 您可以手動傳遞的access_token:

FB.api("/me/apprequests/?access_token="+access_token, function (response) {}); 

哪裏access_token是您在頁面加載設置服務器端的一個JS變量。下面是一個ERB例如:

<script> 
    var access_token = "<%= @access_token %>"; 
</script> 

而且@access_token是獲取傳遞給你的畫布頁在初始POST請求的OAuth的access_token。

3

Safari的限制是,如果域名與父域不同,它將不允許iframe的內容創建或使用cookie,除非用戶首先與其交互。這個問題是Safari獨有的,不是webkit,所以Chrome很好。

自己遇到這個問題後(幾個痛苦的時刻),有一個解決方案似乎是一個很好的解決方法。該技術是使用JavaScript將表單注入頁面主體,然後觸發提交事件。 Safari將此視爲用戶交互並允許Cookie。

您可以在Facebook開發人員論壇here

+0

啊,不是一個壞主意。我知道JS觸發表單提交是Facebook如何允許iFrame canvas頁面爲iFrame的域設置cookie,即使在像Safari這樣的瀏覽器上,通常不會在x域iFrame請求上設置cookie(http://stackoverflow.com /問題/ 4701922 /如何,的確,Facebook的設置跨域餅乾換I幀,畫布上的頁面)。但是,似乎從iFrame內部觸發表單提交事件(或執行JS重新加載)並不是最好的用戶體驗。另外,Safari團隊可能會將其視爲一種安全漏洞,可以防範跟蹤用戶的廣告。 – 2011-02-01 16:54:56