如何使用Pusher驱动程序为Laravel 5.3中的广播配置通道授权?

时间:2017-05-05 10:16:40

标签: php laravel pusher broadcasting

  • Laravel版本:5.3。*
  • PHP版本:5.6.17
  • 数据库驱动程序&版: MySQL的

说明

根据Laravel 5.3文档在私有或在线信道上广播事件时,在BroadcastServiceProvider的引导方法中必须提供一个回调,如果用户有权监听该频道到广播外观方法channel。此方法应返回布尔值。在BroadcastServiceProvider方法boot中,我们还应该包含Broadcast::routes(),它将定义客户端将调用以检查通道权限的身份验证路由。此路由方法可以接收要应用于路由的属性数组。现在它变得奇怪了。当客户端调用此路由时,无论我传递给Broadcast::channel方法的回调是什么,它都会给我一个403禁止,除非(现在是最怪异的部分)我用一个键为Broadcast::routes提供一个数组名为prefix和任何值的值。如果密钥不是前缀,则将返回403禁止。

  

PusherBroadcaster.php第42行中的HttpException:

我的设置如下。我肯定做错了什么但经过我们很多人试图理解后我无法弄明白。有人可以提示吗?

重现步骤:

我创建了一个简单的事件:

<?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']]);,我能够解决问题。

This Laravel问题也帮助我掌握了这件事。

1 个答案:

答案 0 :(得分:3)

通过向routes提供参数,您可以设置路由属性并覆盖默认为'middleware' => ['web']的属性,这基本上意味着您在使用任何网络中间件时都不会你给任何没有middleware属性的数组,你没有验证crsfToken ......等等。