我刚开始使用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
用于跨域请求--同样,当请求来自同一个源时,它可以正常工作。
我做错了什么?
2条答案
按热度按时间r8xiu3jd1#
我发现了我的问题:我忘了发送身份验证请求的cookie。因此,Express服务器在登录时无法识别当前用户的会话,因此无法将用户数据保存到会话中。
解决方案是发送带有
withCredentials
标志的PersonaAssert请求,如下所示:(我不认为任何人会遇到这个完全相同的问题,但以防万一...)
9o685dep2#
对于那些希望通过Angular实现解决相同问题的人。您可以使用以下命令配置$http以发送Cookie: