Я использую laravel-echo-server для запуска Laravel Echo для трансляции событий.
У меня есть канал счетчика пользователей, который показывает всех пользователей в приложении. Для этого я использую канал присутствия. Это отлично работает для зарегистрированных пользователей, но гости просто никогда не подключаются.
Я настроил ниже в BroadcastServiceProvider:
Broadcast::channel('global', function () {
return ['name' => 'guest'];
});
Что из того, что я могу сказать, должно позволять всем входить в число гостей. Я предполагаю, что есть какое-то промежуточное программное обеспечение или аутентификация, которые проверяются перед этим, которые мне нужно отключить для этого канала.
Будем очень благодарны за любую помощь в подключении всех клиентов к этому каналу присутствия!
Для тех, кто ищет ответы на это. Действительно возможно авторизовать гостей в каналах присутствия, вам просто нужно переопределить 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 по умолчанию
Это может быть довольно просто!
Готово!
Теперь у вас есть авторизованный гость.
Во-первых, вам нужно создать начальное число для создания гостевого пользователя всякий раз, когда вам нужно запустить миграцию:
php artisan make:seed UsersTableSeed
В базе данных / seed / UsersTableSeeder.php вам необходимо:
public function run()
{
factory(User::class)->create([
'name' => 'Guest'
]);
}
Убедитесь, что вы помещаете это семя в качестве первого пользователя в базе данных, то есть с идентификатором 1
На этом этапе вам необходимо создать промежуточное программное обеспечение, которое будет аутентифицировать гостевого пользователя при каждом запросе. Просто делать:
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
];
В маршрутах / 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))
]));
С помощью Ренана Коэльо я получил его на работу. Для меня отсутствующей частью было переопределить метод 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);
}
}
Надеюсь, это поможет кому-то,
Себастьян