Node.js Passport.js/Express.js根据每个网络请求创建新会话

Node.js Passport.js/Express.js根据每个网络请求创建新会话,node.js,session,express,redis,passport.js,Node.js,Session,Express,Redis,Passport.js,我有一个有效的登录功能,可以正确地进行身份验证和保存。但是,express从不记得旧会话,它总是为每个网络请求创建一个新会话 显然,Passport对express中间件的初始化顺序非常敏感。(例如:)。我对照许多示例检查了我的配置,并将其重新排列为,如果有帮助的话,但它没有移动我的bug。要么这不是问题所在,要么我还没有找到配置圣杯。这是我当前的配置: 快速配置 app.engine('html', require('ejs').renderFile); app.set('view engin

我有一个有效的登录功能,可以正确地进行身份验证和保存。但是,express从不记得旧会话,它总是为每个网络请求创建一个新会话

显然,Passport对express中间件的初始化顺序非常敏感。(例如:)。我对照许多示例检查了我的配置,并将其重新排列为,如果有帮助的话,但它没有移动我的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.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的,所以我不确定在查找时是否需要包含会话密钥。在会话条目中,它正确地存储在passport的标准cookie表单中:req.session.passport.user

有没有办法看到passport内部发生了什么?在随后的请求中,它应该这样做:“在请求中调用我们设置的通用passport中间件(passport.initialize),它会找到连接到会话的passport.user。如果它没有(用户尚未验证),它会像req.passport.user={}一样创建它。”请参阅“后续身份验证请求流”-我强烈怀疑我的问题在于这一步,所以最好能够看到其中的内容

一些有趣的花絮:

  • Passport从未调用过反序列化用户。我想永远都不会
    到了那一点
  • 我已经检查了关于这个问题的其他问题, 但这些解决方案都不适合我
  • 我检查了新会话是否由任何静态资源生成,但它们不是。它仅用于有意的服务器请求。在没有它们的页面上,不会创建新会话
  • 所有会话都有填充的或空的req.session.passport属性
对于每个请求,您的会话ID可能不同,因为您的cookie设置为在1秒后过期<代码>cookie.maxAge此处以毫秒为单位:

cookie: {
    httpOnly: true,
    maxAge: 1000
}

编辑:我还得唠叨你如何以明文形式存储密码。不要这样做;)

你可以发布你的登录路径是什么样子的吗?当然可以:
app.route('/login').post(passport.authenticate('local-login'),user.loginUser)
目前,loginUser回调只检查标题并返回200状态。我没有使用标准的重定向选项,因为我在前端有一个angular.js应用程序,它带有路由,不能很好地处理重定向。根据:“如果我不喜欢PASSPORT.AUTHENICATE重定向用户的方式怎么办…”@-我应该能够使用PASSPORT实现回调解决方案。不过,如果它可以解决我的问题,我可以让它接受重定向。你解决过这个问题吗??我遇到了完全相同的问题,这是一个好问题,可能会为我解决未来的问题(我是基于Redis商店设置cookie的,它使用秒)。遗憾的是,它并没有解决我最初的问题。至于明文密码,bcrypt即将推出。在我添加另一层复杂性之前,我只需要让基本会话工作起来。所以在进行修复之后,
req.session.id
对于每个请求仍然是不同的?