Access-Control-Allow-Origin 不允许 HTTP DELETE 的来源

Posted

技术标签:

【中文标题】Access-Control-Allow-Origin 不允许 HTTP DELETE 的来源【英文标题】:Origin is not allowed by Access-Control-Allow-Origin for HTTP DELETE 【发布时间】:2012-03-07 17:01:21 【问题描述】:

我目前正在使用 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(使用 Firefox 10)中得到响应“NetworkError:400 Bad Request”。我看到Firefox首先发送了一个HTTP OPTIONS(查看是否允许使用HTTP DELETE),这导致了这个错误,所以我用谷歌浏览器尝试了同样的事情。谷歌浏览器发送一个真正的 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 有一个名为“删除用户分数”的段落。所以一定有可能(以某种方式)删除分数?

【问题讨论】:

【参考方案1】:

这是跨域安全问题。

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

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

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

【讨论】:

正如您已经想到的那样,我只是更改了值以隐藏我的实际域。所以我现在的问题是如何使用 HTTP DELETE 功能?它在 Facebook 文档中,所以它必须仍然可以通过某种方式访问​​?【参考方案2】:

由于 跨站点脚本 (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.');
    
  );

【讨论】:

以上是关于Access-Control-Allow-Origin 不允许 HTTP DELETE 的来源的主要内容,如果未能解决你的问题,请参考以下文章

PHP没有按顺序执行

跨域请求被阻止 Symfony/AngularJS

C# MVC js 跨域

PHP Ajax 跨域问题最佳解决方案

PHP Ajax 跨域问题最佳解决方案

PHP Ajax 跨域问题最佳解决方案