【问题标题】:Laravel Echo / Pusher authentication fails (403)Laravel Echo / Pusher 身份验证失败 (403)
【发布时间】:2018-01-21 07:49:28
【问题描述】:

学习Laravel事件广播/Echo/Vue和玩this tutorial

我不断收到403 对身份验证的响应,我怀疑我对channels.php 路由缺乏了解是问题所在。我使用Player 模型而不是User 来代替Auth,这可以正常工作。

事件ChatMessageSend

class ChatMessageSent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $channel;
    public $player;
    public $chatMessage;

        /**
         * Create a new event instance.
         * GameChat constructor.
         * @param $chatMessage
         * @param $player
         */
        public function __construct(ChatMessage $chatMessage, Player $player)
        {
            $this->channel = session()->get('chat.channel');

            $this->chatMessage = $chatMessage;

            $this->player = $player;
        }

        /**
         * Get the channels the event should broadcast on.
         *
         * @return Channel|array
         */
        public function broadcastOn()
        {
            return new PrivateChannel($this->channel);
        }
    }

监听器ChatMessageNotification(默认/空)

class ChatMessageNotification
{
    /**
     * ChatMessageNotification constructor.
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  ChatMessageSent  $event
     * @return void
     */
    public function handle(ChatMessageSent $event)
    {
        //
    }
}

控制器ChatController

class ChatController extends Controller
{
    /**
     * Send chat message
     *
     * @param Request $request
     * @return \Illuminate\Database\Eloquent\Collection|static[]
     */
    public function getMessages(Request $request)
    {
        return ChatMessage::with('player')
            ->where('progress_id', '=', session('game.progress.id'))
            ->orderBy('created_at', 'DESC')
            ->get();
    }

    /**
     * Send chat message
     *
     * @param Request $request
     * @return array|string
     */
    public function sendMessage(Request $request)
    {
        $player = Auth::user();

        $message = $request->input('message');

        if ($message) {
            $message = ChatMessage::create([
                'player_id'   => $player->id,
                'progress_id' => session()->get('game.progress.id'),
                'message'     => $request->input('message')
            ]);
        }

        broadcast(new ChatMessageSent($player, $message))->toOthers();

        return ['type' => 'success'];
    }
}

路由channels.php

Broadcast::channel(session()->get('chat.channel'), function ($player, $message) {
    return $player->inRoom();
});

在我的Player 课堂上

/**
 * A user can be in one chat channel
 */
public function inRoom()
{
    if ((Auth::check()) and ($this->games()->where('progress_id', '=', session('game.progress.id'))->get())) {
        return true;
    }

    return false;
}

当玩家登录时,我会在会话中存储一个我想用作频道的聊天室 ID。

我的vue 聊天实例是

Vue.component('chat-messages', require('./../generic/chat-messages.vue'));
Vue.component('chat-form', require('./../generic/chat-form.vue'));

const app = new Vue({
    el: '#toolbar-chat',

    data: {
        messages: []
    },

    created() {
        this.fetchMessages();

        Echo.private(chat_channel)
        .listen('chatmessagesent', (e) => {
            this.messages.unshift({
                message: e.data.message,
                player: e.data.player.nickname
            });
        });
    },

    methods: {
        fetchMessages() {
            axios.get(chat_get_route)
            .then(response => {
                this.messages = response.data;
            });
        },

        addMessage(message) {
            this.messages.unshift(message);

            this.$nextTick(() => {
                this.$refs.toolbarChat.scrollTop = 0;
            });

            axios.post(chat_send_route, message)
            .then(response => {
                console.log(response.data);
            });

        }
    }
});

但我不断得到

POST http://my-games.app/broadcasting/auth 403 (Forbidden)
Pusher : Couldn't get auth info from your webapp : 403

【问题讨论】:

    标签: laravel-5.4 pusher laravel-echo


    【解决方案1】:

    确定您的 routes/channels.php 文件是否按预期运行可能是一个想法。也许添加一些日志以查看该路由是否被调用,并且您的 inRoom 函数正在返回您所期望的。

    【讨论】:

      【解决方案2】:

      Error 403 /broadcasting/auth with Laravel version > 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
      

      它对我有用,希望对你有所帮助。

      【讨论】:

        【解决方案3】:

        如果有人仍然需要答案,这对我有用。 添加到您的 broadcastServiceProvider.php

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

        添加到您的 channels.php

        Broadcast::channel('chat', function () {
            return Auth::check();
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-16
          • 1970-01-01
          • 1970-01-01
          • 2020-08-17
          • 2014-05-29
          • 2014-07-05
          相关资源
          最近更新 更多