gpt4 book ai didi

php - 在 PHP +Redis +Pub/Sub +WebSockets (+NodeJS) 中实时聊天

转载 作者:IT王子 更新时间:2023-10-29 06:02:21 31 4
gpt4 key购买 nike

我想开发与 channel 的实时聊天,这些是我的需求:

  • PHP backend to manage site
  • Redis as session and data primary storage
  • Pub/Sub to send messages only to channel's interested users
  • one WebSocket connection with which the messages will be send and received.
  • (optional) NodeJS to use great npm packages like timesync or socket.io

我看到了两种不同的架构来实现这一点:

  • 使用 Socket.io

    socket.io

  • 使用 Crossbar.io

    crossbar.io

这些是我的问题:

  1. 我应该选择哪种架构,为什么?
  2. 关键是无法从客户端获取用户 ID,因为它可能格式不正确。所以在第一个架构中,我认为我应该在每个套接字消息上附加来自 cookie 的 PHPSESSID 值,并在服务器端从 Redis 检索 PHP session 。我是对的还是有更好的方法来获取用户 ID?
  3. 我想知道在第二种架构中获取用户 ID 是否可以以不同的方式完成?

编辑:

我选择了 Crossbar.io,因为它非常强大,可以实时交流多种不同语言的应用程序。研究示例后,我想出了这个:

  • 在每个登录用户都在数据库中生成 key 。

  • PHP 客户端(Thruway)连接到 Crossbar 服务器并注册自定义 WAMP-CRA 验证器

  • 用户的浏览器连接到 Crossbar 服务器并受到挑战。 Secret 和 auth_id(用户 ID)是通过页面加载从数据库中加载的,因此它可以完成挑战并发送响应。

  • PHP 身份验证器在数据库中搜索提供的密码和 ID 等于 auth_id 的用户。如果有,则认证成功 session 。现在我们可以相信 auth_id 是真实的用户 ID。

这些是我的问题:

  1. 如何在订阅时获得 auth_id?

  2. 我还添加了 cookie 身份验证,身份验证后会记住浏览器。但是当我查看 Chrome DevTools 时,本地存储中没有任何 cookie 或值。即使在清除缓存后,Crossbar 仍会记住我的浏览器。我想知道这怎么可能?

编辑2:

也许我被误解了,但主要问题是选择合适的架构并获得受信任的用户 ID。没有人注意所以我奖励了赏金,然后我被否决了。我阅读了很多关于实时应用程序的文章,最后决定使用 Crossbar.io,因此我编辑了与之相关的问题。然后人们开始投票,提出另一种架构,但并没有真正回答我的问题。毕竟我自己设法做到了并提出了我的答案。

最佳答案

关于获取用户id:

我看到的每个实时聊天示例都是从客户端获取 ID。这是不安全的,因为客户端很容易操纵它,所以我需要找到另一种方法。看完WAMP specs我终于明白,我不仅要在应用程序中验证用户身份,还要在 Crossbar.io 中验证用户身份。我选择了动态 WAMP-CRA 方法并实现如下:

  • PHP 应用程序连接到 Crossbar 服务器并注册自定义身份验证器(类似于 example)
  • 用户登录应用程序后,会为他生成 key 并保存在数据库中。注销后, key 被销毁。
  • 工作流程:

    1. 每个加载的页面都包含从数据库加载的用户 ID key :

      <script>
      auth_id = '<?php echo $user->id ?>';
      secret_key = '<?php echo $user->secret_key ?>';
      </script>
    2. 用户浏览器连接到 Crossbar.io 服务器并从自定义身份验证器获得质询响应。
    3. 它使用key 计算签名并与auth_id 一起发送到Crossbar.io 服务器
    4. Authenticator 从 DB secret 获取提供的 auth_id 并计算签名。然后比较签名,如果它们相等则认证成功。
    5. 现在 auth_id 包含用户 ID,我们可以信任它的值。现在您可以引用“我如何在订阅时获得 auth_id?”部分。

答案:

How I can get auth_id on subscribe?

默认情况下,发布者和订阅者彼此之间没有任何知识,但是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);

I also added cookie authentication and browser is remembered after authentication. But when I look in Chrome DevTools there is any cookie nor value in local storage. Even after clearing cache my browser is still remember by Crossbar. I wonder how it is possible?

首先,清除缓存和硬重新加载不会删除 cookie。当我问这个问题时,出现了任何 cookie,但今天我可以看到 cbtid: cookies两天前有 Chrome 更新,所以这可能是旧版本的错误导致的。

关于php - 在 PHP +Redis +Pub/Sub +WebSockets (+NodeJS) 中实时聊天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42666799/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com