Javascript 如何在socket.io中识别不同的客户端?

Javascript 如何在socket.io中识别不同的客户端?,javascript,node.js,sockets,socket.io,Javascript,Node.js,Sockets,Socket.io,我正在使用node.js和socket.io构建一个游戏,我遇到了一个问题。正如您在下面的屏幕截图中所看到的,它要求输入用户名。假设我输入了John Doe。当用户单击enter按钮时,它会将用户的名称(John Doe)和客户端id(socket.io.engine.id)发送到服务器,并重定向到play.html。但是,当我导航到play.html时,如何使服务器知道导航到play.html的玩家是John Doe而不是另一台计算机上的其他人 服务器控制台: 首先-连接完成后,您不应该离

我正在使用node.js和socket.io构建一个游戏,我遇到了一个问题。正如您在下面的屏幕截图中所看到的,它要求输入用户名。假设我输入了John Doe。当用户单击enter按钮时,它会将用户的名称(John Doe)和客户端id(
socket.io.engine.id
)发送到服务器,并重定向到
play.html
。但是,当我导航到
play.html
时,如何使服务器知道导航到
play.html
的玩家是John Doe而不是另一台计算机上的其他人


服务器控制台:


首先-连接完成后,您不应该离开。您可以轻松地将该屏幕集成到游戏中。您可以从服务器获得任何响应,然后动态显示屏幕

第二,因为您正在建立“新连接”(重定向后),所以服务器需要告诉客户端他使用的名称。正如评论中提到的,你不能信任客户!这里的问题是,新连接意味着新的套接字id(因此不应该建立新连接——不重定向)

有一点需要提及——有很多方法可以告诉服务器(从客户端)他使用的是哪个名称。您可以在客户端使用本地存储/cookie或任何您想要的东西。然后,您可以连接到特定的名称空间、加入特定的文件室或发送特定的命令来说明名称。再说一遍,这是不可信的

如果它是非常需要的,你应该使用某种会话。由于连接的工作方式(检查握手),套接字io实际上第一次发出http请求,然后升级到套接字。因此,您可以在服务器端读取浏览的cookies。最简单的方法是设置cookie,然后读取它。如果我们谈论的是安全性——这是不可信的,因为它可以修改

您应该做的是以某种方式对用户进行身份验证(例如使用passport)并将会话id存储到cookie中。这样用户就无法轻松修改它(因为它非常混乱)。会话id和用户名一起存储在数据库中。在每个连接上,您从套接字获取cookie,获取其会话id,查询数据库,获取配对(会话id用户名),然后您就知道这个特定用户的名称。如果客户端需要它-以某种方式发送它(例如,emit)。若并没有会话(或在数据库中找不到会话,这意味着用户编辑了会话),则用户不会登录


这比我认为你需要的要复杂得多。我的建议是不要重定向,因此要确保新连接=新用户名,故事结束。祝你好运

作为会话的替代方案,您可以在重定向到新页面之前向用户发出JWT。在页面加载之前,服务器可以验证JWT签名和负载,因此可以信任用户名(负载)

JWT可以添加到请求头、正文或查询字符串中。如果您在页面上进行身份验证并打开第二个浏览器选项卡/窗口,它们就不起作用,因为这样您就无法在请求之前将它们注入这些部分。在这种情况下,你需要一块饼干

示例和信息:


您需要会话cookie或查询字符串参数。@Slaks我在考虑查询字符串参数,但用户可以轻松修改它,而且似乎不太安全。从根本上说,不可能信任来自客户端的数据。你想阻止什么样的攻击?与其说是一种攻击,不如说是维护一个“黑匣子”,而且我知道来自客户端的数据不应该被信任,但如果没有字符串参数,就无法做到这一点似乎很奇怪。要做什么?你实际上是在要求信任客户来识别自己。为什么看起来很奇怪?哦,这是个很好的建议!我最近使用过它,但不知何故忘了提到:)它们非常容易设置并提供简单的身份验证,但仍然容易受到攻击,特别是如果设置了很高的过期时间。尽管如此,这还是一个不错的选择,因为您不需要cookie解析器、会话存储等等。生成和验证令牌的简单函数将起作用。干得好,诺德曼!谢谢我认为,在“API优先”的世界中,我们将看到越来越多的这种情况,在这个世界中,您需要不带cookie的身份验证。干杯