2015-11-08 124 views
5

我首先看了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} 
}); 

感谢您的帮助!

回答

2

您的问题不在护照或您的后端。它的前端有棱角。当用户采取登录操作时,您只设置$rootScope.authenticated,但您需要在每次初始化应用程序时通过调用您的api来检查服务器是否已经登录。

也许,在routes/api.js创建router.route('/current_user')路线应该要么返回null(或某些类型的guest用户对象),或者它会返回当前登录的用户的信息,以便您的前端角应用程序将知道用户是否已登录或没有,并有一些用户信息可以使用。如果/api/current_user提供了一个用户,那么你知道你已经登录,你可以设置$rootScope.authenticated = true

+0

对不起,我刚才看到了这个答案。我会看一看!这看起来像是修复 – Manu

3

你提到,persistent sessions with passport, mongodb and express链接,在谈论一个老版本的快递框架,您使用的是一个在你的package.jsonhttps://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/,它一定会帮助你

+0

这不能解决它。 – Manu

0

只是发布,以防万一它帮助任何人。

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

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