4

我已经使用 express (node.js)+ mongodb 在单个 Heroku dyno 上实现了一些用户身份验证,并且一切正常。但是,当我增加 dynos 的数量(超过 1 个)时,我无法登录,我一直在我的登录页面上被重定向,这意味着我的会话尚未设置。这是我的代码:

checkCookies = function(req, res, next) {

  if(req.session.user){
   res.locals.user = req.session.user;
   next();
  }
  else{
    res.redirect('/login');
  }
};
app.use(express.cookieParser());
  app.use(express.session({ secret: '0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK',
  cookie: {httpOnly: true, maxAge:14*24*60*60*1000}
  }));

使用 mongodb 在 express/node.js 上处理共享会话的最佳解决方案是什么?

4

4 回答 4

6

上述答案具有误导性,因为它们暗示您不能在 Heroku 上的多个 dyno 之间共享基于 cookie 的会话。

如果我使用cookie-session而不是express-session ,我可以跨多个 dyno 使用基于 cookie 的会话。该线程的第一篇文章中缺少的是秘密值未传递给 cookie 解析器。这意味着每次进程重新启动或新的测功机启动时,节点都会为解析器分配一个随机散列。

为我做以下工作:

app.use(express.cookieParser('0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK'))
app.use(express.session({
  secret: '0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK',
  cookie: { httpOnly: true, maxAge: 14 * 24 * 60 * 60 * 1000 },
}))
于 2014-06-18T22:32:57.647 回答
5

connect-mongo 应该可以满足您的需求:https ://github.com/kcbanner/connect-mongo

于 2013-06-26T03:55:44.543 回答
5

connect-mongo模块与 express 一起使用。

var http    = require('http'),
    express = require('express'),
    session = require('connect-mongo')(express)

然后在您的工作人员设置会话中进行外部存储。下面的代码将使用来自 mongo、cookie 和额外标头的会话,以允许跨域和 jsonp。

app.configure(function() {
  app.use(express.cookieParser());
  app.use(express.session({
    store: new session({
      db: 'sessions'
    }),
    secret: 'yoursecret',
    cookie: {
      path: '/',
      maxAge: 1000 * 60 * 60 * 24 // 1 day
    }
  }));
  app.use(function(req, res, next) {
    res.header('Access-Control-Allow-Credentials', true);
    res.header('Access-Control-Allow-Origin', req.headers.origin);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
    next();
  });
  app.set('jsonp callback', true);
});
于 2013-06-26T09:45:50.733 回答
0

对于任何寻找更新的快速复制/粘贴解决方案的人,然后基本上按照上面发布的链接 Dan 或只使用下面的代码段:

var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
var mongoose = require('mongoose'); // if using mongoose

mongoose.connect(connectionOptions); // if using mongoose

app.use(cookieParser());

app.use(session({
    store: new MongoStore({mongooseConnection: mongoose.connection}),
    secret: '0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK',
    cookie: {
        path: '/',
        maxAge: 1000 * 60 * 60 * 24 // 1 day
    }
}));
于 2020-03-31T01:49:10.960 回答