Passport.js / Express.js在每个网络请求上创建新会话

时间:2015-05-14 08:03:44

标签: node.js session express redis passport.js

我有一个正常工作的登录功能,可以正确验证和保存。但是,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/我强烈怀疑我的问题出在那一步,所以能够看到里面的内容会很好。

一些有趣的花絮:

  • Passport从未调用过deserializeUser。我认为它永远不会 达到了这一点。
  • 我已经检查过有关此问题的其他StackOverflow问题, 但这些解决方案都不适合我。
  • 我已经检查过新会话是否由任何静态资源生成,但它们不是。它仅适用于有意的服务器请求。在没有它们的页面上,没有新的会话。
  • 所有会话都有一个填充或空的req.session.passport属性。

1 个答案:

答案 0 :(得分:0)

您的会话ID可能因每个请求而异,因为您的Cookie设置为在1秒后过期。 cookie.maxAge这里是ms:

cookie: {
    httpOnly: true,
    maxAge: 1000
}

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