Как правильно подойти к вопросу: можно ли написать собственную логику авторизации подключения к приватным каналам и каналам присутствия, если я использую laravel-echo и pusher-js?
Сейчас ситуация такая: laravel по дефолту использует guard web, но в моём проекте сессии не используются, а аутентификация построена на токенах.
Сейчас ситуация такая: мне нужно решить теперь вопрос с авторизацией подключения к каналам. Другими словами, мне нужно каким-то образом передавать нужные заголовки.
Нужно понять: могу ли я каким-либо образом подсунуть в Echo или Pusher, если я буду создавать инстанс PusherА вручную, собственную логику авторизации?
Сейчас ситуация такая: желательно, чтобы это была функция. Поскольку в момент создания инстанса Echo я могу ещё не иметь доступа к значениям.
По вводным: другими словами, вариант вроде
window.Echo = new Echo({ auth: { headers: { // тут заголовки } } });
Не подходит.
Нужно что-то вроде
window.Echo = new Echo({ auth: function () {} });
Сейчас ситуация такая: к сожалению, не нашёл в сети адекватного ответа на этот вопрос. Может плохо искал))
По вводным: если это имеет значение, то используется laravel-echo v2.1.7 и pusher-js v8.4.0.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Да, можно написать свою логику авторизации приватных и presence-каналов при использовании laravel-echo и pusher-js. Laravel по умолчанию действительно часто ожидает web guard и сессию, но Echo умеет отправлять авторизационный запрос с вашими заголовками, например Bearer-токеном.
На клиенте укажите authEndpoint и headers:
import Echo from 'laravel-echo'; import Pusher from 'pusher-js'; window.Pusher = Pusher; const echo = new Echo({ broadcaster: 'pusher', key: 'app-key', cluster: 'eu', forceTLS: true, authEndpoint: '/api/broadcasting/auth', auth: { headers: { Authorization: 'Bearer ' + token, Accept: 'application/json' } } });import Echo from 'laravel-echo'; import Pusher from 'pusher-js'; window.Pusher = Pusher; const echo = new Echo({ broadcaster: 'pusher', key: 'app-key', cluster: 'eu', forceTLS: true, authEndpoint: '/api/broadcasting/auth', auth: { headers: { Authorization: 'Bearer ' + token, Accept: 'application/json' } } });
На Laravel-стороне маршрут авторизации нужно повесить на API middleware и нужный guard:
Broadcast::routes([ 'middleware' => ['auth:sanctum'], 'prefix' => 'api', ]);
И описать каналы в routes/channels.php:
Broadcast::channel('orders.{orderId}', function ($user, $orderId) { return (int) $user->id === (int) Order::findOrFail($orderId)->user_id; });
Для presence-канала callback должен вернуть массив данных пользователя, а не просто true:
Broadcast::channel('room.{id}', function ($user, $id) { return [ 'id' => $user->id, 'name' => $user->name, ]; });
Если у вас не Sanctum, а свой token guard, подключите его в config/auth.php и используйте auth:api или свой middleware. Главное - чтобы запрос /broadcasting/auth проходил через тот же механизм авторизации, что и остальное API.
Итог: web-сессии не обязательны. Нужно настроить Echo на отправку токена, Laravel Broadcast routes - на API guard, а channels.php - на проверку доступа к конкретному каналу.