【发布时间】:2015-08-29 03:04:51
【问题描述】:
我将尝试验证 socket.io 上的连接。
目前,用户首先通过 REST API 进行身份验证,然后,我向用户发送 JsonWebToken 以及经过身份验证的用户的用户名。在我打开客户端和服务器之间的连接后,我的计划是暂时从连接的套接字列表中删除该套接字,以防止在我执行身份验证时在服务器之间接收和发送数据。
在此身份验证中,我验证令牌,如果令牌有效,我将套接字的 ID 重新添加到连接的套接字列表中。唯一的问题是第一部分不起作用。我似乎无法从列表中删除套接字。
为了测试这一点,我做了以下操作。
io.on('connection', function(socket){
//temp delete socket
delete io.sockets.connected[socket.id];
console.log(io.sockets.connected);
socket.emit("test");
});
如您所见,我删除了套接字并发出一个测试事件以查看套接字是否仍然打开。客户端收到了不应该收到的消息。
有人知道为什么会这样吗?
【问题讨论】:
-
如果套接字仍然打开。然后它总是在监听。在此之前你应该确认所有连接都已关闭。如果其中任何一个未关闭,则实时客户端将收听。谢谢。
-
您不想暂时断开套接字。 socket.io 有一个您可以插入的身份验证方案,这样如果套接字没有进行身份验证,就永远不会接受它。请记住,所有 webSocket 连接都以 http 请求开始,因此如果您已经通过 http 进行了身份验证,您也可以将其用于 webSocket。同样从
io.sockets.connected中删除套接字不会断开套接字。 -
我使用 rest api 对用户进行身份验证,以便他们可以使用该服务。据我所知,我可以对用户进行身份验证,但无法以相同的方式对 socket.io 会话进行身份验证。我的想法是使用令牌来确保使用套接字的人是经过身份验证的人
-
见this article 的例子。如果你在其余 api 被认证的时候设置了一个 cookie,那么你可以在 socket.io 中间件中访问那个 cookie 来确定是否通过了认证。或者,您可以从 socket.io 中间件启动一个单独的身份验证进程。 socket.io 内置了访问 http cookie 或执行您自己的身份验证的功能,因此您在执行身份验证时不必断开连接,您可以将身份验证作为连接过程的一部分。
-
让我创建一个示例,如何使用与 http 服务器相同的令牌来验证套接字客户端。