我有一个骨干应用程序(驻留在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/
答案 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
});
请注意xhrFields
和crossDomain
。
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。所以也许不是跨域,而是跨子域。