我在使用 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 中使用时却不起作用
在我的设置中,我使用控制器函数作为身份验证端点,并在验证用户是否允许访问指定通道后返回预期的 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 中是什么样子,但希望这能为你指明正确的方向。