configResolver->getApp(); $kekaUrl = $this->configResolver->getKekaUrl($app); $provider = $this->configResolver->getProvider($app); $redirectUrl = $this->urlBuilder->buildExternalLoginUrl($kekaUrl, $provider); Log::info('Redirecting user to Keka external login page.', [ 'user_id' => $user->id, 'keka_url' => $kekaUrl, 'redirect_url' => $redirectUrl, ]); return $redirectUrl; } public function handleCallback(User $user, Request $request): Response|RedirectResponse { $code = $request->input('code'); if (empty($code)) { return redirect() ->route('dashboard.user') ->with('keka_error', 'Keka connection failed: Missing code.'); } $app = $this->configResolver->getApp(); $kekaUrl = $this->configResolver->getKekaUrl($app); $callbackPath = $this->configResolver->getCallbackPath($app); $callbackUrl = $this->urlBuilder->buildCallbackUrl($kekaUrl, $callbackPath); $this->tokenService->store($user, (string) $code); Log::info('Keka tokens stored successfully. Passing OIDC response to Keka.', [ 'user_id' => $user->id, 'callback_url' => $callbackUrl, 'method' => $request->method(), ]); if ($request->isMethod('post')) { return response($this->renderAutoSubmitForm($callbackUrl, $request->all())); } $queryString = http_build_query($request->query()); return redirect("{$callbackUrl}?{$queryString}"); } private function renderAutoSubmitForm(string $callbackUrl, array $inputsData): string { $inputs = ''; foreach ($inputsData as $key => $value) { $safeKey = htmlspecialchars((string) $key, ENT_QUOTES, 'UTF-8'); $safeValue = htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8'); $inputs .= "\n"; } return << Forwarding to Keka...
{$inputs}
HTML; } public function disconnect(User $user): void { $this->tokenService->revoke($user); Log::info('Keka integration disconnected for user.', [ 'user_id' => $user->id, ]); } }