如何在交叉源请求中保留会话数据?

我是使用Express和Connect的新手,所以我希望我做一些简单的解决scheme愚蠢的东西…

基本上,我有一个用户使用Personalogin的页面。 为了validation身份validation尝试,我使用express-persona 。 假设这个模块将用户的validation邮件地址保存在一个会话variables(req.session.email,默认)中。

现在,login后,用户可以发表评论,这个评论将与用户login的电子邮件地址一起保存。当服务表单的服务器与处理发表评论的服务器相同时,这工作正常。 然而,当它们不同时(比如说用户填写http://localhost:8001的表单,而浏览器则发送一个POST请求到http://localhost:8000这个应该保存注释),所有的突然req.session.email值是undefined

认为我正确设置了跨源资源共享。 表单是这样发送的(使用jQuery):

 $.ajax('http://localhost:8000/post/comment', { data: {comment: $('#commentField').val()}, type: 'POST', xhrFields: {withCredentials: true} } ); 

(注意xhrField: {withCredentials: true} – 会话cookie被传递,我通过检查networking请求来validation。)

服务器设置(我认为)正确的CORS标题:

 res.header('Access-Control-Allow-Origin', 'http://localhost:8001'); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With'); res.header('Access-Control-Allow-Credentials', 'true'); 

当我添加console.log(req.cookie) ,我看到sessionId cookie与POST请求一起发送的值相同。

但是: console.log(req.session.email)显示undefined的跨源请求 – 再一次,当请求来自同一个来源时,它工作正常。

我究竟做错了什么?

我发现我的问题:我忘记发送身份validation请求的cookie。 因此,Express服务器login时无法识别当前用户的会话,因此无法将用户数据保存到会话中。

解决scheme是发送Persona断言请求与withCredentials标志,如下所示:

 var response = $.ajax(assertionUrl + '/verify', { data: {assertion: assertion}, type: 'POST', xhrFields: {withCredentials: true} }); 

(我不认为有人会遇到这个完全相同的问题,但以防万一…)

对于那些正在寻求解决与Angular实现相同的问题。 您可以使用以下命令configuration$ http发送cookie:

 .config(function ($routeProvider, $httpProvider) { $httpProvider.defaults.withCredentials = true; //rest of route code