cookie不通过服务器发送

时间:2016-03-15 22:42:58

标签: django cookies backbone.js cross-domain

我有一个骨干应用程序(驻留在mywebsite.proj.io上),它将代码发送到django服务器(authorization.proj.io),该服务器交换访问令牌的代码(简单的oauth交换)。我使用的是Chrome / 49.0.2623.87。

authorization.proj.io在授权阶段期间将cookie发送回客户端(mywebsite.proj.io),但此cookie在将来的请求中永远不会再发回。我认为这不是跨域cookie问题或浏览器无法在302重定向上设置cookie。

我想知道为什么在后续请求中不会将cookie发送到服务器。

以下是一些细节:

步骤1:请求标头..身份验证阶段请求:将myabsite.proj.io中的Oauth“代码”发送到authorization.proj.io以获取访问令牌。这个请求是通过ajax。您在此处看到的Cookie可能来自之前的请求,但此时并不关心

GET /fbauth/?code=fb_code_long_string&state=%7B%22client_id%22%3A34343642979%2C%22network%22%3A%22facebook%22%2
Host: authorization.proj.io
Referer: http://mywebsite.proj.io/contribute/?code=fb_code_long_string&state=%7B%22client_id%22%3A34343642979%2C%22network%22%3
Cookie: csrftoken=1MTginTGXLHAku5LMHAMLLTrQEX2M4jj; sessionid=igc8a7vidgbi8rzxgm7whgb5rh8uqxa9`

步骤2:响应标头..身份验证阶段响应[authorization.proj.io以302响应并重定向到mywebsite.proj.io并设置cookie]

HTTP/1.0 302 FOUND
Server: WSGIServer/0.1 Python/2.7.10
Vary: Cookie
X-Frame-Options: SAMEORIGIN
Location: http://mywebsite.proj.io/contribute/#access_token=CAAE
Set-Cookie: csrftoken=g0BEHLD0HAH4vBQLQFpKOEn2andrYMhG; expires=Tue, 14-Mar-2017 22:00:16 GMT; Max-Age=31449600; Path=/
Set-Cookie: sessionid=igc8a7vidgbi8rzxgm7whgb5rh8uqxa9; expires=Tue, 29-Mar-2016 22:00:16 GMT; httponly; Max-Age=1209600; Path=/

第3步:稍后,来自mywebsite.proj.io的js向authorization.proj.io发送请求..没有发送cookie

GET /posts/gcc-speaker-training-on-april-25 HTTP/1.1
Host: authorization.proj.io
Connection: keep-alive
Accept: application/json, text/javascript, */*; q=0.01
Origin: http://mywebsite.proj.io
Authorization: Basic facebook:CAAEdTwh7fCMBAMEr6wC3ajZANVnZBMPenjseiNShjcXOJJ0PbiJ0GFXI7lSjzkP
DNT: 1
Referer: http://mywebsite.proj.io/contribute/

1 个答案:

答案 0 :(得分:0)

为了让这项工作,我必须做些一些事情。

事实证明我正在做跨域请求,这就是我解决它的方法:

1 :确保为您的网页提供服务的服务器设置了Access-Control-Allow-Origin ..我正在使用http-server并执行以下操作:

`http-server . --cors`

2 :我为ajax调用

执行了以下操作
$.ajax('http://authorization.proj.io', {
    type: "GET",
    contentType: "application/json; charset=utf-8",
    success: function(data, status, xhr) {
      // do something;
    },
    error: function(jqxhr, textStatus, errorThrown) {
    console.log("cannot get orgs");
    },
    xhrFields: {
    withCredentials: true
    },
    crossDomain: true
});

请注意xhrFieldscrossDomain

3 :我在django settings.py中执行了以下操作:

CORS_ORIGIN_ALLOW_ALL = False
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
    'mywebsite.ngrok.io',
    'authorization.proj.io'
)

SESSION_COOKIE_DOMAIN=".proj.com"

我认为最后一点很重要,以便浏览器可以发送cookie。所以也许不是跨域,而是跨子域。