Node.js Passport.js/Express.js根据每个网络请求创建新会话
我有一个有效的登录功能,可以正确地进行身份验证和保存。但是,express从不记得旧会话,它总是为每个网络请求创建一个新会话 显然,Passport对express中间件的初始化顺序非常敏感。(例如:)。我对照许多示例检查了我的配置,并将其重新排列为,如果有帮助的话,但它没有移动我的bug。要么这不是问题所在,要么我还没有找到配置圣杯。这是我当前的配置: 快速配置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
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属性李>
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
对于每个请求仍然是不同的?