laravel echo服务器-无法对客户端进行身份验证,已获得HTTP状态403 JWT auth

laravel echo服务器-无法对客户端进行身份验证,已获得HTTP状态403 JWT auth,laravel,socket.io,laravel-echo,Laravel,Socket.io,Laravel Echo,我正在建一个水疗中心。我使用laravel作为后端,vuejs作为前端。它们在不同的端口上独立运行。(使用laravel api) Laravel正在运行8000 Vue在8082上运行 我允许用户使用JWT Auth进行身份验证 我正在尝试使用laravel echo server制作一个实时数据传输应用程序,并使用公共通道传输数据,效果非常好 现在,我需要使用私有通道将数据广播给经过身份验证的用户,而这正是我无法弄清楚如何使其工作的地方,我遇到了如下错误 NuG9yhe46E3N9Q6z

我正在建一个水疗中心。我使用laravel作为后端,vuejs作为前端。它们在不同的端口上独立运行。(使用laravel api)

  • Laravel正在运行8000
  • Vue在8082上运行
我允许用户使用JWT Auth进行身份验证

我正在尝试使用laravel echo server制作一个实时数据传输应用程序,并使用公共通道传输数据,效果非常好

现在,我需要使用私有通道将数据广播给经过身份验证的用户,而这正是我无法弄清楚如何使其工作的地方,我遇到了如下错误

NuG9yhe46E3N9Q6zAAAA could not be authenticated to private-some-p
rivate-channel

Client can not be authenticated, got HTTP status 403
下面是laravel-echo-server.json文件

{
    "authHost": "http://localhost:8000",
    "authEndpoint": "/broadcasting/auth",
    "clients": [
        {
            "appId": "mprimeapp",
            "key": "d8f6639653d0c4f31efa56d27f6ab502"
        }
    ],
    "database": "redis",
    "databaseConfig": {
        "redis": {
            "port": "6379",
            "host": "127.0.0.1"
        },
        "sqlite": {
            "databasePath": "/database/laravel-echo-server.sqlite"
        }
    },
    "devMode": true,
    "host": "localhost",
    "port": "8890",
    "protocol": "http",
    "socketio": {},
    "sslCertPath": "",
    "sslKeyPath": "",
    "sslCertChainPath": "",
    "sslPassphrase": "",
    "apiOriginAllow": {
        "allowCors": true,
        "allowOrigin": ["http://localhost:8000", "http://localhost:8082"],
        "allowMethods": "GET, POST",
        "allowHeaders": "Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id"
    }
}
我使用的是同样在运行的redis而不是sqlite数据库

My main.js文件vue应用程序

const tokenData = JSON.parse(window.localStorage.getItem('authUser'))
if (tokenData !== null) {

  window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: 'http://localhost:8890',
    auth: {
      headers: {
        'Authorization': 'Bearer ' + tokenData.token
      }
    }
  })
}

window.Echo.private('some-private-channel')
  .listen('SomeEvent', (e) => {
    console.log(e)
  })
以下是我想问的一些问题

  • laravel-echo-server.json文件中的authEndpoint,它是如何工作的?我是否必须在api.php文件中设置一个端点来验证用户身份
  • laravel-echo-server.json文件中的clients数组,其中的数据有什么用途
  • 在Laravel应用程序的config/app.php内部

    我未注释这一行
    App\Providers\BroadcastServiceProvider::class

    在BroadcastServiceProvider.php中

     public function boot()
        {
            Broadcast::routes([ 'middleware' => [ 'auth:jwt.auth' ] ] ]);
            require base_path('routes/channels.php');
        }
    
    更新

    上面的函数似乎有问题。更具体地说,
    ['middleware'=>['api',jwt.auth']]

    更改middlware数组后出现此错误

    [15:58:13] - vAKK8BO7vs2TZy4SAAAA could not be authenticated to private-some-private-channel
    {
        "message": "Auth guard [jwt.auth] is not defined.",
        "exception": "InvalidArgumentException",
        "file": "C:\\xampp\\htdocs\\mipm-l\\vendor\\laravel\\framework\\src\\Illuminate\\Auth\\AuthManag
    er.php",
    .....
    .....
    .....
    

    您是否安装并配置了JWT Auth软件包?(对不起,你没有提到) 还要确保Kernel.php中有以下几行代码

       protected $routeMiddleware = [
        ...
        'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class,
        'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class,
        ...
        ];