Laravel Echo — разрешить гостям подключаться к каналу присутствия

Я использую laravel-echo-server для запуска Laravel Echo для трансляции событий.

У меня есть канал счетчика пользователей, который показывает всех пользователей в приложении. Для этого я использую канал присутствия. Это отлично работает для зарегистрированных пользователей, но гости просто никогда не подключаются.

Я настроил ниже в BroadcastServiceProvider:

Broadcast::channel('global', function () {
return ['name' => 'guest'];
});

Что из того, что я могу сказать, должно позволять всем входить в число гостей. Я предполагаю, что есть какое-то промежуточное программное обеспечение или аутентификация, которые проверяются перед этим, которые мне нужно отключить для этого канала.

Будем очень благодарны за любую помощь в подключении всех клиентов к этому каналу присутствия!

4

Решение

Для тех, кто ищет ответы на это. Действительно возможно авторизовать гостей в каналах присутствия, вам просто нужно переопределить Broadcast :: routs () от поставщика услуг своим собственным.

В качестве примера мой канал присутствия ‘global’ принимает гостей:

Route::post('/broadcasting/auth', function(Illuminate\Http\Request $req) {
if($req->channel_name == 'presence-global'){return 'global';}
return abort(403);
});

Это может быть расширено в различных направлениях или может продолжать передавать другие каналы присутствия и частных лиц в метод Broadcast :: auth по умолчанию

2

Другие решения

Это может быть довольно просто!

  1. Сделайте начальное число для создания гостевого пользователя с именем «Гость»
  2. Создайте промежуточное ПО для аутентификации гостевого пользователя при каждом запросе, используя \ Auth :: loginUsingId ($ guestUserId);

Готово!

Теперь у вас есть авторизованный гость.

Шаг 1: Создание сеялки

Во-первых, вам нужно создать начальное число для создания гостевого пользователя всякий раз, когда вам нужно запустить миграцию:

php artisan make:seed UsersTableSeed

В базе данных / seed / UsersTableSeeder.php вам необходимо:

public function run()
{
factory(User::class)->create([
'name' => 'Guest'
]);
}

Убедитесь, что вы помещаете это семя в качестве первого пользователя в базе данных, то есть с идентификатором 1

Шаг 2: Создание промежуточного программного обеспечения

На этом этапе вам необходимо создать промежуточное программное обеспечение, которое будет аутентифицировать гостевого пользователя при каждом запросе. Просто делать:

php artisan make:middleware AuthenticateGuest

В app / Http / Middleware / AuthenticateGuest.php вам необходимо:

public function handle($request, Closure $next)
{
Auth::loginUsingId(1); // Guest

return $next($request);
}

Теперь вам нужно настроить промежуточное программное обеспечение AuthenticateGuest в Kernel.php.

В приложении \ Http \ Kernel.php вам необходимо:

protected $middleware = [
...
\App\Http\Middleware\AuthenticateGuest::class, // if you need it for all the routes
];

protected $middlewareGroups = [
'web' => [
...
\App\Http\Middleware\AuthenticateGuest::class, // if you need it for web routes
]
'api' => [
...
\App\Http\Middleware\AuthenticateGuest::class, // if you need it for api routes
],
];

protected $routeMiddleware = [
...
'authenticate-guest' => \App\Http\Middleware\AuthenticateGuest::class, // if you need to use this custom middleware
];

Шаг 3: Настройка Broadcast :: channel route

В маршрутах / channel.php вам необходимо:

Broadcast::channel('chatroom', function ($user) {
return $user; // here will return the guest user object
});

Если вам нужны пользовательские каналы, рассмотрите возможность использования App.Room. {Id} для аутентификации гостевого пользователя в указанной комнате.

Согласно правилам PresenceChannel, вы не можете использовать один и тот же идентификатор пользователя для всех соединений. Таким образом, вы не увидите подключения других пользователей и Laravel Echo. joining() Метод тоже не будет запущен.

Для решения этой проблемы вам необходимо удалить сеялку (пока она будет бесполезна).

Теперь вам просто нужно изменить промежуточное программное обеспечение на:

Auth::login(factory(User::class)->make([
'id' => (int) str_replace('.', '', microtime(true))
]));
1

С помощью Ренана Коэльо я получил его на работу. Для меня отсутствующей частью было переопределить метод Broadcast :: routs () следующим образом:

Route::post('/broadcasting/auth', function (Illuminate\Http\Request $req) {
return Broadcast::auth($req);
});

Route::post('/broadcasting/auth'... на самом деле маршрут, который добавляется с помощью метода Broadcast :: маршруты (). Вот почему мы переопределяем это здесь. Вы можете увидеть активные маршруты, набрав php artisan route:list в вашем терминале.

Затем, как уже сказал Ренан Коэльо, мне пришлось добавить специальное Middleware (AuthenticateGuest), которое создает для меня случайного пользователя. (Это хакерская часть) и добавьте его в массив $ middleware в kernel.php:

protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\TrustProxies::class,
\Barryvdh\Cors\HandleCors::class,

\App\Http\Middleware\AuthenticateGuest::class
];

Промежуточное программное обеспечение AuthenticateGuest выглядит следующим образом:

<?php

namespace App\Http\Middleware;

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

class AuthenticateGuest
{
/**
* Handle an incoming request.
*
* @param  \Illuminate\Http\Request  $request
* @param  \Closure  $next
* @return mixed
*/
public function handle($request, Closure $next)
{
Auth::login(factory(User::class)->make([
'id' => (int)str_replace('.', '', microtime(true))
]));

return $next($request);
}
}

Надеюсь, это поможет кому-то,

Себастьян

0
По вопросам рекламы [email protected]