如何在用户重新加载页面时识别用户

时间:2016-10-06 08:25:26

标签: node.js cookies socket.io

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

看这里http://himapoyo.com

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

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

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

我认为使用Cookie作为ID最适合此问题。有其他解决方案吗?

2 个答案:

答案 0 :(得分:0)

其他选项包括:

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

我确定还有更多,但这应该足够了

答案 1 :(得分:0)

在阅读了你的问题后,我明白了(如果我错了,请纠正我),一旦用户刷新页面(重新连接他的套接字),套接字ID就会发生变化(显然),你就无法识别用户。

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

因此,我要做的是在服务器端进行“身份验证”事件,并断开那些不发出“authenticate”事件的套接字。此事件可以使用任何形式的凭据(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。