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 中导入它。现在一切正常:)