Ale*_*olm 35 session node.js passport.js
我已经设置了Passport来验证存储在mongodb中的用户.似乎工作正常:身份验证成功/失败,会话变量设置.但是,让Passport检查会话是否失败.有些东西似乎是错误的,因为我添加到deserializeUser回调中的console.log语句从未见过光.我认为我的问题与deserializeUser从未被调用有关.有人能够诊断我的失误吗?
// Passport configuration
passport.serializeUser(function(user, cb){ cb(null, user.id) });
passport.deserializeUser(function(uid, cb){
console.log("Trying to deserialize user: "+uid);
User.findById(uid, function(err, user){
cb(err, user);
});
});
// auth strategy function
passport.use(new LocalStrategy({usernameField: 'email'},
function(email, pass, done){
User.findOne({email: email}, function (err, user) {
if (err)
return done(err);
if (!user)
return done(null, false, {message: "Couldn't find user"});
var crypted = bcrypt.hashSync(pass, user.salt);
if(user.hashpass != crypted)
return done(null, false, {message: "Bad password"});
return done(null, user);
});
}
));
passport.CreateSession = function (req, res, next) {
passport.authenticate('local', function(err, user, info){
if(err || !user)
return res.json({status: "Failure: "+err});
req.logIn(user, function (err){
if(err)
return res.json({status: "Failure: "+err});
return res.json({status: "Authenticated"});
});
})(req, res, next);
};
Run Code Online (Sandbox Code Playgroud)
在app.js中有以下内容:
app.post('/session', passport.CreateSession); // restify better
app.del('/session', passport.DestroySession);
app.get('/images', passport.CheckSession, routes.images);
Run Code Online (Sandbox Code Playgroud)
Dav*_*err 35
对于遇到此问题的其他人,请看一下:
app.use(session({
secret: 'something',
cookie: {
secure: true
}}));
Run Code Online (Sandbox Code Playgroud)
如果您cookie.secure设置为true并且您没有使用SSL(即https协议),那么具有会话ID的cookie不会返回到浏览器,并且一切都会以静默方式失败.删除此标志解决了我的问题 - 需要几个小时才能实现这一点!
Ric*_*ick 26
如果在使用authenticate护照进行身份验证时使用回调,则需要手动登录用户.它不会被你召唤.
passport.authenticate('local', function (err, user) {
req.logIn(user, function (err) { // <-- Log user in
return res.redirect('/');
});
})(req, res);
Run Code Online (Sandbox Code Playgroud)
Jar*_*son 11
你use()倒是passport.session()中间件?就像在这个例子中:
https://github.com/jaredhanson/passport-local/blob/v1.0.0/examples/login/app.js#L91
这就是恢复会话和调用的原因deserializeUser,所以听起来可能会丢失.
好的,这花了我将近 3 天的时间来解决,这似乎是一个简单的修复,至少在我的情况下。我必须放置:
app.use(require('cookie-parser'));
Run Code Online (Sandbox Code Playgroud)
和
app.use(require('express-session')({
secret: 'keyboard cat',
resave: false,
saveUninitialized: false
}));
Run Code Online (Sandbox Code Playgroud)
致电前:
app.use(passport.initialize());
app.use(passport.session());
Run Code Online (Sandbox Code Playgroud)
注意:这些片段不是我的实际代码,我取自GitHub,但这就是它的要点。