Passport不会保持持久登录会话

时间:2015-11-08 15:50:03

标签: javascript node.js mongodb passport.js passport-local

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

感谢您的帮助!

3 个答案:

答案 0 :(得分: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/,它一定会帮助您

答案 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标题。