【问题标题】:Proper way to extract user information with Passport node.js and Socket.io使用 Passport node.js 和 Socket.io 提取用户信息的正确方法
【发布时间】:2016-10-31 11:11:35
【问题描述】:

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

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' }

【问题讨论】:

  • sockets,在编程级别上,与socket.io 无关...我删除了标签。有关详细信息,请参阅sockets 标签详细信息。

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


【解决方案1】:
   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:这只是一个示例,未经测试或验证,我强烈推荐

希望这会有所帮助!

【讨论】:

  • socket.request.session.passport.user 仅包含电子邮件帐户.. 我正在尝试弄清楚如何向其中添加另一个描述字段
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 2022-10-02
  • 2014-12-25
  • 1970-01-01
  • 2016-10-30
  • 2018-04-13
  • 1970-01-01
相关资源
最近更新 更多