对于Express应用程序,要验证主体内容(订单标题或查询),您始终可以创建一个验证中间件,该中间件位于实际控制器之前,并且在数据无效的情况下,会以错误响应
Socket.IO不像Express那样支持多个回调链,所以您不能使用相同的方法。
除了检查if
的列表以检查处理程序中的每个字段之外,是否有一种很好的方法来验证socket.IO中的传入消息?
答案 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'));
});
我希望这能解决您的问题。