使用Passport node.js和Socket.io提取用户信息的正确方法

时间:2016-06-28 23:21:28

标签: javascript node.js socket.io passport.js

我使用护照登录并验证用户如下

passport.js

module.exports = function(passport){
  passport.serializeUser(function(user, done) {
      done(null, user.email);
  });

  passport.deserializeUser(function(email, done) {
      User.getUserByEmail(email, function(err, user) {
        done(err, user);
      });
  });

在我的 app.js

app.io.sockets.on('connection', function(socket){
    console.log('a user connected');
    var userEmail = socket.request.session.passport.user;
    socket.username = userEmail;

现在我知道req.user将填充所有用户信息但我想在app.io.sockets.on(' connection')代码中提取user.description信息就像我一样用电子邮件做。但是,电子邮件是唯一通过的东西。

所以我也在想 a)我应该更换我的passport.js

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

因此它将整个用户对象返回给socket.request.session.passport.user;这似乎不安全(因为密码哈希和其他一切都将被传递)(除非有一种方法我可以将user.email和user.description传递给done()而不需要整个对象?

或 b)使用用户的电子邮件在app.io.sockets.on(' connection')中查找findOne

哪个是正确的解决方案,或者有更好的方法来提取一个不是电子邮件/ ID的特定用户字段。

编辑1更新:

passport.js本地登录策略

 // Login
  passport.use('local-login', new LocalStrategy({
    // changing default username field to email
    usernameField: 'email',
    passReqToCallback: true
  },
  ....

socket.request.session.passport变量看起来像这样

Session {
  cookie:
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true },
  flash: {},
  passport: { user: 'myemail@gmail.com' } }

编辑2更新:

好的,我想我想出了一个更好的方法就是在我的app.js

中做到这一点
// and user description to pass into our socket session
app.use(function(req, res, next){
  if (req.user){
   req.session.description = req.user.description;
  }
  next();
});

这样它将显示如下

Session {
  cookie:
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true },
  flash: {},
  passport: { user: 'email@gmail.com' },
  description: 'Random Description' }

1 个答案:

答案 0 :(得分:0)

   module.exports = function(passport){
  passport.serializeUser(function(user, done) {
    var object = user.email + ':'+ user.description
      done(null, object);
  });

  passport.deserializeUser(function(object, done) {

  var serial = object.split(':'),
      email  = serial[0]

      User.getUserByEmail(email, function(err, user) {
        done(err, user);
      });
  });
App.js中的

    app.io.sockets.on('connection', function(socket){
    console.log('a user connected');
    var userObject = socket.request.session.passport.user.split(':');
    socket.username = userObject[0];
    socket.userDescription = userObject[1];

这样您就可以将往返保存到数据库中。

ps:这只是一个例子,它没有经过测试或验证,我强烈推荐

希望这有帮助!