我正在使用angular来POST到身份验证端点;在服务器端,我可以看到请求成功,并设置了正确的CORS头。 Angular的起源是http://localhost:9000
在服务器端,预检OPTIONS
请求总是返回200
,所以看起来没问题。
在客户端,$http.post
总是失败,错误代码为0,其他研究表明CORS仍然存在问题。我已阅读规范并尝试了其他一些答案,但仍然缺少某些内容。
Angular POST就像这样:
$http({
method: 'POST',
url: 'http://localhost:3000/auth/login',
data: {
username: $scope.username,
password: $scope.password
}
})
.then(function (response) {
/* etc. etc. */
}, function (response) {
/* This always triggers, with response.status = 0 */
console.log("ERROR: " + response.data);
console.log("Status: " + response.status);
console.log("Status text: " + response.statusText);
console.log("Headers: " + response.headers);
$scope.error = 'Something went wrong...';
});
使用curl调试服务器发回的内容,就是这样:
< HTTP/1.1 302 Found
< X-Powered-By: Express
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Methods: GET,PUT,POST,DELETE,OPTIONS
< Access-Control-Allow-Headers: Origin, Content-Type, Accept, Authorization, Content-Length, X-Requested-With
< Access-Control-Allow-Credentials: true
< Set-Cookie: ua_session_token=(blahblah); Path=/
< Location: /
< Vary: Accept
< Content-Type: text/plain; charset=utf-8
< Content-Length: 23
< Date: Mon, 28 Dec 2015 15:08:17 GMT
< Connection: keep-alive
这就是为什么我不知道,按照规范,服务器似乎正在做正确的事情?
以下是服务器在请求标头方面从客户端获取的内容:
HEADER host localhost:3000
HEADER content-type application/json;charset=UTF-8
HEADER origin http://localhost:9000
HEADER content-length 38
HEADER connection keep-alive
HEADER accept application/json, text/plain, */*
HEADER user-agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9
HEADER referer http://localhost:9000/
HEADER accept-language en-us
HEADER accept-encoding gzip, deflate
UPDATE 根据this post尝试了其他没有运气的事情。看起来Access-Control-Allow-Headers
区分大小写,并且角度正在请求accept, origin, content-type
上发送。我调整了服务器以鹦鹉回来,没有运气。
答案 0 :(得分:1)
好吧,将我的头戴在键盘上几个小时之后,我已经修好了。
答案似乎是,角度确实不像是为了回复POST
而获得重定向。当我更改服务器端点以仅返回一个普通的身份验证令牌作为文本时(无论如何它都设置为cookie)而不是返回重定向,角度POST
开始像魅力一样工作并且落到了成功经纪人。
不确定我是否已深入了解这一点,以了解为什么角度以这种方式表现;通过玩弄它我发现,如果服务器发送的重定向是一个不存在的(404)URL,可以复制,即使,原始POST返回该有效重定向。