在Socket.IO中验证传入消息的好方法吗?

时间:2018-07-02 09:38:49

标签: node.js validation socket.io

对于Express应用程序,要验证主体内容(订单标题或查询),您始终可以创建一个验证中间件,该中间件位于实际控制器之前,并且在数据无效的情况下,会以错误响应

Socket.IO不像Express那样支持多个回调链,所以您不能使用相同的方法。

除了检查if的列表以检查处理程序中的每个字段之外,是否有一种很好的方法来验证socket.IO中的传入消息?

3 个答案:

答案 0 :(得分:1)

实际上,您现在可以在最新版本的socket.io中使用socket.use(),就像nodejs中的中间件一样。

io.on('connection', (socket) => {
  socket.use((packet, next) => {
    if (packet.doge === true) return next();
    next(new Error('validation error'));
  });
});

答案 1 :(得分:0)

您可以使用SocketioJWT:

var io            = require("socket.io")(server);
    var socketioJwt   = require("socketio-jwt");

    //// With socket.io < 1.0 ////
    io.set('authorization', socketioJwt.authorize({
      secret: 'your secret or public key',
      handshake: true
    }));
    //////////////////////////////

    //// With socket.io >= 1.0 ////
    io.use(socketioJwt.authorize({
      secret: 'your secret or public key',
      handshake: true
    }));
    ///////////////////////////////

    io.on('connection', function (socket) {
      // in socket.io < 1.0
      console.log('hello!', socket.handshake.decoded_token.name);

      // in socket.io 1.0
      console.log('hello! ', socket.decoded_token.name);
    })

有关更多验证选项,请参见auth0/jsonwebtoken

答案 2 :(得分:0)

这是一个为每个传入的Socket执行的函数,并接收该套接字作为参数,并且可以选择将执行推迟到下一个已注册的中间件。

io.use((socket, next) => {
if (socket.request.headers.cookie) return next();
next(new Error('Authentication error'));
});

我希望这能解决您的问题。