【问题标题】:NodeJs Express Session ID persists on Local Machine but resets on cloud serverNodeJs Express 会话 ID 保留在本地计算机上,但在云服务器上重置
【发布时间】:2016-03-17 21:16:08
【问题描述】:

我有一个使用 nodejs 和 express-session 的 Web 应用程序。当我在本地(127.0.0.1)运行我的应用程序时,会话 ID 对于我发出的每个请求都是相同的。但是,当我在 Amazon 的 EC2 服务器上运行我的应用程序时,每个请求的会话 ID 都会发生变化,导致我的登录系统无法正常工作。

我知道 EC2 服务器上正在创建一个新的会话 ID,因为我在我的身份验证路由中放置了一个打印出 req.session.id 的 console.log 语句。我还通过 mongodb 查看了我的会话集合,并看到一个新的会话文档,其中为每个请求创建了不同的会话 ID。

我的客户直接向我的 EC2 实例的“弹性 IP”地址发出请求。我不确定弹性 IP 是什么,但它的行为似乎类似于公共 IP 地址。

我现在将尝试发布所有相关代码。

server.js

var fs                  = require('fs'),
    express             = require('express'),
    app                 = express(),
    https               = require('https').createServer({
                              key: fs.readFileSync('key.pem'),
                              cert: fs.readFileSync('cert.pem')
                          }, app),
    bodyParser          = require('body-parser'),
    logger              = require('morgan'),
    cookieParser        = require('cookie-parser'),
    methodOverride      = require('method-override'),
    session             = require('express-session'),
    passport            = require('passport'),
    config              = require('./config.js'),
    MongoStore          = require('connect-mongo')(session),
    sessionStore        = new MongoStore({ url:     'mongodb://127.0.0.1/Jibber' }),    
    passportSocketIo    = require("passport.socketio"),
    sessionSecret       = config.sessionSecret,
    sessionKey          = config.sessionKey,

app.set('trust proxy', 1);
app.use(logger('combined'));
app.use(cookieParser(sessionSecret));
app.use(bodyParser.urlencoded({'extended':'false'}));
app.use(bodyParser.json());
app.use(methodOverride());
app.use(session({
    secret: sessionSecret,
    key: sessionKey,
    saveUninitialized: true,
    resave: false,
    store: sessionStore,
    cookie: {
        secure: true,
        maxAge: 60000 * 60
    }
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(express.static(__dirname + '/public'));

// Session-persisted message middleware
app.use(function(req, res, next){
    var err = req.session.error,
        msg = req.session.notice,
        success = req.session.success;

    delete req.session.error;
    delete req.session.success;
    delete req.session.notice;

    if (err) res.locals.error = err;
    if (msg) res.locals.notice = msg;
    if (success) res.locals.success = success;

    next();
});

app.get('/loggedin', function(req, res) {
    console.log(req.session.id);
    res.json(req.isAuthenticated() ? req.user : false);
});

app.get('/logout', function(req, res){
    console.log("LOGGIN OUT " + req.user.username)
    req.logout();
    req.session.destroy();
    res.sendFile(__dirname + '/public/logout-success.html');
});

https.listen(config.port, config.serverUrl, function() {
    console.log("App listening on port " + config.port);
});

这是我第一次使用 Amazon 的 EC2 服务器,所以我觉得这个问题是由服务器引起的,而不是由代码引起的。我将尝试在另一台服务器上运行我的代码,看看它是否会产生同样的问题。我会及时通知你们。

我还想提一下,我取出的很多代码都是使用 google、facebook 和 twitter 的护照验证码。我真的不认为这是问题所在,因为它似乎更像是一个非持久会话问题而不是身份验证问题。但如果需要,我可以发布代码。

感谢您的帮助。

更新:我通过 DigitalOcean 创建了一个新的云服务器,问题也出现在那里!它一定是云服务器的东西……我通过电子邮件向 DigitalOcean 发送了支持。希望他们有答案!

【问题讨论】:

  • 你能检查一下是否设置了cookie吗?
  • @Roland Starke 是的,设置了 cookie。不过需要注意的一件有趣的事情是内容(尽管是加密的)永远不会随着每个请求而改变。
  • Mh 总是不同的会话 id 但相同的 cookie?奇怪的。其他一些提示:将 express.static 移到 cookie 解析器上方。因此,如果请求静态文件,您会快速响应。如果不需要解析正文、cookie 或为静态文件启动会话。您将节省一些 CPU
  • 感谢您的提示 :)

标签: node.js mongodb session digital-ocean aws-ec2


【解决方案1】:

好的,我想通了。我必须添加 {Access-Controll-Allow-Credentials, true} 并且还必须将我的访问控制允许来源设置为我的 chrome 扩展 url。

【讨论】:

    猜你喜欢
    • 2020-12-07
    • 2018-09-04
    • 2014-02-13
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2013-01-22
    相关资源
    最近更新 更多