<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Request;
use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTTokenManagerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Generator\UrlGenerator;
use App\Entity\CuToken;
use App\Repository\CuTokenRepository;
use Symfony\Component\HttpClient\HttpClient;
use App\Service\AuthClaveUnicaService;
/**
* @Route("/auth/cu", name="auth_cu_")
*/
class AuthCuController extends AbstractController
{
#[Route('/login', name: 'login')]
public function login(
Request $request,
AuthClaveUnicaService $authClaveUnicaService
): Response
{
return $this->render('cu/login.html.twig', [
'claveUnicaUrlToLogin'=>$authClaveUnicaService->getUrlToLogin(),
]);
}
#[Route('/callback', name: 'callback')]
public function callback(
Request $request,
AuthClaveUnicaService $authClaveUnicaService,
JWTTokenManagerInterface $jwtManager,
CuTokenRepository $cuTokenRepository
): Response
{
$userCuCode=$_GET['code'];
$userCuState=$_GET['state'];
if ($authClaveUnicaService->getTokenConexionCU($_GET['code'],$_GET['state'])){
if ($authClaveUnicaService->loadUserLoging()){
$authClaveUnicaService->setUserLoginCUToSession($request,$this->generateUrl('logout',[], UrlGenerator::ABSOLUTE_URL));
$rutUserActual = $authClaveUnicaService->getUserLoginCUToSession($request)->rolNumero;
$dvUserActual = $authClaveUnicaService->getUserLoginCUToSession($request)->rolDv;
if(str_starts_with($userCuState, 'pu-')){
try {
$payload = [
'rut' => $rutUserActual,
'dv' => $dvUserActual,
];
// Necesitamos un objeto UserInterface válido para crear el token
$fakeUser = new class($rutUserActual, $dvUserActual) implements \Symfony\Component\Security\Core\User\UserInterface {
private string $rutUserActual;
private string $dvUserActual;
public function __construct(string $rutUserActual, string $dvUserActual)
{
$this->rutUserActual = $rutUserActual;
$this->dvUserActual = $dvUserActual;
}
public function getRoles(): array { return ['ROLE_USER']; }
public function getPassword(): ?string { return null; }
public function getSalt(): ?string { return null; }
public function getUsername(): string { return $this->rutUserActual . '-' . $this->dvUserActual; }
public function getRut(): string { return $this->rutUserActual; }
public function getDv(): string { return $this->dvUserActual; }
public function getUserIdentifier(): string { return $this->rutUserActual . '-' . $this->dvUserActual; }
public function eraseCredentials(): void {}
};
$token = $jwtManager->createFromPayload($fakeUser, $payload);
$cuToken = new CuToken();
$cuToken->setState($userCuState);
$cuToken->setToken($token);
$cuTokenRepository->save($cuToken,true);
$html = <<<HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Cerrar Ventana</title>
<script>
window.onload = function() {
window.close();
};
</script>
</head>
<body>
<p>La ventana se cerrará automáticamente.</p>
</body>
</html>
HTML;
return new Response($html);
} catch (\Exception $e) {
return new JsonResponse(['error' => 'Error de servidor', 'detalle' => $e->getMessage()], 500);
}
//return new JsonResponse(['message' => 'Credenciales correctas', 'token' => $token, 'userData' => $payload, 'state' => $userCuState]);
}
print_r( $authClaveUnicaService->getUserLoginCUToSession($request));
return $this->redirect($this->generateUrl('organizacion_home'));
}
}
if(str_starts_with($userCuState, 'pu-')){
return new JsonResponse(['message' => 'Por favor, envía credenciales válidas']);
}
return $this->redirect($this->generateUrl('auth_cu_login'));
}
#[Route('/logout', name: 'logout')]
public function logout(
Request $request,
AuthClaveUnicaService $authClaveUnicaService
): Response
{
//Eliminar Session
$authClaveUnicaService->limpiarSession($request);
$this->addFlash('success', 'Sesión Cerrada Exitosamente!');
return $this->redirect($this->generateUrl('auth_cu_login'));
}
}