Вопрос или проблема
Я работаю над проектом, который, вкратце, имеет систему чата в реальном времени, реализованную с помощью 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
, события принимаются на серверной стороне, даже если пользователь не аутентифицирован и не подключен к каналу. Это приводит к нежелательному поведению системы, когда неавторизованные пользователи могут отправлять сообщения.
Прекращение несанкционированного доступа
Для того чтобы ограничить доступ к отправке сообщений в приватный канал, вы можете использовать несколько стратегий:
-
Аутентификация на уровне сервера: Используйте middleware в Laravel для проверки аутентификации пользователя перед обработкой входящих событий. Это необходимо сделать в вашем
AppServiceProvider
или в соответствующем слушателе события. -
Проверка прав перед отправкой события: Задайте уровень проверки на клиенте перед отправкой события. Убедитесь, что пользователь действительно аутентифицирован и имеет права отправлять сообщения.
-
Правильная настройка 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 проекте. Это повысит безопасность системы и поможет избежать злоупотреблений.
Помните, что безопасность является критически важным компонентом каждой системы, особенно когда дело касается реального времени и взаимодействия пользователей.