В Laravel существует несколько способов реализации авторизации для клиента Socket.io с использованием библиотеки Laravel Echo. Вот один из них:
1. Настройка маршрутов и контроллера:
- Создайте маршруты в файле routes/web.php
, которые будут отвечать на запросы авторизации. Например, /broadcasting/auth
:
Route::post('/broadcasting/auth', '[email protected]')->name('broadcasting.auth');
- Создайте контроллер AppHttpControllersBroadcastingController
с методом authenticate
:
<?php namespace AppHttpControllers; use IlluminateHttpRequest; use IlluminateSupportFacadesAuth; class BroadcastingController extends Controller { public function authenticate(Request $request) { $user = Auth::user(); if ($user) { $user->tokens()->update(['last_used_at' => now()]); return ['user' => $user]; } abort(401); } }
2. Настройка конфигурации Laravel Echo:
- Установите библиотеку Socket.io клиента через NPM:
npm install --save socket.io-client
- В файле resources/js/bootstrap.js
добавьте следующий код после строки import Echo from 'laravel-echo';
:
import { token } from './helpers/auth'; // Импортируйте функцию token для получения авторизационного токена import io from 'socket.io-client'; window.io = io; window.Echo = new Echo({ broadcaster: 'socket.io', host: window.location.hostname + ':6001', auth: { headers: { Authorization: 'Bearer ' + token() // Передайте авторизационный токен } } });
- Создайте файл resources/js/helpers/auth.js
и добавьте в него следующий код, который будет возвращать авторизационный токен:
export function token() { return document.head.querySelector('meta[name="csrf-token"]').content; }
3. Обновите файл app/Providers/BroadcastServiceProvider.php
:
- Раскомментируйте следующую строку в методе boot()
:
Broadcast::routes(['middleware' => ['web', 'auth']]);
После выполнения всех шагов, Laravel будет генерировать авторизационные токены для каждого пользователя, используя функционал аутентификации Laravel. Когда пользователь подключается к серверу Socket.io, Echo будет автоматически передавать авторизационный токен в заголовке запроса к маршруту /broadcasting/auth
. Контроллер BroadcastingController
будет выполнять авторизацию пользователя с помощью метода Auth::user()
и, если пользователь успешно аутентифицирован, вернет информацию о пользователе.