pusher send_event проходит без авторизации в проекте laravel reverb

Вопрос или проблема

Я работаю над проектом, который, вкратце, имеет систему чата в реальном времени, реализованную с помощью Laravel Reverb. Все, связанное с отправкой событий на сервере Laravel, работает отлично, и события корректно получаются на клиенте с помощью Echo.

Проблема возникает, когда я пытаюсь обработать отправку сообщений на фронтенде через соединение WebSocket. Я следую тому, что сделал Джо Диксон на конференции LaravelCon EU ссылка. Я использую этот скрипт на фронтенде.

Echo.connector.pusher.send_event(
    'SendMessage',
    JSON.stringify({ testKey: 'test value' }),
    'Users.2.ChatList'
);

Сейчас даже если этот Users.{id}.ChatList – это приватный канал, определенный в channels.php, и пользователь не аутентифицирован или не подключен к какому-либо каналу, событие все равно принимается на бэкенде как событие на этом канале. Авторизации не происходит!!
Вот как я получаю эти фронтенд-события на бэкенде в AppServiceProvider:

Event::listen(
   MessageReceived::class,
   TestListener::class
);

Есть идеи, как это следует обрабатывать? Я хочу, чтобы только пользователи, которые аутентифицированы и подключены к, например, каналу “Users.2.ChatList”, могли отправлять такие сообщения.

Ответ или решение

Решение проблемы с аутентификацией событий Pusher в проекте Laravel Reverb

Введение

Ваша задача заключается в создании безопасной системы обмена сообщениями в реальном времени на основе WebSocket с использованием Laravel и Pusher. Проблема заключается в том, что события, отправляемые через функцию send_event, обрабатываются на серверной стороне даже без аутентификации. В этой статье мы рассмотрим, как решить эту проблему и гарантировать, что только авторизованные пользователи могут отправлять сообщения в приватные каналы.

Проблема

Вы используете следующий код для отправки события на клиентской стороне:

Echo.connector.pusher.send_event(
    'SendMessage',
    JSON.stringify({ testKey: 'test value' }),
    'Users.2.ChatList'
);

Несмотря на наличие приватного канала Users.{id}.ChatList, события принимаются на серверной стороне, даже если пользователь не аутентифицирован и не подключен к каналу. Это приводит к нежелательному поведению системы, когда неавторизованные пользователи могут отправлять сообщения.

Прекращение несанкционированного доступа

Для того чтобы ограничить доступ к отправке сообщений в приватный канал, вы можете использовать несколько стратегий:

  1. Аутентификация на уровне сервера: Используйте middleware в Laravel для проверки аутентификации пользователя перед обработкой входящих событий. Это необходимо сделать в вашем AppServiceProvider или в соответствующем слушателе события.

  2. Проверка прав перед отправкой события: Задайте уровень проверки на клиенте перед отправкой события. Убедитесь, что пользователь действительно аутентифицирован и имеет права отправлять сообщения.

  3. Правильная настройка SDK Pusher: Убедитесь, что вы используете аутентификацию Pusher на серверной стороне правильно и что события отправляются только тогда, когда пользователь имеет доступ к каналу.

Пример реализации

Настройка Middleware

Добавьте middleware, который будет проверять, авторизован ли пользователь, прежде чем позволить ему отправлять события.

// app/Http/Middleware/CheckUserAuth.php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class CheckUserAuth
{
    public function handle($request, Closure $next)
    {
        if (!Auth::check()) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        return $next($request);
    }
}

Затем добавьте это middleware в соответствующие группы маршрутов.

Изменение слушателя событий

В вашем слушателе событий TestListener, добавьте логику проверки аутентификации:

namespace App\Listeners;

use App\Events\MessageReceived;
use Illuminate\Support\Facades\Auth;

class TestListener
{
    public function handle(MessageReceived $event)
    {
        if (!Auth::check()) {
            // Отменить обработку события, если пользователь не авторизован
            return;
        }

        // Логика обработки сообщения
    }
}

Выводы

Следуя этим рекомендациям, вы сможете гарантировать, что только уполномоченные пользователи могут отправлять сообщения в приватные каналы через Pusher в вашем Laravel Reverb проекте. Это повысит безопасность системы и поможет избежать злоупотреблений.

Помните, что безопасность является критически важным компонентом каждой системы, особенно когда дело касается реального времени и взаимодействия пользователей.

Оцените материал
Добавить комментарий

Капча загружается...