我正在尝试使用一台服务器(后端)作为源将数据传输到专用通道。 尝试作为客户端另一个地方/机器(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;
});
工作正常,得到答案: { “身份验证”:“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
现在我们在两台机器“客户端”中执行相同的操作 -设置:
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
}
}
});
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: 189876.728811
channel_name: private-private.xxx.2
最奇怪的想法是什么,最简单的检查: 1 使用带有数据的邮递员:“socket_id”为“1.2”用于测试,“channel_name”为“private.xxx.2”
调试: 我放了另一个频道来检查命名:
Broadcast::channel('private-private.xxx.{id}', function ($deviceId) {
return true;
});
请帮助我。已经3天了
系统中默认的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