在Angular中使用解析客户端密钥会导致CORS错误

Using Parse Client Key in Angular gives CORS error

本文关键字:密钥 错误 CORS 客户端 Angular      更新时间:2023-09-26

我正试图使用客户端密钥从Parse中检索一个类(使用GET)。我能够使用谷歌Chrome的高级休息客户端发送一个成功的请求;我使用了X-Parse-Application-IdX-Parse-Client-Key标头。

[edit][edit2]响应标头(从Chrome Developer Tools OPTIONS获得):

HTTP://1.1 200 OK

访问控制-允许-标头:X-Parse-REST-API-Key、X-Parse-Javascript-Key、X-Parse-Application-Id、X-Parse-Client-Version、X-Parses-Session-Token、X-Requested-Wise、X-Parser-Revocale-Session、Content-Type

访问控制允许方法:OPTIONS、POST、GET、PUT、DELETE

访问控制允许来源:*

访问控制最大年龄:86400

内容类型:application/json;charset=utf-8

日期:2015年11月29日星期日04:23:08 GMT

服务器:nginx/1.6.0

X-Parse-Platform:G1

X-Runtime:0.000118

内容长度:0

连接:保持有效

然而,在Angular应用程序中尝试做同样的操作会导致以下错误:

XMLHttpRequest无法加载https://api.parse.com/1/classes/GenResources.飞行前响应中的访问控制允许标头不允许请求标头字段X-Parse-Client-Key

Parse表示,它支持使用跨源资源共享,并且我能够更早地使用不同的客户端发出请求,所以我很确定服务器不是问题所在。无论如何,我都无法修改响应标头的内容。

这是我用来形成GET请求的代码。

var ng_portal = angular.module("ngPortal", []);
ng_portal.controller("GenResourcesCtrl", ["$http", function($http) {
  $http({
    method: "GET",
    url: PARSE_URL + "/1/classes/GenResources",
    headers: {
      "Content-Type": "application/json",
      "X-Parse-Application-Id": PARSE_APP_ID,
      "X-Parse-Client-Key": PARSE_CLIENT_KEY
    }
  }).then(
    function success(res) {
      console.log(res);
    },
    function error(res) {
      console.log(res);
    }
  );
}]);

您正在请求中设置自定义标头,这将触发飞行前(OPTIONS)请求。该请求的响应必须包括一个名为"访问控制允许标头"的标头,该值是您试图设置的标头列表。

请参阅https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

特别是关于飞行前请求的部分。

我建议使用浏览器开发工具查看请求和响应的标头,看看它们是否符合CORS规范。从您提供的错误消息来看,托管您正在进行的跨域调用的服务器似乎不支持自定义标头。如果你有其他看法,请用标题更新你的问题,我可以提供更多帮助。

实际上这似乎是Parse.com的一个问题。整整沮丧了一个小时后,我看到了这个谷歌群组发布的

相关报价

根据我的测试,这个(客户端或javascript键)从未通过浏览器的javascript rest交互工作过。

我实际上创建了一个关于这个的分析错误:

https://developers.facebook.com/bugs/488204124680438

因为我认为这两个键都应该通过浏览器工作(不需要使用SDK)。

我建议阅读我的bug。我仍然认为正确的实现是使这些密钥能够正确地处理浏览器请求,因为如果你在浏览器之外执行,它就会起作用。

但遗憾的是,他们似乎没有意识到这个问题,或者不明白为什么只在浏览器中禁用它没有意义,因为你可以在任何其他平台上使用它而没有问题。只是…没有……有意义。

相反,我使用了我的JavaScript密钥X-Parse-Javascript-Key(根据今天的文档,它只适用于他们的JavaScript SDK),它可以很好地替代X-Parse-Client-Key