Как настроить авторизацию канала для вещания в Laravel 5.3 с помощью драйвера Pusher?

  • Laravel Версия: 5.3. *
  • Версия PHP: 5.6.17
  • Драйвер базы данных & Версия:
    MySQL

Описание:

Согласно документации Laravel 5.3 при трансляции событий по частным каналам или каналам присутствия, в методе загрузки BroadcastServiceProvider необходимо предоставить обратный вызов, который разрешает, если у пользователя есть полномочия прослушивать этот канал для метода фасадного вещания channel, Этот метод должен возвращать логическое значение. В BroadcastServiceProvider метод boot мы должны также включить Broadcast::routes() это определит маршрут авторизации, который клиент будет вызывать для проверки разрешения на канале. Этот метод маршрутов может получить массив атрибутов для применения к маршруту. Теперь это где-то странно. Когда клиент вызывает этот маршрут, независимо от того, какой обратный вызов я передал Broadcast::channel метод, это даст мне 403 запрета, если (и теперь наступает самая странная часть) я не предоставлю массив для Broadcast::routes с ключом по имени prefix и значение чего угодно. Если ключ не является префиксом, он вернется к 403 запрету.

HttpException в строке PusherBroadcaster.php 42:

Моя настройка следующая. Я точно делаю что-то не так, но после многих наших попыток понять, я не могу понять это. Может кто-нибудь дать подсказку?

Действия по воспроизведению:

Я создал простое событие:

<?php

namespace App\Events;

use App\Models\Presentation;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class PresentationCreated implements ShouldBroadcast
{
use InteractsWithSockets, SerializesModels;

public $presentation;

/**
* Create a new event instance.
*
* @return void
*/
public function __construct(Presentation $presentation)
{
$this->presentation = $presentation;
}

/**
* Get the channels the event should broadcast on.
*
* @return Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('presentation');
}
}

что я вызываю, звоня event(new PresentationCreated($presentation));

Я установил "pusher/pusher-php-server": "^2.5.0" и создал аккаунт в пушере.
Я положил свои полномочия толкателя в .env:

BROADCAST_DRIVER=pusher
PUSHER_APP_ID=*****
PUSHER_APP_KEY=*****************
PUSHER_APP_SECRET=****************
PUSHER_APP_CLUSTER=**

в моем config\broadcast.php Я имею:

'pusher' => [
'driver' => 'pusher',
'key' => env('PUSHER_APP_KEY'),
'secret' => env('PUSHER_APP_SECRET'),
'app_id' => env('PUSHER_APP_ID'),
'options' => [
'cluster' => 'eu',
'encrypted' => true,
],
],

Моя клиентская сторона:

this.Echo = new Echo({
broadcaster: 'pusher',
key: typeof handover.pak !== 'undefined' ? handover.pak : '',
cluster: 'eu'
});

this.Echo.private(`presentation`)
.listen('PresentationCreated', (e) => {
console.log(e, 'raposa')
});

И, наконец, BroadcastServiceProvider:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Broadcast;

class BroadcastServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Broadcast::routes();

//The commented line would make the authorization pass even if I return false bellow
//Broadcast::routes(['prefix' => 'I do not know what I am doing']);

/*
* Authenticate the user's personal channel...
*/
Broadcast::channel('presentation', function ($user) {
return false;
});
}
}

РЕДАКТИРОВАТЬ

Благодаря ответу @yazfield я смог понять, что происходит. Ошибка http произошла из-за $request->user() быть нулевым Это было потому, что я не передавал дополнительное промежуточное ПО, которое использовало мое пространство имен маршрута. При выполнении Broadcast::routes(['middleware' => ['web', 'clumsy', 'admin-extra']]); Я смог решить проблему.

это Проблема Laravel также помогла мне понять эту вещь.

2

Решение

Давая параметр routes вы устанавливаете атрибуты маршрутов и переопределяете атрибуты, которые по умолчанию 'middleware' => ['web']Это означает, что вы не используете какое-либо промежуточное веб-программное обеспечение, когда вы предоставляете какой-либо массив без middleware атрибут, вы не проверяете crsfToken … и т. д.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]