<?php // Controladores/AutenticacionControlador.php require_once 'Modelos/UsuarioModelo.php'; class AutenticacionControlador { private $modelo; // Clave secreta para la validación en el servidor private const RECAPTCHA_SECRET_KEY = '6LcUafsrAAAAAL2xMNSvimYvzrMlC3YFSgUJGQPx'; public function __construct($db, $db_externa) { $this->modelo = new UsuarioModelo($db, $db_externa); } public function mostrarLogin() { if (isset($_SESSION['user_id'])) { header("Location: index.php?r=dashboard"); exit; } require_once 'Vistas/autenticacion/login.php'; } public function procesar() { // 1. VALIDACIÓN DEL RECAPTCHA $recaptchaResponse = $_POST['g-recaptcha-response'] ?? ''; if (empty($recaptchaResponse)) { $_SESSION['flash_error'] = "Por favor, completa la verificación de seguridad."; header("Location: index.php?r=auth/login"); exit; } // Llamada a la API de Google $url = 'https://www.google.com/recaptcha/api/siteverify'; $params = [ 'secret' => self::RECAPTCHA_SECRET_KEY, 'response' => $recaptchaResponse, 'remoteip' => $_SERVER['REMOTE_ADDR'] ]; $options = [ 'http' => [ 'header' => "Content-type: application/x-www-form-urlencoded\r\n", 'method' => 'POST', 'content' => http_build_query($params) ] ]; $context = stream_context_create($options); $verify = file_get_contents($url, false, $context); $captchaSuccess = json_decode($verify); if (!$captchaSuccess->success) { $_SESSION['flash_error'] = "La verificación de seguridad falló. Inténtalo de nuevo."; header("Location: index.php?r=auth/login"); exit; } // 2. CONTINUAR CON EL LOGIN NORMAL (Si el CAPTCHA es válido) $cedula = trim($_POST['cedula'] ?? ''); if (empty($cedula)) { $_SESSION['flash_error'] = "Por favor ingresa tu cédula"; header("Location: index.php?r=auth/login"); exit; } $empleado = $this->modelo->buscarEnNomina($cedula); if (!$empleado) { $_SESSION['flash_error'] = "Cédula no encontrada en el sistema de nómina"; header("Location: index.php?r=auth/login"); exit; } $usuario = $this->modelo->buscarLocal($cedula); if (!$usuario) { $this->modelo->registrarLocal([ 'nombre' => $empleado['nombre'], 'apellido' => $empleado['apellido'], 'cedula' => $empleado['cedula'], 'ccosto' => $empleado['ccosto'], 'cargo' => $empleado['cargo'] ]); $usuario = $this->modelo->buscarLocal($cedula); } // Si es admin o instructor, redirigir al segundo paso if ($usuario['role'] === 'admin' || $usuario['role'] === 'instructor') { $_SESSION['pending_cedula'] = $usuario['cedula']; $_SESSION['pending_empleado'] = $usuario; header("Location: index.php?r=auth/login-admin"); exit; } // Si es student, ingresar directamente $this->crearSesion($usuario); header("Location: index.php?r=dashboard"); exit; } // 3. Muestra el segundo formulario (Email y Password) public function mostrarLoginAdmin() { if (!isset($_SESSION['pending_cedula'])) { header("Location: index.php?r=auth/login"); exit; } require_once 'Vistas/autenticacion/loginAdmin.php'; } // 4. Procesa el segundo paso (Validación Administrativa) public function procesarAdmin() { $email_ingresado = trim($_POST['email'] ?? ''); $password_ingresado = $_POST['password'] ?? ''; $usuario = $_SESSION['pending_empleado'] ?? null; if (!$usuario) { $_SESSION['flash_error'] = "Sesión expirada. Por favor, inicia sesión nuevamente."; header("Location: index.php?r=auth/login"); exit; } $error = null; // Validación de Email if ($email_ingresado !== $usuario['email']) { $error = "El correo electrónico no es correcto."; } // ✅ CORRECCIÓN: Usar password_verify() para comparar con el hash elseif (!password_verify($password_ingresado, $usuario['password_hash'])) { $error = "La contraseña es incorrecta."; } if ($error) { $_SESSION['flash_error'] = $error; header("Location: index.php?r=auth/login-admin"); exit; } // ÉXITO: Limpiar datos temporales e iniciar sesión real unset($_SESSION['pending_cedula']); unset($_SESSION['pending_empleado']); $this->crearSesion($usuario); header("Location: index.php?r=dashboard"); exit; } // 5. Helper para crear la sesión oficial private function crearSesion($usuario) { $_SESSION['user_id'] = $usuario['id']; $_SESSION['user_name'] = $usuario['name']; $_SESSION['user_role'] = $usuario['role']; } // 6. Cerrar Sesión public function salir() { $_SESSION = array(); if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"] ); } session_destroy(); header("Location: index.php?r=auth/login"); exit; } }