Node.js 403 Node Express中出现错误

Node.js 403 Node Express中出现错误,node.js,express,Node.js,Express,我有一个节点应用程序,其中有一个页面发布他们的电子邮件地址以登录到该应用程序(我现在什么都不做,只是存储电子邮件地址)。当我将应用程序推到生产环境中时,它可以正常工作一段时间,然后我开始出现如下403错误: Express 403 Error: Forbidden at Object.exports.error (/opt/run/snapshot/package/node_modules/express/node_modules/connect/lib/utils.js:63:13) at c

我有一个节点应用程序,其中有一个页面发布他们的电子邮件地址以登录到该应用程序(我现在什么都不做,只是存储电子邮件地址)。当我将应用程序推到生产环境中时,它可以正常工作一段时间,然后我开始出现如下403错误:

Express
403 Error: Forbidden
at Object.exports.error (/opt/run/snapshot/package/node_modules/express/node_modules/connect/lib/utils.js:63:13)
at createToken (/opt/run/snapshot/package/node_modules/express/node_modules/connect/lib/middleware/csrf.js:82:55)
at /opt/run/snapshot/package/node_modules/express/node_modules/connect/lib/middleware/csrf.js:54:7
at Object.ondone (/opt/run/snapshot/package/node_modules/express/node_modules/connect/node_modules/uid2/index.js:46:8)
这是我在日志中看到的:

err Sun, 09 Mar 2014 11:52:01 GMT Error: Forbidden
at Object.exports.error (/opt/run/snapshot/package/node_modules/express/node_modules/connect/lib/utils.js:63:13)
at createToken (/opt/run/snapshot/package/node_modules/express/node_modules/connect/lib/middleware/csrf.js:82:55)
at /opt/run/snapshot/package/node_modules/express/node_modules/connect/lib/middleware/csrf.js:54:7
at Object.ondone (/opt/run/snapshot/package/node_modules/express/node_modules/connect/node_modules/uid2/index.js:46:8)
如果我在没有任何代码更改的情况下重新启动应用程序,登录将重新开始工作。我猜与csrf有关的东西已经过时了。我肯定是在登录页面上传递csrf令牌。我在查看源代码时可以看到它

我在节点0.10上,不知道是否应该返回到0.8

这是我的配置:

app.configure(function(){
    app.set('views', __dirname + '/views');
    app.set('view engine','ejs');
    app.use(express.logger('dev'));
    app.use(express.bodyParser());
    app.use(helmet.xframe());
    app.use(helmet.iexss());
    app.use(helmet.contentTypeOptions());
    app.use(helmet.cacheControl());
    app.use(express.cookieParser());
    app.use(express.session({
        secret: "**********************",
        cookie: {
            maxAge  : 3600000, //1 hours
            expires : new Date(Date.now() + 3600000), //2 Hours
        },

        store: new MongoStore({
            mongoose_connection: mongoose.connection
         })
        })
    );

    //app.use(express.cookieSession({secret:"fooseball123!"}));
    app.use(express.csrf());
    //middleware to make csrf token available 
    app.use(function (req, res, next) {
        //res.locals.token = req.session._csrf;
        res.locals.token = req.csrfToken();
        next();
      });
    app.use(express.compress());
    app.use(app.router);
    app.use(express.static(__dirname + '/public', {maxAge: 86400000}));
    app.use(express.errorHandler());
});

我做了两件事,看起来他们解决了这个问题

  • 我将节点版本回滚到0.8
  • 我删除了对express.session的调用中的cookie参数
  • 我猜这个问题与#2有关


    我不知道这与我收到的csrf错误有什么关系。

    对我来说,问题在于Mongo存储,会话数据没有存储到MongoDB,因此没有任何东西可以验证csrf值,因为会话为空。我肯定在存储中看到了会话信息。我认为问题在于cookie值从应用程序启动时起被设置为两个小时,因此在这之后它总是过期。