【发布时间】:2017-03-30 14:01:49
【问题描述】:
在与 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 方法创建套接字然后才分配事件处理程序时,是否没有“错过”事件的选项?
【问题讨论】:
标签: javascript socket.io sails.js