【问题标题】:How to configure Channel Authorization for Broadcasting in Laravel 5.3 using Pusher Driver?如何使用 Pusher Driver 在 Laravel 5.3 中为广播配置频道授权?
【发布时间】:2017-10-03 18:47:54
【问题描述】:
  • Laravel 版本:5.3.*
  • PHP 版本:5.6.17
  • 数据库驱动程序和版本: mysql

说明:

根据 Laravel 5.3 文档,在私有或在线频道上广播事件时,在 BroadcastServiceProvider 的启动方法中,必须提供一个回调来解决用户是否有权收听该频道的广播门面方法 @987654323 @。此方法应返回一个布尔值。在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" 并在 pusher 中创建了一个帐户。 我把我的推送凭证放在.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-&gt;user() 为空。那是因为我没有传递我的路由命名空间正在使用的其他中间件。通过Broadcast::routes(['middleware' =&gt; ['web', 'clumsy', 'admin-extra']]); 我能够解决问题。

ThisLaravel issue 也帮助我掌握了这个东西。

【问题讨论】:

  • 加前缀的时候在JS端接收事件吗?
  • @yazfield 是的,我愿意。

标签: php laravel pusher broadcasting


【解决方案1】:

通过给routes 提供一个参数,您正在设置路由属性并覆盖默认为'middleware' =&gt; ['web'] 的属性,这基本上意味着当您提供没有middleware 的任何数组时,您没有使用任何Web 中间件属性,你没有验证 crsfToken...等等。

【讨论】:

  • 这确实是有道理的,但仍然不能解释为什么它只在我使用 prefix 键传递数组时才有效。我也不明白为什么如果我什么都不传递它会失败......我正在传递 csrf 令牌。我需要一个更明确的错误才能知道在哪里查看。
猜你喜欢
  • 1970-01-01
  • 2019-08-28
  • 1970-01-01
  • 2018-10-10
  • 2018-02-23
  • 2017-07-06
  • 2020-03-24
  • 1970-01-01
  • 2017-04-15
相关资源
最近更新 更多