使用socket.io进行授权

时间:2012-07-28 04:37:31

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

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

在快递中,这是相当简单的。我首先有一个登录/密码表单,查询数据库以确定记录是否存在,如果它存在,那么我将User附加到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. 
    });

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

2 个答案:

答案 0 :(得分:0)

好像你正在使用Express 我强烈推荐名为Passport的Express中间件(https://github.com/jaredhanson/passport)。

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

最后,回答你的确切问题:一个名为passport.socketio的项目令人惊讶,因为它与上述身份验证策略配合得很好,如果你设置了Express的会话,它也会很好地发挥作用。 (https://github.com/jfromaniello/passport.socketio

答案 1 :(得分:-2)

您可以按如下方式挂接socket.io的authorization函数:

var io = require('socket.io').listen(80);

io.configure(function (){
  io.set('authorization', function (handshakeData, callback) {
    // findDatabyip is an async example function
    findDatabyIP(handshakeData.address.address, function (err, data) {
      if (err) return callback(err);

      if (data.authorized) {
        handshakeData.foo = 'bar';
        for(var prop in data) handshakeData[prop] = data[prop];
        callback(null, true);
      } else {
        callback(null, false);
      }
    }) 
  });
});