【问题标题】:authorization with socket.io使用 socket.io 授权
【发布时间】:2012-07-28 04:37:30
【问题描述】:

我正在尝试确定如何最好地授权(除了验证)用户使用 socket.io 执行特定任务。

在 express 中,这相当简单。我首先有一个登录/密码表单,它查询数据库以确定记录是否存在,如果确实存在,那么我将用户附加到 req.session 数据。

exports.session = function(req, res){
    User.authenticate(req.body.username, req.body.password, function(err, user){
        if (user){
            req.session.user = user;
            res.redirect('/');
        } else {
            console.log("authentication failed");
            res.render('user/login');
        }
    });
};

一旦有了这个,我就可以使用中间件来授权某些请求。例如,

app.put('/api/users/:userId', m.requiresLogin, m.isUser, api.putUser);

//Middleware
exports.isUser = function(req, res, next){
  if (req.session.user._id == req.user._id){
    next();
  } else {
    res.send(403);
  }
};

但我对如何使用 socket.io 执行此操作有点困惑。假设我有一个事件侦听器,它会根据用户的配置文件 JSON 对象更改数据库中的用户配置文件。

    socket.on('updateProfile', function(data){
    // query the database for data.user._id, and update it with the data attribute
    // but only do this if the data.user._id is equal to the user trying to do this. 
    });

关于如何实现这一点的任何建议?可以通过会话信息来完成吗?

【问题讨论】:

    标签: sockets node.js authorization express socket.io


    【解决方案1】:

    您似乎在使用 Express。
    我强烈推荐名为 Passport (https://github.com/jaredhanson/passport) 的 Express 中间件。

    使用 Passport,您可以实施任意数量的策略来验证用户身份(例如通过 Google、Yahoo、Facebook 的 OpenID;通过 Twitter、Facebook 的 OAuth;或本地策略(例如电子邮件注册)。

    最后,回答您的确切问题:一个名为 passport.socketio 的项目非常棒,因为它可以很好地配合上述身份验证策略,如果您设置 Express 的会话,它也可以很好地配合。 (https://github.com/jfromaniello/passport.socketio)

    【讨论】:

      【解决方案2】:

      在此处查看文档:

      https://socket.io/docs/migrating-from-0-9/#authentication-differences

      io.set('authorization', function (handshakeData, callback) {
      // make sure the handshake data looks good
      callback(null, true); // error first, 'authorized' boolean second 
      

      });

      【讨论】:

      • IP 是用户来源的不良指标。一个简单的例子是公司设置,其中许多用户使用相同的网关+ip 上网。家庭路由器也是如此。我正在为 NodeJS + express + Backbone.JS + socket.io 实现一个框架,我在其中使用放置在 cookie 本身上的令牌,因此您可以通过 express 写入并稍后通过 socket.io 读取。如果您需要灵感,请随时查看我的项目github.com/romansky/circuits
      • 请注意,socket.io 1.0 及更高版本已更改。这里给出了如何将上述代码迁移到新范式的解释:socket.io/docs/migrating-from-0-9/#authentication-differences
      • 更新了我的答案
      猜你喜欢
      • 2012-12-14
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 2014-03-10
      • 2012-07-09
      • 1970-01-01
      • 2011-12-23
      相关资源
      最近更新 更多