File "AutenticacionControlador.php"

Full Path: C:/wamp64/www/Formaciones/Controladores/AutenticacionControlador.php
File size: 5.67 KB
MIME-type: text/x-php
Charset: utf-8

<?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;
    }
}