我想与 channel 进行实时聊天,这是我的需求:

我看到两种不同的体系结构可以实现此目的:

带有Socket.io的



  • 带有Crossbar.io的



  • 这些是我的问题:
  • 我应该选择哪种架构,为什么选择?
  • 关键是无法从客户端获取用户ID,因为它可能格式错误。因此,在第一种架构中,我认为在每个套接字消息上,我都应该从cookie附加PHPSESSID值,并在服务器端从Redis检索PHP session 。我是对的还是有更好的方法来获取用户ID?
  • 我想知道在第二种体系结构中获取用户ID是否可以以不同的方式进行吗?

  • 编辑:
    我选择了Crossbar.io,因为它功能非常强大,并且可以实时交流许多不同的语言应用程序。在研究示例之后,我得出了以下结论:
  • 在每个登录用户上,数据库中都已生成 key 。
  • PHP客户端(通过)连接到Crossbar服务器并注册自定义WAMP-CRA身份验证器
  • 用户的浏览器连接到Crossbar服务器,并且受到了挑战。 Secret和auth_id(用户ID)是通过页面加载从数据库加载的,因此它是
    可以完成挑战并发送回复。
  • PHP身份验证器在数据库中搜索提供的 secret 且id等于auth_id的用户。如果存在,则它成功进行身份验证
    session 。现在我们可以相信auth_id是真实的用户ID。

  • 这些是我的问题:
  • 如何获得订阅的auth_id?
  • 我还添加了cookie身份验证,并且身份验证后会记住浏览器。但是,当我查看Chrome DevTools时,本地存储中没有任何cookie或值。即使在清除缓存后,Crossbar仍然可以记住我的浏览器。我想知道这怎么可能?

  • 编辑2:
    也许我被误解了,但是主要的问题是选择合适的体系结构并获得可信任的用户ID。没有注意,所以我授予赏金,此后我被否决了。我阅读了很多有关实时应用程序的信息,并最终决定使用Crossbar.io,因此我编辑了与其相关的问题。然后人们开始反对,提出了另一种架构,但并没有真正回答我的问题。毕竟,我自己设法做到了,并提出了我的答案。

    最佳答案

    关于获取用户ID:

    我看到的每个实时聊天示例都从客户端获取ID。这是不安全的,因为客户端可以轻松地对其进行操作,因此我需要找到另一种方法。阅读WAMP specs之后,我终于发现不仅要在应用程序中而且还要在Crossbar.io中对用户进行身份验证。我选择了动态WAMP-CRA方法,并实现了以下方法:

  • PHP应用程序连接到Crossbar服务器并注册自定义身份验证器(类似于example)
  • 用户登录应用程序后,将为他生成一个 secret key 并保存在数据库中。注销后, key 被销毁。
  • 工作流程:
  • 每个加载的页面都包含从db加载的用户ID和 key :
    <script>
        auth_id = '<?php echo $user->id ?>';
        secret_key = '<?php echo $user->secret_key ?>';
    </script>
    
  • 用户浏览器连接到Crossbar.io服务器,并从自定义身份验证器获得质询。
  • 它使用 key 计算签名,并与auth_id一起发送到Crossbar.io服务器
  • Authenticator从DB secret 获取所提供的auth_id并计算签名。然后比较签名,如果签名相等,则认证成功。
  • 现在auth_id包含用户ID,我们可以信任它的值。现在,您可以引用部分“如何获取订阅的auth_id?”

  • 答案:



    默认情况下,发布者和订阅者之间彼此不了解,但是documentation显示可以通过配置公开调用者身份来更改它。然后,您可以从回调详细信息中获取auth_id:
  • PHP:
    $onEvent = function ($args, $argsKw, $details, $publicationId) use ($session) {
        $auth_id = $details->publisher_authid;
        ...
    }
    $session->register('com.example.event', $onEvent);
    
  • JS:
    function on_event(args, kwargs, details) {
        auth_id = details['publisher_authid'];
        ...
    }
    session.subscribe('com.example.event', on_event);
    




  • 首先,清除缓存和硬重装不会删除cookie。当我问这个问题时,有任何cookie出现,但是今天我可以看到cbtid:

    两天前进行了Chrome更新,因此这可能是由先前版本中的错误引起的。

    10-07 12:29