Как правильно подойти к вопросу: можно ли написать собственную логику авторизации подключения к приватным каналам и каналам присутствия, если я использую laravel-echo и pusher-js?

Ссылка скопирована
1 ответ

Сейчас ситуация такая: 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.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Елена Вебер Ответ

Да, можно написать свою логику авторизации приватных и 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',
]);

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;
});

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,
    ];
});

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 - на проверку доступа к конкретному каналу.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно