当前位置: 首页 > 知识库问答 >
问题:

Laravel回声-无法验证到私人频道

常光明
2023-03-14

我正在尝试使用专用通道验证laravel echo。每次我收到“无法验证到private-U详细信息。1”。“basket_details”这是通道名称,1是参数

当我使用公共频道时,一切都很完美。因此,我认为auth部分存在一些问题。

这是我的错误日志

⚠ [14:42:55] - 5eKrT28nX7uLHEkLAAAG could not be authenticated to private-basket_details.1
{
    "message": "",
    "exception": "Symfony\Component\HttpKernel\Exception\NotFoundHttpException",
    "file": "/var/www/html/Laravel/uneek_clothing/trunk/public_html/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php",
    "line": 179,
    "trace": [
        {
            "file": "/var/www/html/Laravel/uneek_clothing/trunk/public_html/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 612,
            "function": "match",
            "class": "Illuminate\Routing\RouteCollection",
            "type": "->"
        },
        {
            "file": "/var/www/html/Laravel/uneek_clothing/trunk/public_html/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
            "line": 601,
            "function": "findRoute",
            "class": "Illuminate\Routing\Router",
            "type": "->"
        },
        {

这是我的事件文件。

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
use App\Basket;
use App\User;

class UpdateWebOrderDetailsToBasket implements ShouldBroadcastNow
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
    public $basket;

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

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('basket_details.'.$this->basket->id);
    }

}

这是我的频道。php

<?php
// use Illuminate\Broadcasting\PrivateChannel;

/*
|--------------------------------------------------------------------------
| Broadcast Channels
|--------------------------------------------------------------------------
|
| Here you may register all of the event broadcasting channels that your
| application supports. The given channel authorization callbacks are
| used to check if an authenticated user can listen to the channel.
|
*/

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

// Broadcast::PrivateChannel('basket.{basketId}', function ($user, $basketId) {
//     return true;
// });

// Broadcast::channel('basket_details.1', function ($user, $basketId) {
//     return true;
// });

Broadcast::channel('basket_details.{basketId}', function ($user, $basketId) {
    return true;
});

// Broadcast::channel('private-basket_details.*', function ($user, $basketId) {
//     return true;
// });

这是我的js文件

Echo.private('basket_details.1')
    .listen('.App\Events\UpdateWebOrderDetailsToBasket', (e) => {
      console.log("channel started here");
    }); 

这是我的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();

        require base_path('routes/channels.php');
    }
}

这是我的laravel echo服务器。json

{
    "authHost": "http://192.168.1.120:1002",
    "authEndpoint": "/broadcasting/auth",
    "clients": [
        {
            "appId": "be17370a567448f7",
            "key": "7af893ebfa188744e6317b30a481824f"
        }
    ],
    "database": "redis",
    "databaseConfig": {
        "redis": {},
        "sqlite": {
            "databasePath": "/database/laravel-echo-server.sqlite"
        }
    },
    "devMode": true,
    "host": null,
    "port": "9999",
    "protocol": "http",
    "socketio": {},
    "sslCertPath": "",
    "sslKeyPath": "",
    "sslCertChainPath": "",
    "sslPassphrase": "",
    "apiOriginAllow": {
        "allowCors": true,
        "allowOrigin": "http://192.168.1.120:9999",
        "allowMethods": "GET,POST",
        "allowHeaders": "Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id"
    }
}

共有3个答案

邓鸿雪
2023-03-14

添加代码

杜曜灿
2023-03-14

可能有问题的一点是您正在侦听的事件名称空间。文档使用点符号而不是反斜杠显示:

Echo.private('basket_details.1')
  // change this to '.App.Events.UpdateWebOrderDetailsToBasket' 
  // or just 'UpdateWebOrderDetailsToBasket' since you are using the default App\Events.
  .listen('.App\Events\UpdateWebOrderDetailsToBasket', (e) => {
    console.log("channel started here");
  });

请参阅名称空间

您能否验证是否达到了正确的授权路径?如果您从以下位置登录,是否打印任何内容:

Broadcast::channel('basket_details.{basketId}', function ($user, $basketId) {
    logger('Basked ID: ' . $basketId);
    return true;
});

例如,如果要使用api中间件保护这些路由,则需要使用适当的头创建Echo实例:

const client = new Echo({
  auth: {
    headers: {
      Authorization: `Bearer ${token}`
    }
  }
})
松兴邦
2023-03-14

您是否忘记取消对config/app中BroadcastServiceProvider::class的注释。php

App\Providers\BroadcastServiceProvider::class
 类似资料:
  • 我正在尝试创建一个实时聊天应用程序。我使用了Laravel Echo、Redis和socket io。 但是没有收听私人广播聊天频道。 应用程序事件消息推送

  • 我看到这个问题已经被问了很多次,但是没有一个答案是有效的,所以我请求帮助和一些见解。 我使用laravel回声和redis广播事件。我的laravel回声服务器启动得很好,redis运行得很好。 重新加载网页时,在laravel echo服务器终端中出现以下错误: 我一直在做这件事,但没有什么能帮上忙。 这是我的 这里是我的 我的 这是我的larave echo服务器。json 当我触发事件时,我

  • 我目前正在我的Nuxt应用程序中实现WebSocket。我有一个Laravel后端,我使用Pusher和Laravel Echo。问题是,当尝试连接/订阅专用频道时,由于客户端通过广播/authendpoint获得授权,因此未命中单个频道的auth(channels.php)。因此,登录用户有可能访问他们不应该访问的私有通道。 我的代码/配置如下: NUXT前端: 努克斯。配置。js }, 拉威尔

  • 为了在频道上播放事件,我使用了laravel Echo、redis和socket io。 这是我的活动: 插座。io服务器我正在使用laravel echo服务器,下面是配置: 这是文件中的Echo结构: 运行laravel echo server和call event后,控制台中会显示以下日志,其中显示到频道的事件广播: 但Echo无法收听频道并发生事件。 问题是什么?

  • 活动是: 路线/频道。php是: 在刀片文件中: 广播频道工作正常。但在私密频道里,这是行不通的。并且在控制台中没有显示任何错误 我使用拉威尔回声和推进器

  • 我已经为我的应用程序设置了Pusher和Laravel Echo,以便在某些事件触发时通知用户。 我已经测试过,看看设置是否通过在“公共频道”上播放而工作,并成功地看到这是工作。 以下是活动本身: 公共频道: app/resources/assets/js/bootstrap。js: 和Laravel回声注册:(它是在我的主布局的头部部分,事件射击视图延伸。) 现在,这种设置适用于公共频道广播,但