在努力使用socket.io连接身份验证(here和here)之后,感谢@ sgress454,我意识到如何让它工作,我发送身份验证/授权令牌作为连接中的查询(见下文)。
在身份验证失败(无效/过期令牌或无效用户)时,我返回带有false参数的回调以指示连接被拒绝。
但是在客户端,我不知道应该如何处理它,即使明确断开连接后套接字似乎也在尝试重新连接 - 我一直看到它正在尝试重新连接。
客户端代码是这样的:
var _onConnectError = function(err) {
if (err.description == 400) {
console.log("Connection rejected");
_disconnectAndCleanupSocket();
} else {
console.log("##SOCKET - connect_error", err.description, err);
}
}
var _disconnectAndCleanupSocket = function() {
if (io.socket) {
if (io.socket.isConnected()) {
io.socket.disconnect();
}
io.socket.removeAllListeners();
delete io.socket;
}
};
io.socket = io.sails.connect({ query: "token=" + token});
io.socket.on('connect', _onConnect);
io.socket.on('connect_error', _onConnectError);
io.socket.on('reconnect_error', _onConnectError);
在服务器(config / sockets.js)上我有:
beforeConnect: function(handshake, cb) {
var token = handshake._query ? handshake._query.token : null;
CipherService.verifyToken(token, function verifyTokenResults(err, decoded, info) {
if (err || !decoded) {
if (err.name === "TokenExpiredError") {
// token expired - user can't connect...
return cb(null, false);
} else {
// some other error...
return cb(err, false);
}
}
AuthUser.findOne(decoded.user.id).exec(function(err, user) {
if (err || !user || !user.is_active) {
return cb(null, false);
}
return cb(null, true);
});
});
// (`false` would reject the connection)
},
我试图找到文档并探索响应对象(在开发人员工具中),但我唯一看到的是description
字段,拒绝时返回400,如果没有响应则返回0(例如服务器)已经失败了。
是否有一些示例/文档?总的来说,我没有找到在非标准情况下使用SailsSocket
的详细说明(其他情况下使用io.sails.connect()
)。
处理此类拒绝的正确方法是什么(并且不应该将其作为sails socket.io客户端的一部分来处理?)
顺便说一句,我不能自己实例化SailsSocket
,只能使用'io.sails.connect()'函数来实现。这是故意的吗?当我使用connect方法创建套接字并且只分配事件处理程序时,是否没有“错过”事件的选项?
答案 0 :(得分:0)
您的问题的简短回答是您可以设置reconnection
标志以打开或关闭自动重新连接:
// Disable auto-reconnect for all new socket connections
io.sails.reconnection = false;
// Disable auto-reconnect for a single new socket connection
var mySocket = io.sails.connect({reconnection: false});
就创建SailsSocket
而言,你是正确的io.sails.connect()
是创建SailsSocket的唯一方法。由于连接是异步的,因此在实际连接发生之前,您将在调用connect
后立即绑定任何事件处理程序,因此您不会错过任何通知。