2015-05-14 122 views
2

我有一个可正常验证并保存的工作登录功能。但是,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。我认为它从来没有
    达到这一点。
  • 我已经检查了有关此问题的其他StackOverflow问题, 但这些解决方案都不适用于我。
  • 我检查过新会话是否由任何静态资源生成,但它们不是。它仅适用于有意识的服务器请求。在没有它们的页面上,不会创建新的会话。
  • 所有会话都有一个填充或空的req.session.passport属性。
+0

你能发布你的登录路线的样子吗? –

+0

可靠的事情: 'app.route('/ login')。post(passport.authenticate('local-login'),user.loginUser)' 目前loginUser回调只是检查标题并发回200状态。我没有使用标准的重定向选项,因为我在前端有一个angular.js应用程序,并且路由不能很好地与重定向一起播放。根据:“如果我不喜欢PASSPORT.AUTHENICATE重新授权用户......”@ http:// toon。io/on-passportjs-specific-use-cases/- 我*应该*能够实施带护照的回拨解决方案。不过,如果它可能解决我的问题,我可以让它接受重定向。 –

+0

你有没有解决这个问题?我有完全相同的问题 – user1180888

回答

0

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

cookie: { 
    httpOnly: true, 
    maxAge: 1000 
} 

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

+0

这是一个很好的接触,并可能为我解决未来的问题(我正在设置基于Redis商店的cookie,它使用秒)。可悲的是,它并没有解决我原来的问题。至于明文密码,bcrypt即将到来。在添加另一层复杂性之前,我只需要基本的会话工作。 –

+0

所以在完成修复后,每个请求'req.session.id'仍然不同? –

相关问题