访问控制 - 允许来源的HTTP DELETE不允许来源

问题描述:

我目前正在使用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有一段名为“删除用户分数”的段落。所以它必须可以删除分数(不知何故)?

由于跨站点脚本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

这是跨域安全问题。

事实上,您的错误包含消息“Origin MY_DOMAIN”会告诉我,您的代码中的某处已复制了Facebook示例中的一个,但未将MY_DOMAIN的值更改为正在使用的正确域。

我会检查所有代码的值“MY_DOMAIN”。

如果您更改了值以隐藏您的问题中的实际域,请忽略此建议。

+0

正如你已经想到,我只是改变了隐藏我的实际域值。所以我的问题是现在我可以如何使用HTTP DELETE功能?它在Facebook文档中,所以它仍然可以以某种方式访问​​? – 2012-02-16 11:19:46