护照不保持持久login会话

我首先看护照,mongodb和快递持续会议,但没有帮助或没有意义。

我正在尝试持续login我的网站 。 我的序列化过程不起作用。

// Passport needs to be able to serialize and deserialize users to support persistent login sessions passport.serializeUser(function(user, done) { console.log('serializing user:',user.username); //return the unique id for the user return done(null, user._id); }); //Desieralize user will call with the unique id provided by serializeuser passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { console.log('deserializing user:',user.username); return done(err, user); }); }); 

整个护照文件可以在github上find。

我认为问题是我立即得到反序列化,或至less是console.logs显示。

或者可以和我的会议:

 app.use(session({ secret: 'keyboard cat', cookie : { maxAge: 3600000 // see below } })); 

这是我的用户架构:

 var userSchema = new mongoose.Schema({ username : String, password : String, //Hash created_at : {type: Date, default : Date.now} }); 

谢谢您的帮助!

你的问题不在护照或你的后端。 它在angular落的前端。 您只需在用户执行login操作时设置$rootScope.authenticated ,但您需要在每次初始化应用程序时通过调用您的api来检查用户是否已经login。

因此,可能在routes/api.js创build一个router.route('/current_user')路由,它应该返回null (或某种访客用户对象),或者返回当前login用户的信息,结束angular度的应用程序将知道用户是否login,并有一些用户信息的工作。 如果/api/current_user提供了一个用户,那么你知道你已经login了,你可以设置$rootScope.authenticated = true

您提到的链接, 与护照,mongodb和express的持续会话 ,正在讨论旧版本的快速框架,您在package.json中使用的那个, https://github.com/manu354/teecher/blob /master/package.json,“express”:“〜4.13.1 "express": "~4.13.1" ,是非常新的。

您需要移动这些行:

 app.use(passport.initialize()); app.use(passport.session()); 

上面一点,立即在app.use(session({...})之下

我build议你按照这个博客文章http://mherman.org/blog/2015/01/31/local-authentication-with-passport-and-express-4/ ,它一定会帮助你

只是张贴,以防万一它帮助任何人。

检查您的客户端/浏览器是否正在执行Set-Cookie标头。

在我的情况下,它在Safari浏览器中工作正常,但不是在Chrome或Firefox中。 显然是客户端问题,因为没有浏览器识别服务器端代码。 Safari和Chrome / Firefox之间的区别之一是在Safari中使用了fetch填充,而Chrome和Firefox在本地支持。 除非您在其选项中提供credentials ,否则fetch不会使用Set-Cookie标头。