Недавно я изучил комбинацию Laravel-Echo и Pusher в Laravel 5.3. Я успешно настроил публичные каналы и перешел на частные. У меня проблемы с тем, что Laravel возвращает 403 с маршрута / broadcasting / auth, независимо от того, что я делаю, чтобы попытаться авторизовать действие (вплоть до использования простого оператора true). Может кто-нибудь сказать мне, что я делаю не так?
App / Провайдеры / BroadcastServiceProvider.php:
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Broadcast;
class BroadcastServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Broadcast::routes();
/*
* Authenticate the user's personal channel...
*/
Broadcast::channel('App.User.*', function ($user, $userId) {
return true;
});
}
}
resources/assets/js/booststrap.js:
import Echo from "laravel-echo"
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'My-Key-Here'
});
window.Echo.private('App.User.1')
.notification((notification) => {
console.log(notification.type);
});
Я вижу событие и его полезную нагрузку в моей консоли отладки Pusher, оно просто завершается ошибкой, когда попадает на маршрут аутентификации.
Ошибка 403 / широковещательная / аутентификация с версией Laravel> 5.3 & Pusher, вам нужно изменить свой код в resources / assets / js / bootstrap.js с помощью
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'your key',
cluster: 'your cluster',
encrypted: true,
auth: {
headers: {
Authorization: 'Bearer ' + YourTokenLogin
},
},
});
И в app / Providers / BroadcastServiceProvider.php изменить на
Broadcast::routes()
с
Broadcast::routes(['middleware' => ['auth:api']]);
или же
Broadcast::routes(['middleware' => ['jwt.auth']]); //if you use JWT
это сработало для меня, и надеюсь, что это поможет вам.
Я решаю это путем создания канала.
Создайте свои Авторизирующиеся Каналы в маршрутах-> channel.php
Broadcast::channel('chatroom', function ($user) {
return $user;
});
Смотрите документацию: https://laravel.com/docs/5.4/broadcasting#authorizing-channels
Спасибо
То, что работало для меня, было использовать метод частный пакета Laravel Echo:
https://laravel.com/docs/5.3/notifications#listening-for-notifications
Echo.private('App.User.1')
.notification((notification) => {
console.log(notification.type);
});
В моем случае проблема была в неправильном идентификаторе пользователя:
Echo.private('user.'+CURRENT_USER_ID_HERE)
Это может произойти, если вы больше не вошли в систему. Убедитесь, что вы действительно вошли в приложение Laravel и что текущий сеанс еще не истек.
Я снова вошел в систему, и это сработало для меня.
В случае, если кто-то входит в последнюю версию Laravel 5.7 с такими же проблемами, для меня хорошим решением было проверить аутентификацию на каждом канале перед возвратом или после возврата, как показано ниже.
Broadcast::channel('user.*', function ($user) {
return Auth::check();
});
Broadcast::channel('conversation.{id}', function ($user, $conversationId) {
Auth::check();
return $user->isInConversation(Conversation::find($conversationId));
});
Таким образом, он работает с любым каналом, транслирующим любое событие, включая пользователей.
Я надеюсь, что это может помочь кому-то еще.
Проверьте, как вы авторизуете свой канал. В зависимости от вашей настройки это может помочь. Обновите ваш BroadcastServiceProvider следующим:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Broadcast;
class BroadcastServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Broadcast::routes(['middleware' => ['auth:api']]);
require base_path('routes/channels.php');
}
}
Добавляет промежуточное программное обеспечение Auth API для использования с Laravel Passport.