sockets - 使用 socket.io 授权

标签 sockets node.js authorization express socket.io

我正在尝试确定如何最好地授权(除了验证)用户使用 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. 
    });

关于如何实现这一点有什么建议吗?是否可以通过session信息来完成?

最佳答案

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

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

最后,回答你的确切问题:一个名为 passport.socketio 的项目非常了不起,因为它可以很好地处理上述身份验证策略,如果你设置 Express 的 session ,它也可以很好地处理。 ( https://github.com/jfromaniello/passport.socketio )

关于sockets - 使用 socket.io 授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11698322/

相关文章:

Java套接字API : How to tell if a connection has been closed?

java - 为什么图像在通过套接字写入发送时不显示在客户端浏览器中?

node.js - 环回 REST findById 不能正常工作

java - 如何使用 JAAS 进行组件特定的访问控制/授权?

c++ - 从零开始构建 IP 语音

c - Linux 守护进程 localhost 有效,但实际 IP 无效

node.js - 使用 NodeJS 将附件添加到 couch db 中的文档

javascript - 从 Firebase 获取空数据

c# - Asp.net MVC 角色管理器

authorization - 未经授权访问用户 Facebook ID?