【问题标题】:Setting up sessions on express app on multiple dynos heroku app在多个 dynos heroku 应用程序上设置快速应用程序会话
【发布时间】:2020-03-31 09:49:10
【问题描述】:

我已经使用 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 上处理共享会话的最佳解决方案是什么?

【问题讨论】:

    标签: node.js mongodb session heroku express


    【解决方案1】:

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

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

    为我做以下工作:

    app.use(express.cookieParser('0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK'))
    app.use(express.session({
      secret: '0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK',
      cookie: { httpOnly: true, maxAge: 14 * 24 * 60 * 60 * 1000 },
    }))
    

    【讨论】:

    • 很好的答案,很高兴知道能够指定 cookie 密码
    • 不应该是cookieSession而不是express.session吗?就像在文档中一样 const cookieSession = require('cookie-session')
    【解决方案2】:

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

    【讨论】:

    • 非常感谢!所有设置在 10 分钟内完成
    【解决方案3】:

    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);
    });
    

    【讨论】:

    • 感谢您的进一步解释!你能告诉我允许跨域和jsonp的好处吗?或者告诉我在哪里可以读到有关它的信息?我用谷歌搜索,没有任何帮助
    • 如果您将拥有 example.com 网站,并且会从其 JS AJAX 请求调用 api.com - 这将是您的节点应用程序,那么由于大多数浏览器都不允许这样做到安全限制。您已在服务器端启用此功能以允许来自其他域的访问,如果您需要旧版浏览器支持,则必须额外添加 JSONP 并使用它。如果你想共享会话 cookie 数据,你需要在你的 ajax 请求中添加额外的位,对于 jQuery,它将是 xhrFields: { withCredentials: true }。在此处查看更多信息:goo.gl/Y1XK0
    【解决方案4】:

    对于任何寻找更新的快速复制/粘贴解决方案的人,请基本上按照上面发布的链接 Dan 或在下面使用我的 sn-p:

    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-08-12
      • 2021-04-05
      • 2011-09-01
      • 2019-10-11
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      相关资源
      最近更新 更多