nodejs 中的会话处理。 CORS 问题

Posted

技术标签:

【中文标题】nodejs 中的会话处理。 CORS 问题【英文标题】:Session handling in nodejs. CORS issue 【发布时间】:2015-06-17 23:46:46 【问题描述】:

我知道有很多关于这个问题的问题,但我一直在研究我的问题一段时间,但建议的解决方案似乎都不能解决我的问题。

我正在开发一个网络应用程序。

在前端,我将 AJAX 请求发送到使用 nodejs 开发的后端。

在后端,我正在尝试使用 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,因此以下请求不会携带该信息。

我确定这是一些愚蠢的细节,但我就是不能指望它。

提前谢谢你!

【问题讨论】:

你试过多种浏览器吗? 这有什么帮助?目前我正在使用谷歌浏览器,版本 39.0.2171.71 您的问题似乎来自您使用的浏览器不遵守 set-cookie 响应标头。 Here 是与有人报告 OSX 10.10.1 上的 chrome 39 相同问题的链接。也许尝试使用一些不同的浏览器,看看是否适用于其中任何一个? 我刚刚在 Firefox 中试了一下,得到了相同的结果。有任何想法吗?感谢您的努力! 【参考方案1】:

嗯,我找到了替代方案,所以我正在回答我自己的问题。

首先,根据我的阅读,没有办法用 cookie 做我想做的事情。

因此,为了处理会话,同时能够使用通配符实现 cors,我最终选择了 JWT(JSON 网络令牌)。

这是一篇带有解释和很好例子的文章:http://www.sitepoint.com/using-json-web-tokens-node-js/

感谢所有在这里尝试帮助我的人。

【讨论】:

我遇到了同样的问题。但我需要实现一个消息代码验证功能,我需要将我的消息代码存储在会话中,但我无法获得存储在 req.session 中的任何内容。你对此有什么想法吗? 是的,使用此实现(启用 CORS 等)您将无法使用 cookie,因此您的会话信息将不会被存储并且您会丢失它。使用 JWT,您可以对您认为对用户会话至关重要的任何信息进行编码,并在每个请求中对其进行解码。希望这会有所帮助!

以上是关于nodejs 中的会话处理。 CORS 问题的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs 快递,Heroku CORS

使用angular 9部署在heroku上的nodejs应用程序中的CORS错误

带有会话/cookie 的 CORS 请求

nodejs / express中的数据库会话支持[关闭]

使用nodejs中的用户对象登录后将重新生成的会话ID发送回用户代理

Vue.js 和 Nodejs 的 CORS 问题