【发布时间】: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