Ошибка PrivateChannel 403 Laravel Echo Pusher Локальная настройка Laravel Websockets
Я получаю 403 на маршруте вещания / авторизации.
Я использую пакет веб-сокетов Laravel для веб-сокетов, и у меня есть следующие настройки
- Backend Laravel server ( on port 8000 )
- Laravel Websockets Server ( laravel is running on 8001 and websocket server on 6001 )
- Standalone Ionic React app ( on port 8100)
Теперь все работает, когда я пробую публичный канал, но когда я пробую частный канал, он терпит неудачу.
на приведенном выше снимке экрана панели управления сокетами Laravel я вижу, что соединение установлено, поскольку это тот же идентификатор socketId, который был отправлен с запросом.
Я использую Laravel Sanctum для аутентификации.
PFB:- мой клиентский код
const headers = {
'Content-Type': 'application/json',
Authorization: window.localStorage.getItem('token')
? `Bearer ${window.localStorage.getItem('token')}`
: '',
'Access-Control-Allow-Credentials': true,
};
const options = {
broadcaster: 'pusher',
key: 'abcsock',
authEndpoint: 'http://localhost:8001/api/broadcasting/auth',
authorizer: (channel, options) => {
return {
authorize: (socketId, callback) => {
axios
.post(
'http://localhost:8001/api/broadcasting/auth',
{
socket_id: socketId,
channel_name: channel.name,
},
{ headers, withCredentials: true }
)
.then((response) => {
callback(false, response.data);
})
.catch((error) => {
callback(true, error);
});
},
};
},
wsHost: '127.0.0.1',
wsPort: 6001,
encrypted: true,
disableStats: true,
enabledTransports: ['ws', 'wss'],
forceTLS: false,
};
Код с сервера Laravel Websockets
файл api.php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Broadcast;
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
Broadcast::routes(['middleware' => ['auth:sanctum']]);
BroadcastServiceProvider.php
namespace App\Providers;
use Illuminate\Support\Facades\Broadcast;
use Illuminate\Support\ServiceProvider;
class BroadcastServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Broadcast::routes(['middleware' => ['auth:sanctum']]);
require base_path('routes/channels.php');
}
}
NewNotification.php
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Messages\BroadcastMessage;
use Illuminate\Notifications\Notification;
use Illuminate\Broadcasting\PrivateChannel;
use App\AppNotification;
use App\User;
class NewNotification extends Notification
{
use Queueable;
public $notification;
public $user;
/**
* Create a new notification instance.
*
* @return void
*/
public function __construct(AppNotification $notification, User $user)
{
$this->notification = $notification;
$this->user = $user;
}
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return ['database', 'broadcast'];
}
/**
* Get the array representation of the notification.
*
* @param mixed $notifiable
* @return array
*/
public function toArray($notifiable)
{
$notification = $this->notification;
return [
'id' => $notification->id,
'title' => $notification->title,
'description' => $notification->description,
'button_text' => $notification->button_text,
'is_read' => $notification->is_read,
'created_at' => $notification->created_at,
[
'notification_for' => $notification->notifiable
]
];
}
public function toBroadcast($notifiable)
{
return new BroadcastMessage($this->toArray($notifiable));
}
public function broadcastOn()
{
return new PrivateChannel('Notifications.' . $this->user->id);
}
}
каналы.php
<?php
use Illuminate\Support\Facades\Broadcast;
Broadcast::channel('Notifications.{id}', function ($user, $id) {
return (int) $user->id === (int) $id;
}, ['guards' => ['sanctum']]);
Я приложил все, что, по моему мнению, было достаточно, чтобы объяснить проблему и устранить неполадки, но если вам нужно что-то еще, спросите.
Любая помощь будет оценена
3 ответа
У меня была аналогичная ошибка с Laravel & pusher. Я исправил с помощьюdecodeURIComponent
и двигатьсяBroadCast::routes(['middleware' => ['auth:sanctum']])
кroutes/api.php
отBroadcastServiceProvider.php
Кроме того, добавьтеwithCredentials = true
.
const value = `; ${document.cookie}`
const parts = value.split(`; XSRF-TOKEN=`)
const xsrfToken = parts.pop().split(';').shift()
Pusher.Runtime.createXHR = function () {
const xhr = new XMLHttpRequest()
xhr.withCredentials = true
return xhr
}
const pusher = new Pusher(`${process.env.REACT_APP_PUSHER_APP_KEY}`,
{
cluster: 'us3',
authEndpoint: `${process.env.REACT_APP_ORIG_URL}/grooming/broadcasting/auth`,
auth: {
headers: {
Accept: 'application/json, text/plain, */*',
'X-Requested-With': 'XMLHttpRequest',
'X-XSRF-TOKEN': decodeURIComponent(xsrfToken)
}
}
})
Надеюсь, это немного поможет.
Вы добавили аутентификацию для своего канала channels.php? Обратитесь сюда:https://laravel.com/docs/7.x/broadcasting Как это выглядит?
Я думаю, вы все делаете правильно, но вы не авторизовали свои маршруты.
Мне понравился этот пакет, потому что он написан на php, но это своего рода отказ и множество проблем, которые не решены.
альтернативой этому серверу является laravel-echo-server(как рекомендует laravel docs), очень простой в использовании. /questions/50800742/laravel-echo-ne-slushaet/50800759#50800759 дополнительная информация, если вы можете работать с laravel-сокетами, я рад видеть новый пример