使用PassportJS在Session中修改user.username

时间:2017-08-01 19:56:21

标签: node.js express passport.js

我有一个表单,允许人们更新他们的个人资料信息,其中包含来自req.user的数据通过PassportJS。

问题是每当我更新与user.username对应的值时,我都会收到以下错误消息:

TypeError: Cannot read property '_id' of null 

从这段代码中的第6行开始:

passport.deserializeUser(function(id, done) {
  mongo.connect("mongodb://localhost:27017/formulas", function(e, db){
  if (e) {return next(e);}
  var col = db.collection("users");
  col.findOne({"username": id}, function(err, user){
    done(err, {"id": user._id, "username": id, "activeEmail": user.activeEmail, "name": user.name, "password": user.password, "formulas": user.formulas});
    });
  });
});

我假设是因为在serializeUser我正在使用user.username将其加载到会话中,如下所示:

passport.serializeUser(function(user, done) {
  done(null, user.username);
});

有谁知道如何解决这个问题,还是知道Passport难以处理的问题?

我所拥有的更新代码通常如下所示:

router.post('/update-profile', function(req, res) {
    var name = req.body.name;
    var username = req.body.username;
    var db = req.db.collection('users');

    db.updateOne({"username": username}, {
      $set: {
          "name": name,
          "username": username,
        }
      }, function(err, r) {
         assert.equal(null, err);
         assert.equal(null, r.matchedCount);
      }
    });
    res.render('profile', {
      user: req.user
    });
  });

更新

根据评论请求,来自findOne的{​​{1}}的错误消息在调用时为serializeUser,因此查询不是问题。

2 个答案:

答案 0 :(得分:1)

由于username是可更改的值,因此不应将其用作会话Cookie密钥。

我强烈建议使用user._id,因为它是未更改的值,因此服务器仍然可以"知道"即使用户名已更改,当前用户也是如此。检查官方http://passportjs.org/docs,他们还使用id作为会话Cookie密钥。

顺便说一句,即使您使用的是username,也应该对passport.deserializeUser()执行NULL检查:

col.findOne({"username": id}, function(err, user){
    if (user) {
        done(err, {"id": user._id, "username": id, "activeEmail": user.activeEmail, "name": user.name, "password": user.password, "formulas": user.formulas});
    } else {
        done(new Error('User not found'));
    }
});

答案 1 :(得分:1)

请更新护照反序列化功能的代码。您没有检查过,用户是否可用。因此,当没有用户找到时,您收到了该错误>

passport.deserializeUser(function(id, done) {
  mongo.connect("mongodb://localhost:27017/formulas", function(e, db){
  if (e) {return next(e);}
  var col = db.collection("users");
  col.findOne({"username": id}, function(err, user){
    if (err){
        done(new Error('No user found on db'));
    }else if (user){
         done(err, {"id": user._id, "username": id, "activeEmail": user.activeEmail, "name": user.name, "password": user.password, "formulas": user.formulas});
    });
    }
  });
});