HTTP-DELETE的Access-Control-Allow-Origin不允许使用Origin

时间:2012-02-16 09:46:19

标签: facebook api xmlhttprequest http-delete

我目前正在使用Facebook JavaScript SDK和Scores API(https://developers.facebook.com/docs/score/)。我写了一个小应用程序来保存(发布)分数,现在我想删除分数。发布(保存)它们可以正常工作。

我的代码如下所示:

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.');
  }
});

“facebook”变量是保存我的应用程序数据的对象。对于HTTP POST,它工作正常,但对于HTTP DELETE,我在Firebug中获得响应“NetworkError:400 Bad Request”(使用Firefox 10)。我看到Firefox首先发送一个HTTP OPTIONS(以查看是否允许使用HTTP DELETE)导致此错误,因此我尝试使用Google Chrome进行同样的操作。 Google Chrome会发送一个真实的HTTP DELETE,然后返回:

  

“XMLHttpRequest无法加载   https://graph.facebook.com/USER_ID/scores?access_token=APP_ID|APP_SECRET。   Access-Control-Allow-Origin不允许原点MY_DOMAIN。

我认为这是一个经典的跨域问题,但如何解决呢?我已将我的域名添加到我的Facebook应用程序(https://developers.facebook.com/apps),Facebook有一段名为“删除用户分数”的段落。那么必须有可能删除分数(不知何故)?

2 个答案:

答案 0 :(得分: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.');
    }
  });
}

答案 1 :(得分:0)

这是跨域安全问题。

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

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

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