【问题标题】:How do I recognize distinct clients in socket.io?如何在 socket.io 中识别不同的客户端?
【发布时间】:2016-04-05 18:37:27
【问题描述】:

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


服务器控制台:

【问题讨论】:

  • 你需要一个会话cookie或者一个查询字符串参数。
  • @Slaks 我在考虑查询字符串参数,但用户可以轻松修改它,而且看起来不是很安全
  • 根本不可能信任来自客户端的数据。您要防止什么攻击?
  • 与其说是一种攻击,不如说是维护一个“黑匣子”,而且我知道来自客户端的数据不应该被信任,但如果没有字符串参数就无法做到这一点,这似乎很奇怪
  • 做什么?您实际上是在要求信任客户来识别自己。为什么这看起来很奇怪?

标签: javascript node.js sockets socket.io


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    示例和信息:

    https://github.com/auth0/node-jsonwebtoken

    【讨论】:

    • 哦,这个建议不错!我最近使用过它,但不知何故忘了提及 :) 它们非常容易设置并提供简单的身份验证,但仍然容易受到攻击,特别是如果您设置了较长的过期时间。尽管如此 - 这是一个不错的尝试选择,因为您不需要 cookie 解析器、会话存储以及所有这些东西。生成和验证令牌的简单函数将起作用。干得好@nodeerman!
    • 谢谢!我认为我们会在“API 优先”的世界中看到越来越多的情况,在这种情况下,您需要在没有 cookie 的情况下进行身份验证。干杯。
    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 2011-01-27
    • 2016-05-06
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 2019-04-15
    相关资源
    最近更新 更多