Как исправить ошибку 419 с широковещательной авторизацией

#laravel-5 #broadcast #pusher

#laravel-5 #трансляция #толкатель

Вопрос:

В моем фреймворке Laravel 5.7 / Vuejs 2.6 я использую jwt.auth и установочный толкатель

Я проверяю токен xsfr для своей страницыhttps://imgur.com/a/CveJ6jh но я получил ошибку 419 в http://local/broadcasting/auth запрашивая и открывая ответ на этот URL, я вижу сообщение об истечении срока действия страницы.
В app/Events/NewMessage.php :

 <?php

namespace AppEvents;

use IlluminateBroadcastingChannel;
use IlluminateQueueSerializesModels;
use IlluminateBroadcastingPrivateChannel;
use IlluminateBroadcastingPresenceChannel;
use IlluminateFoundationEventsDispatchable;
use IlluminateBroadcastingInteractsWithSockets;
use IlluminateContractsBroadcastingShouldBroadcast;
use AppMessage;

class NewMessage
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $message;
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(Message $message)
    {
        $this->message= $message;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return IlluminateBroadcastingChannel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('messages.'.$this->message->to);
    }
    public function broadcastWith()
    {
        return ['messages' => $this->message];
    }

}
  

В routes/channels.php :

 Broadcast::channel('messages.{id}', function ($user, $id) {
    dd($user->id, $id);
    return (int) $user->id === (int) $id;
});
  

Но я не вижу никакой информации об отладке сверху.

Я использовал параметры pusher из моего предыдущего приложения. Я думаю, что они должны быть в порядке. В противном случае у меня была бы другая ошибка?

и в компоненте vue :

 mounted() {
    Echo.private(`messages.${this.customerRow.id}`)
        .listen('NewMessage', (e) => {
            this.hanleIncoming(e.message);
        });
  

Что я пропустил?

Спасибо!

Ответ №1:

Причина этой ошибки в том, что Laravel ожидает токен CSRF.

У вас есть два варианта:

  1. Включите токен CSRF (лучше для безопасности)
  2. Отключите CSRF для этого URL

Комментарии:

1. Я попробовал 2-й способ и получил ошибку: 403 Запрещено. Я не уверен, что это правильный путь?

2. 419 — это определенно ошибка CSRF. 403, должно быть, пришел откуда-то еще. У вас есть промежуточное программное обеспечение авторизации, которое выдает его?

3. Как я уже писал, я использую jwt.auth . Какое промежуточное программное обеспечение авторизации я должен проверить ?

4. Посмотрите на трассировку стека 403, чтобы увидеть, куда она выбрасывается.

Ответ №2:

чтобы решить эту проблему, вам нужно добавить промежуточное программное обеспечение на широковещательные маршруты, например, так.

 Broadcast::routes(['middleware' => 'auth:api']);
  

Это на app/Providers/BroadcastServiceProvider.php