1

我创建了一个 API /user/auth,我可以使用 POST 发送一个 Json 对象,例如:

var user = {"username":"alex", "password":"m"}
$http(
            {
                method: 'POST',
                url: '/api/v1/user/auth',
                data: user,
            }
        ).
            success(function(data, status, headers, config) {
                console.log(data)
            }).
            error(function(data, status, headers, config) {
                // called asynchronously if an error occurs
                // or server returns response with an error status.
            });

来自 Django 的响应如下:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:Content-Type,*
Access-Control-Allow-Methods:POST,GET,OPTIONS,PUT,DELETE
Access-Control-Allow-Origin:*
Content-Language:fr
Content-Type:application/json
Date:Fri, 30 Aug 2013 15:22:01 GMT
Server:WSGIServer/0.1 Python/2.7.5
Set-Cookie:sessionid=w63m0aoo8m3vfmvv0vk5d6w1708ftsrk; Path=/
Vary:Accept, Accept-Language, Cookie

所以 Django 返回了一个很好的 cookie 但我不知道为什么,Chrome 没有在 Resource.xml 中设置这个 cookie。

请求从 127.0.0.1:8000 发送到 127.0.0.1:8080;我使用这个中间件来处理 CROS 请求,我还设置了:

SESSION_COOKIE_HTTPONLY = False
4

2 回答 2

0

好的,感谢 Bqm 到 mozilla 的链接,我终于找到了未设置 cookie 的原因。

实际上,您需要在发送的标头中设置:

Access-Control-Allow-Credentials: true

在 Angular 中,这是通过以下方法完成的:

$http(
            {
                method: 'POST',
                url: '/api/v1/user/auth',
                data: user,
                withCredentials: true
            }
        )

一旦您的后端使用 setCookie 进行响应,浏览器就可以在您的浏览器中设置 cookie。

于 2013-08-31T11:15:27.887 回答
0

有问题的行是:

 Access-Control-Allow-Origin: *

凭证请求不适用于通配符允许来源。您必须专门设置名称,例如:

Access-Control-Allow-Origin: http://127.0.0.1:8080

您可以在这里找到更多信息:

https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control#Requests_with_credentials

于 2013-08-31T06:11:09.573 回答