Laravel Reverb 客户端错误连接未经授权

问题描述 投票:0回答:1

我在使用 Laravel 11 和 ReactJS 创建聊天应用程序时遇到问题。这是设置: Laravel 11 用于后端 API。 ReactJS 用于前端,这是一个单独的应用程序。 我正在使用 Laravel Reverb 进行广播。 尝试连接到 WebSocket 时,我收到“连接未经授权”错误。这是我初始化 Echo 的相关代码片段:

window.Echo = new Echo({
  broadcaster: 'reverb',
  wsHost: 'localhost',
  key: 'key',
  wsPort: 8080,
  wssPort: 8080,
  forceTLS: false,
  authEndpoint: 'http://127.0.0.1:8000/api/broadcasting/auth',
  auth: {
    headers: {
      Authorization: `Bearer ${token}`,
    },
  },
  enabledTransports: ['ws', 'wss'],
});

但是,要授权连接,我需要以下格式的响应:

{
  "auth": "reverbAppkey:Token"
}

我有 Reverb App 密钥,但我不确定如何生成授权所需的令牌。我尝试过使用不记名令牌,但似乎不起作用。 以下是具有预期格式的示例响应:

{
  "auth": "yn0yitpyoptuusssaasadsqiyjrhm:3693e882d4b886d8dadadsasdd70b4d7484e1a80247ea9cafeb4c13b2b44debc87febeef2"
}

关于服务器端设置,我的channels.php文件包含以下内容:

Broadcast::channel("channel_for_everyone", function ($user) {
  return true;
});

注意:我已经在 Laravel 应用程序上测试了广播,它工作正常,但在尝试在 ReactJS 中使用时却不起作用

reactjs broadcast laravel-11 laravel-broadcast laravel-reverb
1个回答
0
投票

在我的设置中,我使用控制器函数作为身份验证端点,并在验证用户是否允许访问指定通道后返回预期的 JSON 响应。控制器功能如下所示:

public function generateReverbAuth(Request $request)
    {
        // channel name will be something like private-room-231 where 231 is accountId
        $socketId = $request->input('socket_id');
        $channelName = $request->input('channel_name');

        $channelPieces = explode('-', $channelName);
        $channelAccount = end($channelPieces);

        // this verifies account id against a server known value
        if ($channelAccount != $request->attributes->get('auth_account_id')) {
            return new JsonResponse(['auth' => 'INVALID'], 403);
        }

        // this generates the required format for the response
        $stringToAuth = $socketId . ':' . $channelName;
        $hashed = hash_hmac('sha256', $stringToAuth, env('REVERB_APP_SECRET'));

        return new JsonResponse(['auth' => env('REVERB_APP_KEY') . ':' . $hashed]);
    }

不确定你的身份验证在 Laravel 中是什么样子,但希望这能为你指明正确的方向。

© www.soinside.com 2019 - 2024. All rights reserved.