NodeJS 如何在跨域请求中保存会话数据?

zhte4eai  于 2023-06-05  发布在  Node.js
关注(0)|答案(2)|浏览(250)

我刚开始使用Express和Connect,所以我希望我做的事情很愚蠢,但有一个简单的解决方案。
基本上,我有一个用户使用Persona登录的页面。为了验证身份验证尝试,我使用express-persona。假设此模块将用户的有效电子邮件地址保存在会话变量中(req.session.email默认情况下为www.example.com)。
现在,登录后,用户可以发表评论,此评论将与用户登录时使用的电子邮件地址一起保存。当服务表单的服务器与处理评论发布的服务器相同时,这种方法可以正常工作。然而,当它们不同时(假设用户在http://localhost:8001处填写表单,而浏览器随后向http://localhost:8000发送POST请求,这应该保存注解),突然req.session.email的值是undefined
我 * 认为 * 我正确设置了跨域资源共享。表单是这样发送的(使用jQuery):

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

(Note xhrField: {withCredentials: true}--传递会话cookie,我通过检查网络请求验证了这一点。)
服务器设置(我认为)正确的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请求沿着发送的cookie的值相同。

  • 但是:* console.log(req.session.email)显示undefined用于跨域请求--同样,当请求来自同一个源时,它可以正常工作。

我做错了什么?

r8xiu3jd

r8xiu3jd1#

我发现了我的问题:我忘了发送身份验证请求的cookie。因此,Express服务器在登录时无法识别当前用户的会话,因此无法将用户数据保存到会话中。
解决方案是发送带有withCredentials标志的PersonaAssert请求,如下所示:

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

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

9o685dep

9o685dep2#

对于那些希望通过Angular实现解决相同问题的人。您可以使用以下命令配置$http以发送Cookie:

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

相关问题