如何构造Socket.io身份验证

如何构造Socket.io身份验证,socket.io,flask-socketio,Socket.io,Flask Socketio,我正在服务器端使用Flask SocketIO和javascript Socket.IO客户端创建一个应用程序。(稍后还会有一个Python客户端)。我想确保用户在连接到web套接字服务器之前经过身份验证 我创建了一个PHP登录表单来检查用户名和密码。如果这些是有效的,那么将返回一个唯一的令牌,并且该令牌也将插入到服务器上的表中。令牌被传递到客户端javascript,在那里它与创建web套接字连接的请求一起提交 据我所知,SocketIO只接受连接,我需要将验证代码放在('connect')d

我正在服务器端使用Flask SocketIO和javascript Socket.IO客户端创建一个应用程序。(稍后还会有一个Python客户端)。我想确保用户在连接到web套接字服务器之前经过身份验证

我创建了一个PHP登录表单来检查用户名和密码。如果这些是有效的,那么将返回一个唯一的令牌,并且该令牌也将插入到服务器上的表中。令牌被传递到客户端javascript,在那里它与创建web套接字连接的请求一起提交

据我所知,SocketIO只接受连接,我需要将验证代码放在('connect')decorator的
@SocketIO.on下。(我假设Socket.IO的基于服务器的实现以类似的方式工作)。因此,我的代码根据数据库表检查提交的令牌,如果它有效,只允许发生web套接字连接。但是,如果令牌无效,我将发出
disconnect()
命令。javascript客户端不会再次尝试连接,这就是我在本场景中想要的

这就是它变得棘手的地方

我想在客户端使用
socket.on('disconnect',function(){//do something})编写一个断开连接处理程序
允许用户在插座因移动连接不良而断开时重新连接。如何区分由于验证失败而导致的意外断开和故意断开

相反,我想提醒用户,他们的验证过程失败了。但是,如何将其与由于移动连接不良导致插座断开的情况区分开来呢

我想在客户端使用socket.on('disconnect',function(){//do something})编写一个断开连接处理程序;例如,当插座因移动连接不良而断开时,允许用户重新连接


您无需担心重新连接。Socket.IO客户端协议包括重新连接支持,并且在连接丢失时将始终尝试重新连接。要验证这一点,请启动服务器,连接客户端,然后关闭服务器。稍晚一点重新启动服务器,几秒钟后,您就会看到连接重新建立。

谢谢米格尔,这就是is所做的一切。但是,如果a)初始登录由于某种原因失败,或者b)连接暂时中断,我确实需要显示一条信息性消息。我可以在我的登录功能中使用一个标志来检测初始提交失败的时间(并在成功时清除该标志)。我可以假设的所有其他情况都是辍学。