19

我最近深入研究了 Laravel 5.3 的 Laravel-Echo 和 Pusher 组合。我已成功设置公共频道并转到私人频道。Laravel 从 /broadcasting/auth 路由返回 403 时遇到问题,无论我做什么来尝试授权操作(直到并包括使用简单的 return true 语句)。谁能告诉我我做错了什么?

应用程序/提供者/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;
        });
    }
}

资源/资产/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 调试控制台中看到该事件及其有效负载,一旦它到达 auth 路由,它就会失败。

4

9 回答 9

24

错误 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

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

于 2018-05-18T07:14:20.980 回答
9

我通过创建通道路由来解决它。

在 routes->channels.php 中创建您的授权渠道

Broadcast::channel('chatroom', function ($user) {
    return $user;
});

请参阅文档:https ://laravel.com/docs/5.4/broadcasting#authorizing-channels

谢谢

于 2017-05-15T06:50:01.330 回答
8

我将 socket.io 与 redis 配对,并且还遇到了 403 错误的问题,即使 /broadcasting/auth 路由上没有任何身份验证中间件。只有在学习laracasts 课程之后,我才发现仅仅通道授权是不够的,总是应该有用户,无论你如何验证和获取用户,使用默认的 laravel auth 或一些令牌算法 - jwt 或其他任何东西。

经过身份验证的用户会自动解析并作为第一个参数传递给 routes/channels.php 文件中的闭包函数,因此您可以检查当前登录用户的通道可用性 在此处输入图像描述

于 2019-09-04T07:42:41.680 回答
3

检查您如何授权您的频道。根据您的设置,这可能会有所帮助。使用以下内容更新您的 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');
    }
}

添加用于 Laravel Passport 的 Auth API 中间件。

于 2018-11-17T13:40:04.470 回答
2

对我有用的是使用Laravel Echo 包的 私有方法: https ://laravel.com/docs/5.3/notifications#listening-for-notifications

Echo.private('App.User.1')
  .notification((notification) => {
  console.log(notification.type);
});
于 2017-02-22T17:40:13.923 回答
2

在我的情况下,问题是错误的用户 ID:

Echo.private('user.'+CURRENT_USER_ID_HERE)
于 2018-02-14T12:20:28.953 回答
0

万一有人在最新的 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));
});

通过这种方式,它适用于任何广播任何事件的频道,包括用户。

我希望它可以帮助别人。

于 2018-10-07T10:06:02.677 回答
0

如果您不再登录,则可能会发生这种情况。确保您实际登录到 Laravel 应用程序并且您当前的会话没有过期。

我重新登录,它对我有用。

于 2018-02-27T08:02:27.093 回答
-3
-- reinstalling websockets
-- php artisan optimize:clear
于 2021-02-15T18:43:41.720 回答