Итак, как говорится в моем заголовке, я хочу изменить настройки Laravel по умолчанию Broadcast
промежуточное программное обеспечение для аутентификации на собственное промежуточное программное обеспечение для аутентификации, которое я создал и использует аутентификацию на основе токенов. Я сделал это потому, что мое приложение является приложением на основе API, и, когда пользователь проходит аутентификацию, я создаю токен сеанса и отправляю его ему, а также сохраняю в БД с expires_at
колонка.
я использую Pusher
,
У меня есть следующее промежуточное ПО:
class AuthCustom
{
public function handle($request, Closure $next)
{
// if we have the session token stored in header
if ($request->header('x-session')) {
$session = Session::where('id', $request->header('x-session'))->where('expires_on', '>=', date('Y-m-d G:i:s'))->with('user')->first();
if ($session !== null) {
$user = (new User())->where('id', $session->user_id)->first();
if ($user !== null) {
$request->merge(['user' => $user]);
return $next($request);
}
}
}
}
мой BroadcastServiceProvider
код выглядит следующим образом:
class BroadcastServiceProvider extends ServiceProvider
{
public function boot()
{
Broadcast::routes();
require base_path('routes/channels.php');
}
}
Если я поставлю Broadcast::routes(['middleware' => 'authcustom']);
в BroadcastServiceProvider
, boradcasting/auth
дает 403
код состояния, потому что $request->user()
является нулевым, что затем приводит к Access forbidden
,
Я попытался выполнить поиск по всему проклятому вебу и ничего не нашел об изменении стандартного промежуточного программного обеспечения для вещания.
Я даже пытался удалить Broadcast::routes()
и настройка нового маршрута /broadcast
который вернул Pusher
socket_auth
объект и каждый раз, когда я получил 419 Unkown
код состояния.
Любые идеи или, может быть, вы можете указать мне направление, где я мог бы справиться с этим?
Спасибо!
Позже отредактируйте:
Мое соединение JS Echo выглядит так:
Vue.use(VueEcho, {
broadcaster: 'pusher',
key: 'xxxxxxxxxxxxxx',
cluster: 'eu',
authEndpoint: 'http://localhost/api.easycargo.ro/public/broadcasting/auth',
auth: {
headers: {
'x-session': this.auth.token
}
}
});
Я рад, что у вас что-то работает. Для более поздних читателей, вот более ларавелеский способ решения проблемы в вопросе: создать кастомная защита используется для проверки подлинности запросов для специальных маршрутов.
Laravel-х AuthManager
включает вспомогательный методviaRequest()
— что упрощает создание Guard
который аутентифицирует пользователя с данными из контекста запроса без необходимости полной реализации Illuminate\Contracts\Auth\Guard
, Мы можем связать нашу таможню в boot()
метод в AuthServiceProvider.php:
public function boot()
{
Auth::viaRequest('custom-auth', function ($request) {
// Any custom user-lookup logic here. For example:
if ($request->header('x-session')) {
$user = // ...try to fetch a user...
return $user;
}
});
}
Как мы видим, мы просто передаем закрытие viaRequest()
метод, который возвращает User
объект при успешной аутентификации, или null
когда аутентификация не проходит.
Далее мы расскажем Laravel о нашей новой аутентификации, добавив запись в 'guards'
массив в конфиг / auth.php:
'guards' => [
...
'broadcasting' => [
'driver' => 'custom-auth',
],
],
Наконец, нам нужно обновить промежуточное ПО для любых маршрутов, которые должны аутентифицировать пользователя с помощью нашего пользовательского интерфейса. Guard
, Мы можем использовать встроенное в Laravel промежуточное программное обеспечение для аутентификации и указать, какой сторож использовать в качестве параметр промежуточного программного обеспечения. Например, мы инициализируем маршруты вещания в вопросе BroadcastServiceProvider.php:
Broadcast::routes([ 'middleware' => [ 'auth:broadcasting', ... ] ]);
…где broadcasting
соответствует имени, которое мы присвоили нашему обычаю Guard
в конфиг / auth.php.
Этот подход позволяет нам использовать все Laravel’s Auth
услуги, предоставляет более центральное место для определения нашей логики аутентификации и упрощает автоматизированное тестирование, потому что мы можем легче макетировать аутентификацию по мере необходимости.
Мне действительно удалось найти решение, поэтому все, что мне нужно было сделать, это связать $user
что я получил в моем обычае auth
Промежуточное программное обеспечение для запроса, выполнив следующее:
$request->merge(['user' => $user]);
//add this
$request->setUserResolver(function () use ($user) {
return $user;
});
и сейчас $request->user()
который проверяет laravel, возвращает объект пользователя и проходит проверку.