2012-02-16 228 views
2

我目前正在使用Facebook JavaScript SDK和Scores API(https://developers.facebook.com/docs/score/)。我寫了一個小應用程序來保存(發佈)分數,現在我想刪除分數。發佈(保存)它們工作正常。訪問控制 - 允許來源的HTTP DELETE不允許來源

我的代碼如下所示:

var deleteHighScoreUrl = 'https://graph.facebook.com/'+facebook.user.id+'/scores?access_token='+facebook.application.id+'|'+facebook.application.secret; 

jQuery.ajax(
{ 
    type: 'DELETE', 
    async: false, 
    url: deleteHighScoreUrl, 
    success: function(data, textStatus, jqXHR) 
    { 
    console.log('Score deleted.'); 
    } 
}); 

「臉譜」變量是保存我的應用程序數據的對象。對於HTTP POST,它工作正常,但對於HTTP DELETE,我在Firebug中獲得響應「NetworkError:400 Bad Request」(使用Firefox 10)。我看到Firefox首先發送了一個HTTP OPTIONS(查看是否允許使用HTTP DELETE),這導致了這個錯誤,所以我嘗試了谷歌瀏覽器的同樣的事情。谷歌瀏覽器發送一個HTTP實時刪除,然後返回:

"XMLHttpRequest cannot load https://graph.facebook.com/USER_ID/scores?access_token=APP_ID|APP_SECRET . Origin MY_DOMAIN is not allowed by Access-Control-Allow-Origin".

我認爲這是一個經典的跨域問題,但如何解決呢?我已將我的域添加到我的Facebook應用程序(位於https://developers.facebook.com/apps),Facebook有一段名爲「刪除用戶分數」的段落。所以它必須可以刪除分數(不知何故)?

回答

1

由於跨站點腳本XSS)HTTP DELETE是不可能的。但是,您可以使用查詢參數?method = delete發送HTTP POST請求,然後刪除得分。

代碼示例:

Facebook.prototype.deleteUsersHighScore = function() 
{ 
    var deleteHighScoreUrl = 'https://graph.facebook.com/'+this.user.id+'/scores?access_token='+this.application.id+'|'+this.application.secret+'&method=delete'; 

    jQuery.ajax(
    { 
    type: 'POST', 
    async: false, 
    url: deleteHighScoreUrl, 
    success: function(data, textStatus, jqXHR) 
    { 
     console.log('Score deleted.'); 
    } 
    }); 
} 
+8

你永遠不要在客戶端代碼中使用application.secret! – tur1ng 2012-04-15 10:09:21

0

這是跨域安全問題。

事實上,您的錯誤包含消息「Origin MY_DOMAIN」會告訴我,您的代碼中的某處已複製了Facebook示例中的一個,但未將MY_DOMAIN的值更改爲正在使用的正確域。

我會檢查所有代碼的值「MY_DOMAIN」。

如果您更改了值以隱藏您的問題中的實際域,請忽略此建議。

+0

正如你已經想到,我只是改變了隱藏我的實際域值。所以我的問題是現在我可以如何使用HTTP DELETE功能?它在Facebook文檔中,所以它仍然可以以某種方式訪問​​? – 2012-02-16 11:19:46

相關問題