Laravel / Pusher、广播/身份验证、广播通道无法正常工作

问题描述 投票:0回答:1

我正在尝试使用一台服务器(后端)作为源将数据传输到专用通道。 尝试作为客户端另一个地方/机器(mob应用程序/,服务器/客户端),连接到专用通道以便能够读取后端传输的数据。

我们正在使用 Laravel 10 和 Puscher。

同一台计算机上后端和客户端的 priv 通道身份验证工作正常。

主要问题是外部的 Clint 无法授权,得到 403 Forbidden

设置:
“php”:“^8.1”,
"guzzlehttp/guzzle": "^7.2",
“laravel/框架”:“^10.10”,
“laravel/sanctum”:“^3.3”,
“laravel/tinker”:“^2.8”,
“pusher/pusher-php-server”:“^7.2”

为了能够测试流程,我们设置了 2 台服务器: 1 主“后端”服务器位于不同地点不同机器不同 URL 2 第二个作为'客户端'服务器在不同的地方不同的机器不同的URL

  • 在主“后端”我们设置频道:
Broadcast::channel('private.xxx.{id}', function ($deviceId) {
    return true;
});
  • 我们也使用Postman来测试它:
  • 设置 POST,输入 URL https://backend_domain/broadcasting/auth',
  • 将 pram 设置为:“socket_id”为“1.2”(用于测试),“channel_name”为“private.xxx.2”

工作正常,得到答案: { “身份验证”:“08d916334e5f9da04213:6f12dca7d0dd8662562e0518a51c58f991c0f642de2903760e1c207efdbc8814” }

现在是主要内容:我知道 larval 和 Echo 正在将前缀“private-”添加到频道名称中。 当在主“后端”服务器下时,我们设置回显客户端:

window.Echo.private('private.xxx.2')
    .listen('.xxx', (e) => {
        console.log('Priv Message received:', e);

    })
    .subscribed(() => {
        console.log('Subscribed to channel xxx');
    })
    .error((error) => {
        console.error('Error subscribing:', error);
    });
  • 我们可以读取成功信息(因此主服务器正在使用该通道并在那里进行身份验证)
  • 网络中的有效负载作为身份验证,我们可以看到发送的信息为:
socket_id: 189861.737011
channel_name: private-private.xxx.2
  • 所以在同一台机器上一切都工作正常,并且在负载请求中我们可以看到完整的正确名称为 [private-private.xxx.2]

现在我们在两台机器“客户端”中执行相同的操作 -设置:

const authorizationHeader = `Bearer ${token}`;

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: '123...',
    cluster: 'eu',
    forceTLS: true,
    authEndpoint: 'https://backend_domain/broadcasting/auth', 
    auth: {
        headers: {
            Authorization: authorizationHeader 
        }
    }
});
  • 我们告诉这个客户端他需要知道的所有数据给 Pusher(我们可以轻松连接太正常的通道,因此数据是正确的)
  • 我们放置特殊的身份验证 URL,以便客户知道将问题发送到身份验证的位置
  • 我们将客户端设置为:
window.Echo.private('private.xxx.2')
    .listen('.xxx', (e) => {
        console.log('Priv Message received:', e);

    })
    .subscribed(() => {
        console.log('Subscribed to channel xxx');
    })
    .error((error) => {
        console.error('Error subscribing:', error);
    });
  • 和之前的主后端一模一样,效果是:403 Forbidden
  • 控制台错误,网络负载数据为:
socket_id: 189876.728811
channel_name: private-private.xxx.2
  • 和早期一样,这是主要解决如何连接的问题。

最奇怪的想法是什么,最简单的检查: 1 使用带有数据的邮递员:“socket_id”为“1.2”用于测试,“channel_name”为“private.xxx.2”

  • 工作得非常好(请注意,我们所要求的没有前缀“private-”
  • 频道设置为 Broadcast::channel('private.xxx.{id}', function ($deviceId) 2 使用带有数据的邮递员:“socket_id”作为“1.2”用于测试,“channel_name”作为“private-private.xxx.2”,就像应该从头开始一样,就像其他外部客户端也在有效负载中询问一样
  • 不起作用,我们收到 403 Forbidden
提问方式?

调试: 我放了另一个频道来检查命名:

Broadcast::channel('private-private.xxx.{id}', function ($deviceId) { return true; });

    像应该那样使用邮递员:channel_name = private-private.xxx.1
  • 回答 403 禁止(所以任何通道都无法工作,因为我想检查哪个通道正在工作或给出 403,我把它放在channels.php停止脚本的末尾 Echo“TEST STOP”;死了;然后我就得到了它屏幕。 所以像进入channels.php这样的流程工作正常。
Postman 正在使用:private.xxx.1 不使用:private-private.xxx.1(这是主要问题,因为外部客户端在有效负载中使用此类名称)

请帮助我。已经3天了

broadcast laravel-10 laravel-echo socketchannel pusher-js
1个回答
0
投票
问题已经解决了。 首先,当查询来自外部时,我们没有以任何方式获得授权,并且当通道为“私有”时,系统会立即返回 403。

系统中默认的Web Guard负责检查这一点。

即使您向自己发送了令牌,也必须对其进行处理,而 Web Guard 不是为此设计的。

解决方案是编写自己的 Guard 来验证对通道的适当访问权限,例如:

Broadcast::channel('device.{deviceId}', function ($deviceId) { $token = request()->header('Authorization'); if (strpos($token, 'Bearer ') === 0) { $token = substr($token, 7); } if ($deviceId->replaced == 0){ return true; } else { return false; }}, ['guards' => ['device']]); //<-- this line is the most importand , by defult its ['guards' => ['web']] and you dont see it
最诚挚的问候阿图尔
我希望这可以帮助我投入 4 天进行各种测试以使其发挥作用的人;p

© www.soinside.com 2019 - 2024. All rights reserved.