Laravel似乎忽略了channels.php中的授权回调

ryoqjall  于 11个月前  发布在  PHP
关注(0)|答案(1)|浏览(101)

所以我尝试向一个频道广播,我已经确保广播工作。现在我想确保频道是私有的,只有授权用户可以收听它。现在根据文档,我可以通过创建授权回调并为该频道分配来实现这一点,所以我这样做了,我使用php artisan make:channel命令创建了一个Channel类,并在routes/channel.php中分配了Channel类,如下所示。

Broadcast::channel('private-admin.notifications.orders', OrderChannel::class);

字符串
通道类的内容如下。

class OrderChannel
{
    /**
     * Create a new channel instance.
     */
    public function __construct()
    {
        //
    }

    /**
     * Authenticate the user's access to the channel.
     */
    public function join(User $user): array|bool
    {
        return false;
    }
}


正如你可能已经注意到的,join方法总是返回false,这是故意的,因为我想看看如果未经授权的用户连接到频道会发生什么。我希望用户将无法收听或订阅它,但用户仍然能够收听频道。我确信这一点,因为通知的代码触发并显示通知。
我做过的事。

  • 当我运行php artisan channel:list命令时,config/app.php中未注解的BroadcastServiceProvider::classchannels.php的所有内容都将返回。
  • 已清除应用程序缓存。

我正在使用Laravel Websockets作为我的Websockets服务器,如果这与任何人有关。
我是做错了什么还是错过了什么?

62o28rlo

62o28rlo1#

所以在发布这个问题后,我花了一段时间进行了挖掘。我发现我的自定义广播认证端点可以通过/custom/broadcasting/auth使用,无论如何都会对用户进行认证,代码片段如下。

<?php

use BeyondCode\LaravelWebSockets\Apps\App;
use Illuminate\Broadcasting\Broadcasters\PusherBroadcaster;
use Illuminate\Http\Request;
use Pusher\Pusher;

class AuthenticateDashboard
{
    public function __invoke(Request $request)
    {
        /**
         * Find the app by using the header
         * and then reconstruct the PusherBroadcaster
         * using our own app selection.
         */
        $app = App::findById($request->header('x-app-id'));

        $broadcaster = new PusherBroadcaster(new Pusher(
            $app->key,
            $app->secret,
            $app->id,
            []
        ));

        /*
         * Since the dashboard itself is already secured by the
         * Authorize middleware, we can trust all channel
         * authentication requests in here.
         */
        return $broadcaster->validAuthenticationResponse($request, []);
    }
}

字符串
它是laravel websockets默认身份验证方法的1:1副本,可通过laravel-websockets/auth使用。
我不知道validAuthenticationResponse()方法将始终验证请求,我不得不使用laravel提供的默认身份验证端点,该端点可通过broadcasting/auth使用。我不得不配置端点,因为它不接受我的请求。我不得不通过Laravel Echo提供一个自定义的身份验证方法,以便它接受请求。
我的Broadcast::routes如下,这允许我的前端向身份验证端点发出成功的请求

Broadcast::routes(['prefix' => 'api', 'middleware' => ['auth:sanctum', 'web']]);


话虽如此,我现在使用的是laravel提供的默认身份验证端点,即broadcasting/auth端点,但在我的配置中,它现在是api/broadcasting/auth
广播不再忽略我的channels.php,现在工作完全正常。这只是我这边的配置错误。

相关问题