我有一个正常工作的登录功能,可以正确验证和保存。但是,express永远不会记住旧会话,它总是为每个网络请求创建一个新会话。
显然,Passport对表达中间件初始化的顺序非常敏感。 (例如:https://www.airpair.com/express/posts/expressjs-and-passportjs-sessions-deep-dive)。我根据一些例子检查了我的配置并重新安排它,如果它有帮助,但它没有移动我的bug。这不是问题,或者我还没有找到配置圣杯。这是我目前的配置:
快速配置
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配置
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)
})
}));
Passport是否需要为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/我强烈怀疑我的问题出在那一步,所以能够看到里面的内容会很好。
一些有趣的花絮:
答案 0 :(得分:0)
您的会话ID可能因每个请求而异,因为您的Cookie设置为在1秒后过期。 cookie.maxAge
这里是ms:
cookie: {
httpOnly: true,
maxAge: 1000
}
编辑:我还要唠叨你用明文存储密码。不要这样做;)