Passport.js / Express.js在每个networking请求中创build新的会话

我有一个工作loginfunction,正确authentication和保存。 但是,快递永远不会记住旧的会话,它总是为每个networking请求创build一个新的会话。

显然,Passport对于表示中间件初始化的命令是非常敏感的。 (例如: https : //www.airpair.com/express/posts/expressjs-and-passportjs-sessions-deep-dive )。 我检查了我的configuration对一些例子,并重新安排它,如果它会帮助,但它并没有移动我的错误。 要么这不是问题,或者我还没有findconfiguration圣杯。 这是我目前的configuration:

快速configuration

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

护照configuration

  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。如果不是(用户尚未authentication)它创build它像req.passport.user = {}。“ 看到“后续的authentication请求stream” – http://toon.io/understanding-passportjs-authentication-flow/我强烈怀疑我的问题在于这一步,所以能够看到它的内部将是很好的。

一些有趣的花絮:

  • 护照从来没有被称为反序列化用户。 我认为这是从来没有
    达到了这一点。
  • 我已经检查了有关此问题的其他StackOverflow问题,但这些解决scheme都不适合我。
  • 我已经检查过,看看新会话是否由任何静态资源生成,但它们不是。 这只适用于有意识的服务器请求。 在没有他们的页面上,不会创build新的会话。
  • 所有会话都有一个填充或空的req.session.passport属性。

每个请求的会话ID可能会有所不同,因为您的Cookie设置为在1秒后过期。 cookie.maxAge在这里是在MS:

 cookie: { httpOnly: true, maxAge: 1000 } 

编辑:我也不得不唠叨你用明文存储密码。 不要这样做;)