【问题标题】:Passport.js / Express.js Creating New Session on Every Network RequestPassport.js / Express.js 在每个网络请求上创建新会话
【发布时间】:2015-07-25 18:32:18
【问题描述】:

我有一个有效的登录功能,可以正确验证和保存。然而,express 永远不会记住旧会话,它总是为每个网络请求创建一个新会话。

显然,Passport 对快递中间件的初始化顺序非常敏感。 (例如: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)
    })
}));

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 从未调用过反序列化用户。我认为它永远不会
    达到了那个地步。
  • 我已经检查了有关此问题的其他 StackOverflow 问题, 但这些解决方案都不适合我。
  • 我检查了新会话是否由任何静态资源生成,但它们不是。它仅适用于有意的服务器请求。在没有它们的页面上,不会创建新会话。
  • 所有会话都具有填充或空的 req.session.passport 属性。

【问题讨论】:

  • 您能发布一下您的登录路线是什么样的吗?
  • 当然:app.route('/login').post(passport.authenticate('local-login'), user.loginUser) 目前 loginUser 回调只检查标题并返回 200 状态。我没有使用标准的重定向选项,因为我在前端有一个带有路由的 angular.js 应用程序,它不能很好地处理重定向。根据:“如果我不喜欢 PASSPORT.AUTHENICATE 如何重定向用户...”@toon.io/on-passportjs-specific-use-cases - 我应该能够使用护照实现回调解决方案。不过,如果它可以解决我的问题,我可以让它接受重定向。
  • 你解决过这个问题吗??我遇到了同样的问题

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


【解决方案1】:

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

cookie: {
    httpOnly: true,
    maxAge: 1000
}

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

【讨论】:

  • 这很好,可能会为我解决未来的问题(我基于 Redis 存储设置 cookie,它使用秒数)。可悲的是,它并没有解决我原来的问题。至于明文密码,bcrypt 来了。在添加另一层复杂性之前,我只需要让基本会话正常工作。
  • 那么在修复之后,req.session.id 对于每个请求仍然不同?
猜你喜欢
  • 2020-07-13
  • 2018-11-05
  • 2016-05-21
  • 2012-08-08
  • 2013-02-12
  • 2013-07-26
  • 2021-08-19
  • 2021-06-15
  • 2016-08-07
相关资源
最近更新 更多