【问题标题】:How can I identify user when user reload the page用户重新加载页面时如何识别用户
【发布时间】:2016-10-06 08:25:25
【问题描述】:

我正在创建一个像 crazy8 一样的纸牌游戏。而且我已经发布了原型。

看这里http://himapoyo.com

我的问题是,当我在游戏过程中重新加载页面时,socket 断开并且我的 socket.id 被更改。

所以服务器端程序无法识别我。现在,当套接字断开时,服务器将玩家从桌子上移除。(因为如果服务器不移除服务器无法识别的玩家,游戏就会停止,所以我编程)。但是如果我可以识别用户,我不想删除只是从表中重新加载页面的玩家。

问题:当用户重新加载页面时如何识别用户?

我认为使用 cookie 作为 ID 最适合这个问题。是否有其他解决方案?

【问题讨论】:

    标签: node.js cookies socket.io


    【解决方案1】:

    其他选项包括:

    • 在客户端使用本地存储
    • 在 url 中传递查询字符串值
    • 作为刷新的一部分发布用户 ID
    • 将用户存储在服务器端会话中
    • 在 redis 缓存中存储用户信息。

    我相信还有更多,但这应该足够了

    【讨论】:

      【解决方案2】:

      阅读您的问题后,我明白(如果我错了,请纠正我)一旦用户刷新页面(重新连接他的套接字),套接字 ID 就会更改(显然)并且您无法识别用户。

      首先,您不应该使用他的套接字 ID 来跟踪用户,因为每次用户重新连接时,套接字 ID 都会改变。在识别用户之后,您应该跟踪套接字 ID 以便与用户进行通信。

      所以,我要做的是在服务器端创建一个“身份验证”事件并断开那些不发出“身份验证”事件的套接字。此事件可能需要任何形式的凭据(JWT、用户名:密码等)。

      用户通过身份验证后,您可以获取该套接字 ID 并将其映射到用户 ID 并使用该套接字 ID 进行进一步的通信。

      所以服务器端流程会是这样的:

      io.on("connect", function (socket) {
          socket.on("authenticate", function(data) {
               // do auth and then make other events
      
               // if auth
      
               socket.auth = true;
               socket.emit("message", "User authenticated");
          });
      
          // If socket fails to authenticate within 3 seconds after connect, disconnect it
      
          setTimeout(function() {
              if (!socket.auth) {
                  socket.disconnect();
              }
          }, 3000);
      });
      

      进入您的应用后,我发现不需要身份验证。这不应该是这样,因为我可以通过发送他/她的名字来劫持任何用户在牌桌上的位置。

      如果您对此感到满意,那么也许您可以跟踪用户名并将其映射到连接时的套接字 ID。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-10
        • 1970-01-01
        • 1970-01-01
        • 2022-06-12
        • 1970-01-01
        • 1970-01-01
        • 2011-06-29
        • 2013-07-16
        相关资源
        最近更新 更多