Laravel 广播:由于身份验证错误,私人频道无法正常工作
Laravel broadcasting: private channels not working due to auth error
首先我想说,我知道关于这个主题的话题真的很多。我几乎全部都读了,但没有成功。
我正在使用 Laravel Echo 和 Pusher 以使 websockets 工作。这实际上适用于普通(阅读:非私人)频道。我收到的 Javascript 物品完好无损。
问题开始于我尝试在私人频道上发送内容时。我在控制台中收到以下警告:
Pusher : Couldn't get auth info from your webapp : 500
我猜这是因为验证私人频道时出现问题。我尝试在以下地方验证它们:
广播服务提供商:
class BroadcastServiceProvider extends ServiceProvider
{
public function boot()
{
Broadcast::routes();
/*
* Authenticate the user's personal channel...
*/
Broadcast::channel('notification.{userid}', function ($user, $userid) {
return true;
});
}
}
或routes/channels.php:
<?php
use Illuminate\Support\Facades\Broadcast;
Broadcast::channel('notification.{userid}', function ($user, $userid) {
return (int) $user->id === (int) $userId;
});
但是 none 这行得通。我还尝试将通配符更改为 *
,而不是 {userid}
,但这也不起作用。
不过,Pusher 以正常形式显示事件。所以他们被发送了,只有 Echo 的接收才会出现问题。我的 Echo 配置如下所示:
this.websocket = new Echo({
broadcaster: 'pusher',
key: 'KEY',
cluster: 'eu',
encrypted: false,
authEndpoint: 'http://127.0.0.1:8000/broadcasting/auth'
});
this.id = 1;
this.websocket.private('notification.' + this.id).listen('CreditsSent', e => {
console.log(e);
});
我正在使用 Laravel 5.4 和 PHP 7.x。有人可以帮忙吗,因为我迷路了。
您的应用程序模板必须在 head
元素中包含 <meta name="csrf-token" content="{{ csrf_token() }}">
,或者您可以在使用 Echo
.
建立套接字连接之前设置 window.Laravel.csrfToken
确保 Echo
发出的身份验证请求包含 header 中的 CSRF-Token
。
您可以在浏览器开发人员工具的“网络”选项卡中验证这一点。
我自己想出来了。不久前,我将我的项目从 Laravel 5.3 更新到 5.4。我预计我手动创建的 channels.php 会自动导入。结果我不得不在我的 broadcastServiceProvider
中导入它。现在一切正常:)
首先我想说,我知道关于这个主题的话题真的很多。我几乎全部都读了,但没有成功。
我正在使用 Laravel Echo 和 Pusher 以使 websockets 工作。这实际上适用于普通(阅读:非私人)频道。我收到的 Javascript 物品完好无损。
问题开始于我尝试在私人频道上发送内容时。我在控制台中收到以下警告:
Pusher : Couldn't get auth info from your webapp : 500
我猜这是因为验证私人频道时出现问题。我尝试在以下地方验证它们:
广播服务提供商:
class BroadcastServiceProvider extends ServiceProvider
{
public function boot()
{
Broadcast::routes();
/*
* Authenticate the user's personal channel...
*/
Broadcast::channel('notification.{userid}', function ($user, $userid) {
return true;
});
}
}
或routes/channels.php:
<?php
use Illuminate\Support\Facades\Broadcast;
Broadcast::channel('notification.{userid}', function ($user, $userid) {
return (int) $user->id === (int) $userId;
});
但是 none 这行得通。我还尝试将通配符更改为 *
,而不是 {userid}
,但这也不起作用。
不过,Pusher 以正常形式显示事件。所以他们被发送了,只有 Echo 的接收才会出现问题。我的 Echo 配置如下所示:
this.websocket = new Echo({
broadcaster: 'pusher',
key: 'KEY',
cluster: 'eu',
encrypted: false,
authEndpoint: 'http://127.0.0.1:8000/broadcasting/auth'
});
this.id = 1;
this.websocket.private('notification.' + this.id).listen('CreditsSent', e => {
console.log(e);
});
我正在使用 Laravel 5.4 和 PHP 7.x。有人可以帮忙吗,因为我迷路了。
您的应用程序模板必须在 head
元素中包含 <meta name="csrf-token" content="{{ csrf_token() }}">
,或者您可以在使用 Echo
.
window.Laravel.csrfToken
确保 Echo
发出的身份验证请求包含 header 中的 CSRF-Token
。
您可以在浏览器开发人员工具的“网络”选项卡中验证这一点。
我自己想出来了。不久前,我将我的项目从 Laravel 5.3 更新到 5.4。我预计我手动创建的 channels.php 会自动导入。结果我不得不在我的 broadcastServiceProvider
中导入它。现在一切正常:)