Passport.js/Express.js在每个网络请求中创建新会话
我有一个可正常验证并保存的工作登录功能。但是,express永远不会记住旧会话,它总是为每个网络请求创建一个新会话。Passport.js/Express.js在每个网络请求中创建新会话
很明显,护照对表达中间件初始化的顺序非常敏感。 (例如:https://www.airpair.com/express/posts/expressjs-and-passportjs-sessions-deep-dive)。我检查了一些例子的配置,并重新安排了它,以便它可以帮助,但它没有改变我的错误。要么这不是问题,或者我还没有找到配置圣杯。这是我目前的配置:
快速配置
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.use(express.static(path.join(config.root, '/views')));
app.set('views', config.root + '/views');
var sessionOpts = {
saveUninitialized: true,
resave: false,
store: new RedisStore({
host: 'localhost',
port: 6379
}),
secret: 'keyboard',
cookie: {
httpOnly: true,
maxAge: 1000
}
}
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: false
}));
app.use(cookieParser('keyboard'));
app.use(session(sessionOpts));
app.use(passport.initialize());
app.use(passport.session());
app.use(cors());
require('./routes/router.js')(app, passport);
护照配置
passport.use('local-login', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
},
function(req, username, password, done) {
client.hgetall(username, function(err, reply) {
if (err) {
return done(err);
}
if (!reply) {
return done(null, false, {
message: 'Incorrect username.'
})
}
if (reply.password !== password) {
return done(null, false, {
message: 'Incorrect password.'
})
}
return done(null, reply)
})
}));
确实护照需要手把手的Redis? Redis会话存储在'sess'文件夹中,其中包含如下所示的键:sess:RhodmaK2V2wDNLglV5j1B6rC。我发现的所有教程都是关于Mongo的,因此我不确定在试图查看它时是否需要以某种方式包含会话密钥。在会话条目中,它正确地存储在标准Cookie形式的护照,虽然:req.session.passport.user
有没有办法看到护照初始化内发生了什么?在后续请求中,它应该这样做:“我们设置的一般护照中间件(passport.initialize)在请求上被调用,它发现连接到会话的passport.user。如果不是(用户尚未认证)它创建它就像req.passport.user = {}。“请参阅“后续认证请求流程” - http://toon.io/understanding-passportjs-authentication-flow/我强烈怀疑我的问题在于此步骤,因此能够看到它的内部会很高兴。
一些有趣的花絮:
- 护照从来没有一次叫deserializeUser。我认为它从来没有
达到这一点。 - 我已经检查了有关此问题的其他*问题, 但这些解决方案都不适用于我。
- 我检查过新会话是否由任何静态资源生成,但它们不是。它仅适用于有意识的服务器请求。在没有它们的页面上,不会创建新的会话。
- 所有会话都有一个填充或空的req.session.passport属性。
对于每个请求,您的会话ID可能会有所不同,因为您的Cookie设置为在1秒后过期。 cookie.maxAge
这里是MS:
cookie: {
httpOnly: true,
maxAge: 1000
}
编辑:我也有唠叨你有关明文存储密码。不要这样做;)
这是一个很好的接触,并可能为我解决未来的问题(我正在设置基于Redis商店的cookie,它使用秒)。可悲的是,它并没有解决我原来的问题。至于明文密码,bcrypt即将到来。在添加另一层复杂性之前,我只需要基本的会话工作。 –
所以在完成修复后,每个请求'req.session.id'仍然不同? –
你能发布你的登录路线的样子吗? –
可靠的事情: 'app.route('/ login')。post(passport.authenticate('local-login'),user.loginUser)' 目前loginUser回调只是检查标题并发回200状态。我没有使用标准的重定向选项,因为我在前端有一个angular.js应用程序,并且路由不能很好地与重定向一起播放。根据:“如果我不喜欢PASSPORT.AUTHENICATE重新授权用户......”@ http:// toon。io/on-passportjs-specific-use-cases/- 我*应该*能够实施带护照的回拨解决方案。不过,如果它可能解决我的问题,我可以让它接受重定向。 –
你有没有解决这个问题?我有完全相同的问题 – user1180888