initializeApi($request); if ($response !== null) { return $response; } $signature = $request->get('signature', ''); $secret = $request->get('secret', ''); $agentId = $request->get('agent_id', ''); $time = $request->get('time', ''); if ($signature === '' || $secret === '' || $agentId === '' || $time === '') { return $this->error(__('Parameter signature/secret/agent_id/time can not be empty')); } $timestamp = (int) $time; if ($timestamp <= 0) { return $this->error(__('Invalid timestamp')); } $now = time(); if ($timestamp < $now - $this->timeTolerance || $timestamp > $now + $this->timeTolerance) { return $this->error(__('Timestamp expired')); } $admin = Admin::where('agent_id', $agentId)->find(); if (!$admin) { return $this->error(__('Agent not found')); } $channelId = (int) ($admin->channel_id ?? 0); if ($channelId <= 0) { return $this->error(__('Agent not found')); } $channel = ChannelManage::where('id', $channelId)->find(); if (!$channel || $channel->secret === '') { return $this->error(__('Agent not found')); } if ($channel->secret !== $secret) { return $this->error(__('Invalid agent or secret')); } $expectedSignature = strtoupper(md5($agentId . $secret . $time)); if (!hash_equals($expectedSignature, $signature)) { return $this->error(__('Invalid signature')); } $expire = (int) config('buildadmin.agent_auth.token_expire', 86400); $payload = [ 'agent_id' => $agentId, 'channel_id' => $channel->id, 'admin_id' => $admin->id, ]; $authtoken = AgentJwt::encode($payload, $expire); return $this->success('', [ 'authtoken' => $authtoken, ]); } }