如何在socket.io?

时间:2016-04-05 18:37:27

标签: javascript node.js sockets socket.io

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

enter image description here

服务器控制台:

enter image description here

2 个答案:

答案 0 :(得分:2)

首先 - 一旦建立连接,您应该导航。您可以轻松地将该屏幕集成到游戏中。您可以从服务器获得任何响应,然后动态显示屏幕。

第二 - 因为你正在制作新的连接' (重定向后),它由服务器告知客户他使用的名称。正如评论中提到的那样 - 你不能相信客户!这里的问题是新连接意味着新的套接字ID(因此你不应该建立新的连接 - 没有重定向)。

稍微提一下 - 有很多方法告诉服务器(来自客户端)他使用的名称。您可以在客户端使用本地存储/ cookie或任何您想要的内容。然后,您可以连接到特定的命名空间,连接特定的房间或发送说明名称的特定命令。再次 - 这不值得信赖。

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

你应该做的是以某种方式验证用户(例如使用护照)并将会话ID存储到cookie中。这样用户就无法轻易修改它(因为它非常混乱)。会话ID与用户名一起存储在数据库中。在每个连接上,您从套接字获取cookie,获取它的会话ID,查询数据库,获取该对(会话ID< - >用户名),然后您知道该特定用户的名称。如果客户需要它 - 以某种方式发送它(例如发出)。如果没有会话(或者在数据库中找不到会话,这意味着用户编辑了它) - 用户没有登录。

这无论如何都比我想象的要复杂得多。我的建议是不要重定向,因此请确保新连接=新用户名,故事结束。祝你好运!

答案 1 :(得分:1)

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

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

示例和信息:

glob