如何构造Socket.io认证

How to structure Socket.io Authentication

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

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

据我了解,Flask-SocketIO 将简单地接受连接,我需要将我的验证代码放在 @socketio.on('connect') 装饰器下。 (我假设 Socket.IO 的基于服务器的实现以类似的方式工作)。因此,我的代码根据数据库 table 检查提交的令牌,如果它有效,则只允许进行 Web 套接字连接。但是,如果令牌无效,我会发出 disconnect() 命令。 javascript 客户端不会再次尝试连接,这正是我在这种情况下想要的。

这就是它变得棘手的地方...

我想使用 socket.on('disconnect', function() { //do something }); 在客户端编写断开连接处理程序,以允许用户在套接字因移动连接不佳等原因断开时重新连接。如何区分意外断开连接和因验证失败而故意断开连接?

相反,我想提醒用户他们的验证过程失败了。但是,如何区分这种情况与由于移动连接不良导致套接字损坏的情况?

I would like to write a disconnect handler on the client side using socket.on('disconnect', function() { //do something }); to allow the user to reconnect when the socket is broken due to a poor mobile connection for example.

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