我首先看了persistent sessions with passport, mongodb and express,但它没有帮助或有意义。
我尝试使用website进行持久登录。我的序列化过程无效。
// 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上找到。
我认为问题在于我立即反序列化,或者至少是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}
});
感谢您的帮助!
答案 0 :(得分:3)
您引用的链接persistent sessions with passport, mongodb and express正在讨论快速框架的旧版本,您在package.json
,https://github.com/manu354/teecher/blob/master/package.json,"express": "~4.13.1"
中使用的版本框架,是非常新的。
您需要移动这些行:
app.use(passport.initialize());
app.use(passport.session());
稍微高一点,紧挨着app.use(session({...})
我建议您关注此博文http://mherman.org/blog/2015/01/31/local-authentication-with-passport-and-express-4/,它一定会帮助您
答案 1 :(得分:2)
您的问题不在护照或后端。它的前端有角度。您只是在用户执行登录操作时设置$rootScope.authenticated
,但您需要在每次应用初始化时通过调用您的api来检查服务器,以查看用户之前是否已登录。
所以,也许,在routes/api.js
中创建一个router.route('/current_user')
路由应该返回null
(或某种类型的访客用户对象),否则它将返回当前登录的用户&#39 ; s信息,以便您的前端角应用程序将知道用户是否登录并具有一些用户信息。如果/api/current_user
为用户提供,则您知道自己已登录,并且可以设置$rootScope.authenticated = true
。
答案 2 :(得分:0)
只是发布以防万一它可以帮助任何人。
检查您的客户端/浏览器是否正在执行Set-Cookie
标题。
就我而言,它在Safari中运行良好,但在Chrome或Firefox中运行不正常。显然是客户端问题,因为没有浏览器识别服务器端代码。 Safari和Chrome / Firefox之间的区别之一是,fetch
polyfill正在Safari中使用,而Chrome和Firefox本身支持它。除非您在其选项中提供fetch
,否则Set-Cookie
不会使用credentials
标题。