我该怎么做才能解决从 auth 端点返回的推送器 error-JSON 无效,但状态代码为 200?

What can I do to resolve this pusher error-JSON returned from auth endpoint was invalid, yet status code was 200?

我在这里问了同样的问题后仍然有这个问题:JSON returned from auth endpoint was invalid, yet status code was 200 没有回应。我看过类似的问题并关注了 建议:将我的广播 driver 设置为 'pusher',在我的 app.config 文件中取消注释 'App/BroadcastServiceProvider' class,在我的 .env 文件中将调试模式设置为 false,等等。我也看过 pusher 文档,但问题对我来说仍然没有解决。

我已经通过添加“/broadcasting/auth/”身份验证端点和 headers 更新了我之前的尝试,但仍然出现相同的错误。但我现在可以看到一个 302 重定向到 auth 路由,然后一个 302 重定向到登录路由,然后到仪表板,在 laravel telescope 上有一个 200 响应,这是我以前没有看到的。所以这向我表明,添加身份验证端点应该可以解决问题,但事实并非如此。

我还尝试设置并使用“/pusher/auth/”身份验证端点路由和控制器,但它给了我一个 'Failed to load resource: the server responded with a status of 405 (Method Not Allowed)' 以及“错误:无法从身份验证端点检索身份验证字符串- 收到状态:来自 /pusher/auth 的 405,但不是先前的无效 json 错误。我通过对控制器的 'get' 请求得到了这个,但是 500 内部服务器错误 'post' 请求。我真的不知道哪个是正确的。

这是我的 bootstrap.js 文件:

import Echo from 'laravel-echo';

window.Pusher = require('pusher-js');

// Enable pusher logging - don't include this in production
Pusher.logToConsole = true;

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY,
    cluster: process.env.MIX_PUSHER_APP_CLUSTER,
    forceTLS: true,
    authEndpoint: '/broadcasting/auth',
    //authEndpoint: '/pusher/auth',
    auth: {
        headers: {
            'X-CSRF-TOKEN': '{{ csrf_token() }}',
        }
    }
});

这是我创建的一个 pusherController:

public function pusherAuth(Request $request)
    {

        $key = getenv('PUSHER_APP_KEY');
        $secret = getenv('PUSHER_APP_SECRET');
        $app_id = getenv('PUSHER_APP_ID');

        $pusher = new Pusher($key, $secret, $app_id);
        $auth = $pusher->socket_auth($_GET('channel_name'), $_GET('socket_id'));
        
        return response($auth, 200);
}

我现在知道应该接收和显示广播的我的 vue 前端文件已签出,问题与解决此推送器订阅错误有关。

我们将不胜感激。

我终于能够解决这个问题。正如错误消息所指出的那样,该问题完全是身份验证问题。虽然我仍然不知道为什么内置的“/broadcast/auth”端点不起作用,但我最初通过创建“/pusher/auth/”来进行身份验证的尝试在我设置路由的方式上是错误的和控制器。

正确的路由设置应该是 'post' 并调用控制器,使用基于闭包的路由对我不起作用。我以前(见上文)控制器的实现也是错误的。

这是有效的控制器代码:

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Pusher\Pusher;

class PusherController extends Controller
{
     /**
     * Authenticates logged-in user in the Pusher JS app
     * For private channels
     */
    public function pusherAuth(Request $request)
    {

        $user = auth()->user();
        $socket_id = $request['socket_id'];
        $channel_name =$request['channel_name'];
        $key = getenv('PUSHER_APP_KEY');
        $secret = getenv('PUSHER_APP_SECRET');
        $app_id = getenv('PUSHER_APP_ID');

        if ($user) {
     
            $pusher = new Pusher($key, $secret, $app_id);
            $auth = $pusher->socket_Auth($channel_name, $socket_id);

            return response($auth, 200);

        } else {
            header('', true, 403);
            echo "Forbidden";
            return;
        }
    }
}

这是最终的 bootstrap.js 文件:

import Echo from 'laravel-echo';

window.Pusher = require('pusher-js');

// Enable pusher logging - don't include this in production
Pusher.logToConsole = true;

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY,
    cluster: process.env.MIX_PUSHER_APP_CLUSTER,
    forceTLS: true,
    authEndpoint: '/pusher/auth',
    auth: {
        headers: {
            'X-CSRF-TOKEN': '{{ csrf_token() }}',
        }
    }
});

还有我在 web.php 中的路线代码:

Route::post('/pusher/auth', [PusherController::class, 'pusherAuth'])
->middleware('auth');

推送控制台日志: 推送器::[“事件记录”,{“事件”:“pusher_internal:subscription_succeeded”,“频道”:“private-user.3”,“数据”:{}}] vendor.js:41325 Pusher : : [“pusher:subscription_succeeded 的私人用户 3 上没有回调”]

检查您的 .env 以获得正确的广播驱动程序:

BROADCAST_DRIVER=pusher