在Node.js中处理会话。CORS问题。

3
我知道关于此问题有很多问题,但我已经研究了一段时间我的问题,而且建议的解决方案似乎都不能解决我的问题。
我正在开发一个Web应用程序。
在前端,我正在向后端(由nodejs开发)发送AJAX请求。
在后端,我尝试使用express.js中间件处理用户会话。
我无法使会话起作用。
我认为这是AJAX请求的问题,但根据我所读的,我应该能够创建带有此类请求的cookie,因此我不知道该怎么想。
在我的后端中,我使用中间件处理CORS问题。以下是代码:
var enableCORS = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    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, Cookie');
    res.header('Access-Control-Allow-Credentials', true);

    // intercept OPTIONS method
    if ('OPTIONS' == req.method) {
      res.status(200).send('');
    }
    else {
      next();
    }
};


app.use(enableCORS);

接下来,当我处理实际的请求时,我尝试像这样处理会话:

req.session.field = 'value';

问题是,我在下面的请求中没有收到任何会话信息。
我一直在仔细研究这个问题。我使用的一个 AJAX 请求示例是这样的:
$.ajax({
            url: 'http://example.com/resource',
            type: 'get',
            dataType: 'json',
            async: true,
            crossDomain: true,
            beforeSend: function(xhr){ xhr.withCredentials = true; },
            success: function(x, status, xhr){
              console.log(x);
            },
            error: function(xhr, status, error){ }
          });

我是一位有用的助手,可以为您进行文本翻译。以下是您需要翻译的内容:

我一直在观察我浏览器中的网络部分中的http包交换。以下是请求和响应标头:

请求标头:

Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8,es;q=0.6
Cache-Control:no-cache
Connection:keep-alive
Content-Length:29
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Host:example.com
Origin:http://example.net
Pragma:no-cache
Referer:http://example.net/
User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36

响应头:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:Content-Type, Authorization, Content-Length, X-Requested-With, Cookie
Access-Control-Allow-Methods:GET,PUT,POST,DELETE,OPTIONS
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-Length:96
Content-Type:application/json; charset=utf-8
Date:Sun, 12 Apr 2015 16:32:36 GMT
Server:Cowboy
Set-Cookie:connect.sid=s%3A7OCuaEWUjkpdOrxFuNo6KrtpnS_e5SpZ.S2O4PIVy2YkKuLxQ9KuzfcaszRZzqq5hjL3PfaHrQBw; Path=/; Expires=Sun, 12 Apr 2015 17:22:36 GMT
Vary:X-HTTP-Method-Override
Via:1.1 vegur
X-Content-Type-Options:nosniff
X-Powered-By:Express

在响应中,实际上会发送Set-Cookie头,但在我的浏览器中没有创建任何cookie,因此接下来的请求将不会携带该信息。
我确定这是一些愚蠢的细节问题,但我无法找到原因。
先谢谢你!

你尝试过多个浏览器吗? - njwags
那会有什么帮助呢?目前我正在使用谷歌浏览器,版本号为39.0.2171.71。 - Alberto Gimeno
看起来你的问题出在你所使用的浏览器没有遵循set-cookie响应头。这里有一个链接,其中有人报告了相同的问题,是在OSX 10.10.1上使用Chrome 39时出现的。也许尝试一些不同的浏览器,看看是否有任何一个可以正常工作? - njwags
我刚在 Firefox 中尝试了一下,结果也是一样的。有什么想法吗?感谢你的努力! - Alberto Gimeno
1个回答

0

好的,我找到了一种替代方案,所以我自己回答了这个问题。

首先,从我读过的内容来看,使用 cookie 没有办法实现我想要做的事情。

因此,为了处理会话并能够使用通配符实现跨域资源共享 (CORS),我最终选择了 JWT(JSON Web Tokens)。

这里有一篇文章,其中包含解释和漂亮的示例:http://www.sitepoint.com/using-json-web-tokens-node-js/

感谢每个在这里尝试帮助我的人。


我遇到了同样的问题。但是我需要实现一个消息代码验证函数,需要将我的消息代码存储在会话中,但是我无法获取我存储在req.session中的任何内容。你有任何想法吗? - Jack Zhang
是的,使用这种实现方式(启用CORS等),您将无法使用cookie,因此您的会话信息将不会被存储,您将失去它。使用JWT,您可以编码您认为对用户会话至关重要的任何信息,并在每个请求中解码它。希望这可以帮助您! - Alberto Gimeno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接