Saltar al contenido principal

Captive Portal personalizado: Guía de HTML y CSS

Esta guía de referencia técnica autorizada describe los estándares de desarrollo, la arquitectura CSS y las restricciones a nivel de red necesarias para diseñar y codificar una página de inicio de Captive Portal personalizada. Proporciona a los desarrolladores frontend y arquitectos de red estrategias prácticas para navegar por los entornos de Apple CNA y Android webview, garantizando experiencias de WiFi para invitados de alto rendimiento, conformes y con una precisión de píxel perfecta.

Por Tom HackettPublicado
📖 11 min de lectura4,061 palabras2 ejemplos prácticos3 preguntas de práctica8 definiciones clave

Video overview

Escuchar esta guía

Ver transcripción del podcast
Captive Portal personalizado: Guía de HTML y CSS — Un informe técnico de Purple [INTRODUCTION] Le damos la bienvenida a la serie de informes técnicos de Purple. Hoy vamos a profundizar en un aspecto que afecta a todas las implementaciones de WiFi para invitados: el Captive Portal. En concreto, hablaremos de cómo escribir HTML y CSS limpios y fiables para una página de inicio de Captive Portal personalizada. Si alguna vez se ha conectado al WiFi de un hotel y se ha encontrado con una página de bienvenida que no funcionaba (con imágenes ausentes, texto sin formato o un botón de inicio de sesión que no respondía al tacto), ya sabe lo que ocurre cuando un desarrollador crea un portal sin comprender las limitaciones del entorno en el que se ejecuta. Hoy nos aseguraremos de que eso no le ocurra a usted. Este informe técnico está dirigido a desarrolladores frontend, diseñadores creativos y desarrolladores web que vayan a crear un Captive Portal desde cero o a personalizar una plantilla existente. Abordaremos la estructura HTML, las reglas CSS más importantes, las limitaciones del mini-navegador CNA de Apple que desconciertan incluso a los desarrolladores experimentados y cómo las plataformas como el creador de portales de Purple pueden eliminar por completo la mayor parte de esta complejidad. Comencemos. [TECHNICAL DEEP-DIVE] En primer lugar, establezcamos qué es realmente un Captive Portal a nivel de red. Cuando un dispositivo se conecta a una red WiFi que requiere autenticación, la red intercepta el tráfico HTTP y redirige al usuario a una página de inicio. Esto es el Captive Portal. El usuario ve una página de bienvenida, completa una acción (como introducir un correo electrónico, aceptar las condiciones o iniciar sesión a través de redes sociales) y, a continuación, la red le concede acceso total a Internet. Lo fundamental es comprender dónde se renderiza esta página. En los dispositivos iOS, se abre dentro del Captive Network Assistant de Apple (el CNA), que es un visor web WebKit simplificado. No es Safari. No tiene cookies persistentes. No puede cargar recursos externos. Su compatibilidad con JavaScript es limitada. Y se cierra en el momento en que el usuario cambia a otra aplicación. En macOS, el CNA se renderiza con un tamaño fijo de 900 por 572 píxeles. En Android, los dispositivos modernos utilizan Chrome Custom Tabs, que son considerablemente más potentes. Windows 10 abre el navegador predeterminado del usuario. Los dispositivos Samsung utilizan Samsung Internet. Esta fragmentación de plataformas es la mayor fuente de fallos en los portales cautivos en entornos de producción. Los desarrolladores realizan pruebas en sus teléfonos Android, todo se ve de maravilla y, de repente, los huéspedes del hotel que usan iPhone se encuentran con una pantalla en blanco con texto sin formato. Por tanto, hablemos de cómo codificar a la defensiva. La regla de oro para el HTML y CSS de un Captive Portal es la siguiente: trate la página como si no tuviera conexión a Internet. Porque durante la fase de autenticación, no la tiene. La red es cautiva. Cualquier recurso que su página intente cargar desde una URL externa (como una fuente de Google, una hoja de estilo alojada en un CDN, una biblioteca de JavaScript o una imagen de logotipo) fallará de forma silenciosa o provocará que aparezca un indicador de carga que nunca se resolverá. Empezando por la estructura HTML. Su documento debe ser una página HTML5 limpia. En la cabecera (head), necesita una etiqueta meta viewport con el contenido configurado como width igual a device-width e initial-scale igual a uno. Esto es innegociable para la renderización móvil. Sin ella, iOS renderizará la página a 980 píxeles de ancho y reducirá su escala, haciendo que todo se vea microscópico. Su CSS debe ser insertado en línea - bien en un bloque style dentro del elemento head, o como atributos style en línea en elementos individuales. No utilice una hoja de estilo externa vinculada mediante una etiqueta link. Esa hoja de estilo reside en su servidor, al cual la red cautiva no puede acceder durante la autenticación. La página se renderizará completamente sin estilos. Para las fuentes, utilice un conjunto de fuentes del sistema. Algo como: font-family - apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif. Esto le indica al navegador que use cualquier fuente del sistema que esté disponible. No utilice Google Fonts. La llamada de importación fallará y su fuente alternativa será Times New Roman, lo cual no es la experiencia de marca por la que paga su cliente. Para las imágenes - su logotipo, gráficos de fondo, elementos decorativos - tiene dos opciones. O bien las sirve desde el mismo servidor del Captive Portal, lo que significa que están en la misma red local y son accesibles antes de que se complete la autenticación. O, mejor aún, las codifica como URI de datos Base64 directamente en su HTML o CSS. Esto elimina por completo la dependencia externa. Hablemos ahora del diseño de la página. Dado que más del noventa por ciento de los inicios de sesión en los portales cautivos se realizan en dispositivos móviles, su diseño debe priorizar el formato móvil. Eso significa un diseño de una sola columna, con un ancho máximo de alrededor de 480 píxeles, centrado en la página. Utilice flexbox en el elemento body - display flex, flex-direction column, align-items centre, justify-content centre, min-height 100 de altura de viewport. Esto centra la tarjeta de contenido vertical y horizontalmente en cualquier tamaño de pantalla. Su botón de llamada a la acción principal debe ser fácil de tocar. Las Directrices de Interfaz Humana de Apple especifican un objetivo de toque mínimo de 44 por 44 píxeles. En la práctica, para una CTA principal, conviene algo más parecido a 48 píxeles de alto, a ancho completo dentro del contenedor, con un border-radius de alrededor de 8 a 12 píxeles. Para los campos de formulario - entrada de correo electrónico, entrada de nombre - establezca el font-size en al menos 16 píxeles. Esto es fundamental. iOS Safari y el CNA ampliarán automáticamente cualquier campo de entrada con un font-size inferior a 16 píxeles, lo que estropeará su diseño cuidadosamente diseñado. Establecer el font-size en 16 píxeles o más evita este comportamiento de zoom. La sección de consentimiento legal merece especial atención. Según el GDPR, si recopila datos personales - incluso solo una dirección de correo electrónico - necesita un consentimiento explícito e informado. Esto significa una casilla de verificación desmarcada por defecto, con una etiqueta visible que indique claramente qué está consintiendo el usuario. No marque previamente la casilla de verificación. La propia casilla de consentimiento debe ser claramente visible sin necesidad de hacer scroll. Ahora, un detalle de implementación crítico para CNA de iOS específicamente. Cuando el usuario completa la autenticación, el CNA monitoriza si el dominio cautivo ha pasado a estar accesible. La comprobación se activa mediante la navegación de página completa, no por llamadas AJAX de JavaScript. Esto significa que si creas una aplicación de una sola página que envía el formulario a través de fetch o XMLHttpRequest y actualiza el DOM sin una redirección de página completa, el CNA nunca detectará que la autenticación se ha completado. Debes redirigir a una nueva URL después de la autenticación: una redirección HTTP completa, no una manipulación del DOM de JavaScript. Este es uno de los errores más comunes en el desarrollo de Captive Portal. Para JavaScript, manténlo al mínimo. El CNA tiene soporte de JS limitado y no tiene acceso a localStorage o sessionStorage. Las cookies se destruyen cuando se cierra el CNA. Cualquier gestión de estado que dependa de estas API de navegador fallará. Los escuchadores de eventos de JavaScript nativo están bien. jQuery es una dependencia externa de 30 kilobytes que fallará al cargarse. [RECOMENDACIONES DE IMPLEMENTACIÓN Y ERRORES COMUNES] Permíteme darte la lista de verificación de implementación práctica. Primero: etiqueta meta viewport, siempre. Segundo: todo el CSS en línea, sin hojas de estilo externas. Tercero: todas las imágenes servidas desde el servidor del Captive Portal o codificadas en Base64. Cuarto: pila de fuentes del sistema, sin fuentes web. Quinto: tamaño de fuente mínimo de 16 píxeles en todos los campos de entrada. Sexto: objetivos táctiles adaptados, mínimo de 44 por 44 píxeles. Séptimo: diseño de una sola columna, ancho máximo de 480 píxeles. Octavo: redirección de página completa al autenticarse, no una actualización de estado de JavaScript. Noveno: casilla de consentimiento conforme al GDPR, desmarcada por defecto. Décimo: prueba en un dispositivo iOS real utilizando una red cautiva real, no una vista previa del navegador. Los errores que veo más a menudo en producción. Número uno: Google Fonts - elimina la importación, fallará. Número dos: bibliotecas externas de JavaScript - Bootstrap, jQuery, cualquier script alojado en CDN fallará. Número tres: variables CSS declaradas en una hoja de estilo externa - deben estar en tu bloque de estilo en línea. Número cuatro: imágenes de fondo referenciadas por URL - codifícalas en Base64. Número cinco: envío de formularios AJAX sin una redirección posterior a la autenticación - el CNA no detectará la finalización de la autenticación. Ahora, la conversación honesta sobre desarrollar frente a comprar. Desarrollar un Captive Portal personalizado desde cero significa que también eres responsable de la infraestructura backend: el servidor RADIUS, la base de datos, el certificado SSL, la configuración de DNS, la integración de red con tus puntos de acceso y la aplicación continua de parches de seguridad. Este es un compromiso de ingeniería significativo. El creador de portales de Purple te ofrece una interfaz de arrastrar y soltar con un editor de HTML y CSS personalizado para desarrolladores que necesitan un control milimétrico, al tiempo que gestiona toda la infraestructura backend: la autenticación, Purple Capture, las analíticas, las herramientas de cumplimiento de GDPR y las integraciones de red con más de 200 fabricantes de puntos de acceso. Obtienes el control creativo sin la sobrecarga de infraestructura. [PREGUNTAS Y RESPUESTAS RÁPIDAS] ¿Puedo usar CSS Grid en un captive portal? Sí, pero pruébalo específicamente en iOS CNA. Flexbox tiene un soporte más amplio en versiones anteriores de WebKit. ¿Puedo usar logotipos SVG? Sí, los SVG integrados en línea son totalmente compatibles y preferibles a los PNG codificados en Base64 para los logotipos porque se escalan perfectamente en pantallas retina. ¿Admite macOS CNA las mismas limitaciones que iOS CNA? En general sí, con una diferencia: macOS CNA se renderiza en una ventana fija de 900 por 572 píxeles. ¿Puedo usar un framework de CSS como Tailwind? Solo si generas un archivo CSS purgado y autónomo y lo integras en línea en tu bloque de estilo. ¿Qué pasa con el HTTPS? Tu captive portal debe servirse a través de HTTP para que la redirección inicial funcione; las conexiones HTTPS no pueden ser interceptadas por la red cautiva. [RESUMEN Y SIGUIENTES PASOS] Para resumir la sesión de hoy. Un captive portal personalizado es un entorno web limitado, no un contexto de navegador estándar. Apple CNA y los webviews de Android imponen restricciones estrictas a los recursos externos, las cookies, JavaScript y el estado de la sesión. La solución consiste en crear páginas HTML autónomas con CSS integrado en línea, fuentes del sistema, imágenes codificadas en Base64 y redirecciones de página completa tras la autenticación. Para los operadores de recintos y equipos de TI que estén evaluando sus opciones: si su requisito es un portal totalmente personalizado con su propia marca, HTML y CSS a medida, la elección radica en desarrollar y mantener toda la infraestructura usted mismo - lo que supone un compromiso de ingeniería sustancial - o utilizar una plataforma como Purple que proporciona la capacidad de edición de HTML y CSS personalizados sobre una infraestructura de backend de nivel de producción. Los siguientes pasos a partir de aquí: revise la documentación del editor de portales de Purple, audite su portal existente con la lista de verificación optimizada para móviles que hemos cubierto hoy y, si empieza desde cero, utilice la estructura de plantilla HTML que hemos descrito como base. Gracias por escucharnos y nos vemos en la próxima sesión.

Parte de nuestra serie principal: Guía de Captive Portal

Captive Portal personalizado: Guía de HTML y CSS

Resumen Ejecutivo

Para los recintos empresariales - que van desde hoteles de lujo Hospitality y cadenas de tiendas Retail hasta centros de transporte Transport y campus médicos modernos Healthcare - la página de bienvenida de la red WiFi de invitados es la puerta de entrada digital. Sin embargo, más del 90% de los inicios de sesión de WiFi de invitados se realizan en dispositivos móviles, donde la visualización no está regulada por navegadores estándar como Safari o Chrome, sino por webviews muy restringidos de Captive Network Assistant (CNA) [1]. Estos "mini-navegadores" imponen severas limitaciones de entorno aislado (sandbox): bloquean CDN externas, desactivan cookies persistentes, ignoran fuentes web externas y restringen estrictamente la ejecución de JavaScript para mitigar riesgos de seguridad y evitar el secuestro de sesiones [2].

Cuando un desarrollador diseña una página de bienvenida utilizando los estándares web tradicionales, estas restricciones provocan un diseño desconfigurado, la pérdida de elementos de marca y botones de inicio de sesión que no funcionan, lo que repercute directamente en la satisfacción del cliente y el compromiso digital. Esta guía ofrece soluciones a estos desafíos, presentando prácticas de desarrollo defensivas - como CSS en línea, codificación de recursos en Base64, conjuntos de fuentes del sistema y flujos explícitos de autenticación basados en navegación - para garantizar una visualización fluida en cualquier plataforma. Además, analizamos cómo el uso de una solución gestionada como el creador de portales de Purple permite a los desarrolladores mantener un control creativo total de HTML/CSS mientras delegan la autenticación RADIUS, el escalado de bases de datos, el cumplimiento de GDPR/PCI y las integraciones de puntos de acceso de múltiples proveedores [3].

Análisis Técnico Detallado

Para crear un Captive Portal personalizado y resistente, los desarrolladores deben comprender la interceptación a nivel de red y la virtualización del navegador que se producen cuando un invitado se asocia a un SSID abierto.

El Ciclo de Vida del Captive Portal

Cuando un dispositivo cliente se asocia a un SSID cautivo, se inicia la siguiente secuencia:

  1. Asociación de IP: El dispositivo completa un protocolo de enlace de 3 vías (3-way handshake) y solicita una dirección IP a través de DHCP.
  2. Prueba de Conectividad Activa: El gestor de red en segundo plano del sistema operativo envía inmediatamente una solicitud HTTP GET a una URL de prueba dedicada e independiente del proveedor (por ejemplo, http://captive.apple.com/hotspot-detect.html de Apple o http://connectivitycheck.gstatic.com/generate_204 de Google) [1].
  3. Interceptación de DNS/HTTP: El controlador de red LAN inalámbrica (WLC) local o el punto de acceso (AP) intercepta esta solicitud HTTP del puerto 80. En lugar de devolver el estado HTTP 200 o 204 esperado, la pasarela redirige el tráfico del cliente a la URL de la página de destino del Captive Portal mediante una redirección HTTP 302 [2].
  4. Aparición de Webview: Al detectar la redirección, el sistema operativo abre su mini-navegador nativo Captive Network Assistant (CNA) para mostrar la página de bienvenida redirigida, evitando que el usuario tenga que abrir manualmente un navegador completo.5. Autenticación y transición de estado: El usuario completa el formulario de inicio de sesión, enviando las credenciales de vuelta al servidor del portal, que indica a la pasarela (a menudo a través de un RADIUS Access-Accept o llamada API externa) que autorice la dirección MAC.
  5. Apretón de manos de salida de CNA: El mini-navegador CNA realiza otra petición HTTP GET a su URL canaria. Si recibe la respuesta esperada 200/204, cambia su botón superior derecho de "Cancelar" a "Hecho" y establece la conexión WiFi como interfaz de red principal.

Restricciones del mini-navegador específicas de cada plataforma

Cada sistema operativo gestiona este ciclo de vida en diferentes entornos de webview, lo que da lugar a un comportamiento muy fragmentado. La siguiente tabla detalla estas restricciones críticas:

Plataforma / Webview Método de visualización Cookies persistentes Fuentes web externas Ejecución de JavaScript Dimensiones de la ventana Activador de apretón de manos de salida
Apple iOS CNA (Websheet) Ventana emergente de mini-navegador Bloqueadas (Se destruyen al cerrar) Bloqueadas (Sin conexión) Limitada (Sin localStorage/sessionStorage) Adaptable (Ancho del dispositivo) Solo redirección HTTP de página completa [1]
Apple macOS CNA (Captive Network Assistant) Ventana emergente de mini-navegador Bloqueadas Bloqueadas Limitada (Sin diálogos de alerta/confirmación) Fija (900px x 572px) Solo redirección HTTP de página completa
Android (Google) (CaptivePortalLogin) Notificación push -> Pestaña personalizada de Chrome Permitidas (Compartidas con Chrome) Permitidas (Si están en la lista blanca de la zona vallada) Completa Adaptable Automático (Captive Portal API / Comprobación 204) [2]
Samsung Android (Samsung Internet) Notificación push -> Mini-navegador Permitidas Permitidas Completa Adaptable Automático
Windows 10/11 (Navegador predeterminado) Inicio automático de navegador predeterminado Permitidas (Contexto completo del navegador) Permitidas Completa Adaptable Manual / Automático

Captive Portal personalizado: Guía de HTML y CSS - cna constraints comparison

Solución de código para la trampa del botón "Hecho" de Apple CNA

Uno de los fallos más frecuentes en el desarrollo de portales personalizados es la trampa del botón "Hecho" en dispositivos iOS. Cuando un usuario se autentica, el webview de Websheet de iOS debe detectar que la red ya no es cautiva. Lo hace supervisando el éxito de sus peticiones canarias en segundo plano.

Fundamentalmente, el CNA de iOS solo activará esta comprobación tras una navegación HTTP de página completa (redirección de ubicación). Si un desarrollador crea una Single Page Application (SPA) moderna que envía datos de formulario a través de una llamada AJAX asíncrona (por ejemplo, fetch() o Axios) y actualiza el DOM dinámicamente sin cambiar la URL, el CNA nunca volverá a ejecutar su comprobación de conectividad. El usuario se autenticará a nivel de pasarela, pero el botón del CNA en la esquina superior derecha seguirá apareciendo como "Cancelar". Si el usuario frustrado hace clic en "Cancelar", el dispositivo iOS se desasociará inmediatamente del SSID, terminando la sesión de WiFi [1].

Para evitar esto, el controlador de éxito de la autenticación debe realizar una redirección de página completa a una página de destino física (por ejemplo, window.location.href = '/success') o enviar el formulario de inicio de sesión de forma nativa a través de una acción HTTP POST estándar.

Guía de implementación

Para garantizar un renderizado coherente en todas las plataformas, los desarrolladores deben pasar de un diseño web moderno y cargado de recursos a un estilo de codificación defensivo y altamente autónomo.

La regla de oro: diseñar para una conectividad a internet nula

Durante el estado cautivo, el dispositivo cliente no tiene acceso a la red internet general. Solo puede resolver y acceder a direcciones IP y dominios explícitamente incluidos en la lista de permitidos (Walled Garden) del controlador inalámbrico (como la propia IP del servidor del Captive Portal). Por lo tanto, cualquier recurso externo referenciado en su HTML no se cargará, lo que provocará un diseño roto.

Para diseñar de forma defensiva, implemente la siguiente lista de comprobación de diseño de Captive Portal priorizando dispositivos móviles:

Captive Portal personalizado: Guía de HTML y CSS - mobile first checklist

1. Configuración de la ventana gráfica (Viewport)

Para evitar que los dispositivos móviles reduzcan la escala de la ventana gráfica a un ancho de escritorio (normalmente 980px), el <head> del HTML debe incluir una etiqueta meta de viewport receptiva. Sin esto, el texto y los campos de entrada aparecerán microscópicos en los dispositivos móviles:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

2. Integración de CSS y eliminación de dependencias externas

Nunca enlace a archivos CSS externos o CDN (por ejemplo, Bootstrap, Tailwind o Google Fonts). Todo el CSS debe estar incrustado dentro de un bloque <style> en el <head> del HTML.

Para la tipografía, utilice una pila de fuentes del sistema que haga referencia a fuentes locales del sistema operativo preinstaladas. Esto evita por completo las solicitudes HTTP y garantiza que la página se cargue instantáneamente utilizando la tipografía sans-serif nativa y de alta calidad del dispositivo:

body {
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
    background-color: #F5F1ED; /* Color de marca Pearl White */
    color: #011638; /* Color de marca Dark Blue */
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    min-height: 100vh;
}

3. Codificación de recursos en Base64

No se debe hacer referencia a imágenes, logotipos e iconos a través de URL HTTP externas a menos que el dominio de alojamiento esté incluido en la lista de permitidos (walled garden) de la pasarela. El método más fiable consiste en codificar los recursos visuales pequeños (como logotipos PNG o SVG) directamente en el HTML o CSS como Data URI Base64:

<!-- Ejemplo de logotipo Base64 integrado -->
<img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiByPSI0MCIgZmlsbD0iIzc0NThGRCIvPjwvc3ZnPg==" alt="Logo de Purple" class="brand-logo">

4. Optimización de campos de entrada y objetivos táctiles

Para cumplir con los estándares de usabilidad móvil (como las Directrices de interfaz humana de Apple), todos los elementos interactivos deben optimizarse para la entrada táctil:

  • Tamaño de fuente de entrada: El tamaño de la fuente del texto de entrada debe ser de al menos 16 px. Si el tamaño de la fuente es menor (por ejemplo, 14 px), iOS Safari y el CNA ampliarán automáticamente el campo de entrada al enfocarlo, lo que distorsionará el diseño de la página [1].
  • Objetivos táctiles: Los botones, casillas de verificación y enlaces deben tener un área de objetivo táctil mínima de 44 px x 44 px para evitar clics accidentales o la frustración del usuario.

Al capturar datos de invitados (por ejemplo, correo electrónico, número de teléfono o perfiles sociales), la estructura HTML debe admitir el consentimiento legal explícito. Según el GDPR, las casillas de verificación premarcadas o las declaraciones de consentimiento implícito (por ejemplo, "Al iniciar sesión, acepta nuestros términos") no cumplen con la normativa [3].

  • Proporcione una casilla de verificación desmarcada por defecto para los Términos y condiciones y las Políticas de privacidad.
  • Envuelva el texto legal detallado en un contenedor de altura limitada y desplazable (max-height: 120px; overflow-y: auto;) para mantener el formulario de inicio de sesión principal visible en la pantalla de inicio.
<div class="consent-container">
    <input type="checkbox" id="terms_consent" name="terms_consent" required>
    <label for="terms_consent">
        Acepto explícitamente las <a href="#" onclick="showTerms()">Condiciones del servicio</a> y doy mi consentimiento para el tratamiento de mis datos de acuerdo con la <a href="#" onclick="showPrivacy()">Política de privacidad</a>.
    </label>
</div>

¿Tiene preguntas sobre su configuración específica?

Nuestro equipo trabaja con operadores de recintos, responsables de TI e ingenieros de redes en 80 000 espacios. Reserve una llamada de 20 minutos y le mostraremos cómo lo han solucionado otros profesionales como usted.

Plantilla HTML/CSS personalizada de Captive Portal

A continuación, se muestra una plantilla HTML/CSS completa de un solo archivo, lista para producción, que incorpora todas las mejores prácticas para móviles y conformes con CNA. Cuenta con un diseño adaptativo, una pila de fuentes del sistema, marcadores de posición listos para Base64, entradas táctiles y estructuras de consentimiento explícitas que cumplen con el GDPR:

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <title>Inicio de sesión WiFi de invitados</title>
    <style>
        /* Restablecimiento de CSS y declaraciones de variables */
        :root {
            --color-primary: #7458FD; /* Color de la marca Purple */
            --color-dark: #011638; /* Azul oscuro */
            --color-light: #F5F1ED; /* Blanco perla */
            --color-white: #FFFFFF;
            --color-border: #D1D5DB;
            --radius-container: 12px;
            --radius-element: 6px;
        }
        
        * {
            box-sizing: border-box;
            -webkit-tap-highlight-color: transparent;
        }
        
        body {
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
            background-color: var(--color-light);
            color: var(--color-dark);
            margin: 0;
            padding: 20px;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            min-height: 100vh;
        }
        
        /* Diseño de tarjeta adaptativo */
        .portal-card {
            background-color: var(--color-white);
            width: 100%;
            max-width: 420px;
            padding: 32px 24px;
            border-radius: var(--radius-container);
            box-shadow: 0 4px 20px rgba(1, 22, 56, 0.05);
            text-align: center;
        }
        
        .logo-container {
            margin-bottom: 24px;
        }
        
        /* Marcador de posición de logotipo en Base64 integrado */
        .logo {
            width: 120px;
            height: auto;
        }
        
        h1 {
            font-size: 24px;
            font-weight: 700;
            margin: 0 0 8px 0;
            color: var(--color-dark);
        }
        
        p {
            font-size: 14px;
            color: #4B5563;
            margin: 0 0 24px 0;
            line-height: 1.5;
        }
        
        /* Estilos del formulario */
        .form-group {
            text-align: left;
            margin-bottom: 16px;
        }
        
        label {
            display: block;
            font-size: 14px;
            font-weight: 600;
            margin-bottom: 6px;
            color: var(--color-dark);
        }
        
        /* Crítico: el tamaño de fuente debe ser de al menos 16px para evitar el zoom automático en iOS */
        input[type="email"],
        input[type="text"] {
            width: 100%;
            height: 48px;
            padding: 12px 16px;
            font-size: 16px;
            border: 1px solid var(--color-border);
            border-radius: var(--radius-element);
            background-color: var(--color-white);
            color: var(--color-dark);
            outline: none;
            transition: border-color 0.2s;
        }
        
        input[type="email"]:focus,
        input[type="text"]:focus {
            border-color: var(--color-primary);
            box-shadow: 0 0 0 3px rgba(116, 88, 253, 0.15);
        }
        
        /* Estilos de consentimiento */
        .consent-group {
            display: flex;
            align-items: flex-start;
            text-align: left;
            margin: 20px 0;
        }
        
        /* Tamaño del área táctil optimizado para móviles */
        input[type="checkbox"] {
            width: 20px;
            height: 20px;
            margin: 2px 12px 0 0;
            flex-shrink: 0;
            cursor: pointer;
            accent-color: var(--color-primary);
        }
        
        .consent-label {
            font-size: 13px;
            line-height: 1.4;
            color: #4B5563;
            user-select: none;
        }
        
        .consent-label a {
            color: var(--color-primary);
            text-decoration: none;
            font-weight: 600;
        }
        
        .consent-label a:hover {
            text-decoration: underline;
        }
        
        /* Touch-Friendly CTA Button (Minimum 44px height) */
        .btn-submit {
            width: 100%;
            height: 48px;
            background-color: var(--color-primary);
            color: var(--color-white);
            border: none;
            border-radius: var(--radius-element);
            font-size: 16px;
            font-weight: 600;
            cursor: pointer;
            transition: background-color 0.2s;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .btn-submit:hover {
            background-color: #5B3EE3;
        }
        
        .btn-submit:active {
            background-color: #4A2FD4;
        }
        
        /* Legal Terms Scrollbox */
        .terms-scrollbox {
            display: none; /* Toggled via JS */
            text-align: left;
            font-size: 11px;
            color: #6B7280;
            background-color: var(--color-light);
            padding: 12px;
            border-radius: var(--radius-element);
            max-height: 100px;
            overflow-y: auto;
            margin-bottom: 16px;
            border: 1px solid var(--color-border);
        }
        
        .footer {
            margin-top: 24px;
            font-size: 11px;
            color: #9CA3AF;
        }
    </style>
</head>
<body>

    <div class="portal-card">
        <div class="logo-container">
            <!-- Replace src with your actual Base64-encoded SVG or PNG -->
            <svg class="logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 30">
                <rect width="100" height="30" rx="6" fill="#7458FD"/>
                <text x="50" y="20" font-family="sans-serif" font-size="12" fill="#FFFFFF" font-weight="bold" text-anchor="middle">SU MARCA</text>
            </svg>
        </div>
        
        <h1>Le damos la bienvenida a Guest WiFi</h1>
        <p>Introduzca sus datos a continuación para obtener un acceso seguro y de alta velocidad a Internet.</p>
        
        <!-- Form must submit natively (full page navigation) to clear Apple CNA -->
        <form action="/login/submit" method="POST" onsubmit="return validateForm()">
            <div class="form-group">
                <label for="guest_name">Nombre completo</label>
                <input type="text" id="guest_name" name="name" placeholder="Juan Pérez" required autocomplete="name">
            </div>
            
            <div class="form-group">
                <label for="guest_email">Dirección de correo electrónico</label>
                <input type="email" id="guest_email" name="email" placeholder="juan@ejemplo.com" required autocomplete="email">
            </div>
            
            <div class="consent-group">
                <input type="checkbox" id="terms_consent" name="terms_accepted" required>
                <label for="terms_consent" class="consent-label">
                    Acepto los <a href="#" onclick="toggleTerms(event)">Términos de servicio</a> y doy mi consentimiento para el tratamiento de datos de conformidad con el reglamento GDPR.
                </label>
            </div>
            
            <div id="terms_box" class="terms-scrollbox">
                <strong>Términos de servicio de WiFi:</strong><br>
                1. Este servicio se proporciona tal cual, sin garantías.<br>
                2. Los usuarios no deben realizar actividades ilegales que consuman mucho ancho de banda.<br>
                3. Los datos personales se recopilan exclusivamente para la autenticación y la aceptación de comunicaciones de marketing, de conformidad con nuestra Política de privacidad.
            </div>
            
            <button type="submit" class="btn-submit">Conectarse a WiFi</button>
        </form>
        
        <div class="footer">
            Tecnología de Purple | Secure Guest WiFi
        </div>
    </div>

    <script>
        function toggleTerms(e) {
            e.preventDefault();
            var box = document.getElementById('terms_box');
            box.style.display = (box.style.display === 'block') ? 'none' : 'block';
        }
        
        function validateForm() {
            var consent = document.getElementById('terms_consent');
            if (!consent.checked) {
                alert('Debe aceptar los Términos de servicio para conectarse.');
                return false;
            }
            return true;
        }
    </script>
</body>
</html>

Solución de problemas y mitigación de riesgos

Al implementar Captive Portals con código HTML/CSS personalizado, los equipos de operaciones de TI suelen encontrarse con varios riesgos operativos graves:

1. El bucle de advertencia de certificados SSL/TLS

Debido a que los Captive Portals funcionan interceptando el tráfico, presentan un conflicto fundamental con la seguridad web HTTPS moderna. Cuando un usuario intenta visitar un sitio HTTPS (por ejemplo, https://www.google.com) y la puerta de enlace intenta redirigir ese tráfico a un Captive Portal HTTP, el navegador detecta una discrepancia en el certificado SSL y muestra una advertencia de seguridad crítica de "La conexión no es privada".

  • Mitigación: Nunca intente interceptar el tráfico HTTPS directamente. Confíe plenamente en el asistente CNA nativo del sistema operativo (que realiza una solicitud HTTP no cifrada para activar la redirección). Asegúrese de que el dominio de su Captive Portal tenga un certificado SSL válido y de confianza pública (por ejemplo, Let's Encrypt o DigiCert) y que se sirva a través de HTTPS solo después de que la redirección HTTP inicial haya dirigido correctamente al usuario al dominio de su portal [2].

2. Fallos de resolución DNS (la trampa del jardín vallado)

Si su página HTML personalizada hace referencia a recursos externos (como un endpoint de OAuth para inicio de sesión social, por ejemplo, Facebook, Google, o una pasarela de pago), las solicitudes DNS para estos dominios fallarán a menos que estén explícitamente en la lista blanca en el Walled Garden del controlador inalámbrico. Si falta un dominio en la lista blanca, el flujo de inicio de sesión se detendrá, mostrando una pantalla en blanco.

  • Mitigación: Mantenga una lista de Walled Garden estricta y mínima. Si utiliza inicios de sesión sociales, incluya en la lista blanca los dominios con comodines específicos recomendados por los proveedores de identidad (por ejemplo, *.google.com, *.gstatic.com).

3. Vulnerabilidades de tiempo de espera de sesión y suplantación de MAC

Los portales cautivos estándar autentican los dispositivos en función de sus direcciones MAC. Sin embargo, los sistemas operativos móviles modernos (iOS 14+ y Android 10+) utilizan direcciones MAC aleatorias (direcciones WiFi privadas) de forma predeterminada, rotándolas periódicamente. Esto puede hacer que se solicite repetidamente a los invitados que se vuelvan a autenticar, destruyendo la experiencia del usuario [1].

  • Mitigación: Implemente tiempos de espera de sesión razonables (por ejemplo, 24 horas) en el servidor RADIUS para evitar sesiones inactivas, y utilice estándares de autenticación modernos como Passpoint (Hotspot 2.0) o WPA3-Enterprise para una incorporación fluida y segura que evite por completo los portales cautivos basados en MAC.

Relevancia del producto Purple: Desarrollar frente a comprar

Aunque codificar una sola página HTML es sencillo, alojar, proteger y escalar una infraestructura de portal cautivo personalizada presenta enormes obstáculos técnicos y de cumplimiento. La siguiente tabla compara las realidades operativas y de ingeniería de alojar usted mismo un portal personalizado frente a utilizar la plataforma empresarial gestionada de Purple:

Característica / Requisito operativo Portal personalizado alojado por el usuario Plataforma Purple Enterprise WiFi
Personalización de HTML/CSS Codificación totalmente manual, subiendo archivos a puntos de acceso individuales o servidores web locales. Editor para desarrolladores de píxel perfecto que permite inyecciones personalizadas de HTML/CSS, combinado con un constructor visual de arrastrar y soltar.
Infraestructura RADIUS Debe implementar, configurar y mantener servidores FreeRADIUS o Cloud RADIUS de alta disponibilidad [4]. RADIUS nativo de la nube, distribuido globalmente e integrado con redundancia activo-activo y SLA de tiempo de actividad del 99,99 %.
Soporte para puntos de acceso de múltiples proveedores Se requieren scripts de integración personalizados para cada proveedor de hardware (Cisco, Aruba, Meraki, Ruckus) [5]. Integración nativa y directa con más de 200 modelos de hardware; despliegue de portal unificado en parques de hardware mixto.
Privacidad de datos y cumplimiento El establecimiento asume el 100 % de la responsabilidad legal para el cumplimiento de GDPR, CCPA y PCI DSS, incluido el cifrado seguro de bases de datos y los flujos de trabajo de eliminación de datos. Totalmente conforme por diseño. Gestión de consentimiento integrada, solicitudes automatizadas de eliminación de interesados y alojamiento seguro con certificación ISO 27001.
Analytics & Marketing Requiere la creación de canalizaciones personalizadas de ingesta de datos y la integración de herramientas de marketing de terceros. Panel de analítica de nivel empresarial con seguimiento de afluencia en tiempo real, métricas de tasa de retorno y activadores de campañas de marketing automatizadas [6].
Integraciones de proveedores de identidad Integraciones manuales de OAuth2 con Google, Facebook, Apple y pasarelas de SMS locales. Integraciones en un solo clic con las principales plataformas sociales, pasarelas de SMS y Azure AD / Okta para invitados corporativos.

La plataforma de Purple resuelve el dilema entre "Construir o Comprar". Proporciona a los desarrolladores la total libertad creativa de un espacio de trabajo HTML/CSS personalizado, al tiempo que elimina la compleja ingeniería de infraestructura de backend de alto riesgo necesaria para admitir la autenticación RADIUS segura a escala.

ROI e impacto empresarial

Invertir en un Captive Portal personalizado, adaptativo y diseñado profesionalmente ofrece rendimientos cuantificables en las operaciones de TI, el marketing y el cumplimiento legal.

1. Reducción de costes operativos (tickets de soporte de TI)

En despliegues a gran escala, como un estadio o una cadena minorista con múltiples ubicaciones, un Captive Portal que no funciona es una de las principales causas de derivaciones al soporte de TI. Cuando los invitados se encuentran con una "pantalla en blanco" o un botón de inicio de sesión que no responde, saturan al personal de las instalaciones o envían tickets de soporte.

$$\text{Ahorro anual en soporte} = (\text{Total de visitas anuales de invitados} \times \text{Tasa de fallo del portal} \times \text{Tasa de contacto con soporte}) \times \text{Coste por ticket de soporte}$$

  • Escenario: Un centro de convenciones con 1.000.000 de visitantes anuales. Un portal mal codificado tiene una tasa de fallo del 5% en dispositivos iOS más antiguos, lo que genera una tasa de contacto con soporte del 10%. Con un coste estándar del sector de 15 $ por ticket de soporte, el coste operativo es: $$(1.000,000 \times 0,05 \times 0,10) \times $15 = $75.000 \text{ anuales en gastos de soporte evitables}$$
  • Resultado: La transición a una plantilla optimizada para CNA y centrada en dispositivos móviles reduce la tasa de fallo del portal a <0,1%, eliminando prácticamente este desgaste operativo.

2. Captación de datos de marketing y optimización de suscripciones

Para los establecimientos minoristas y de hostelería, el portal WiFi para invitados es el mecanismo principal para capturar datos de clientes propios y limpios. Una interfaz de usuario mal diseñada con texto microscópico o un diseño de formulario engorroso provoca altas tasas de rebote: los usuarios abandonan el proceso de inicio de sesión por completo, lo que se traduce en oportunidades de marketing perdidas.

  • Caso de estudio (comercio minorista): Una cadena minorista nacional implementó un Captive Portal optimizado para dispositivos móviles utilizando la plataforma de Purple. Al reemplazar un formulario de inicio de sesión de varios pasos con un campo de entrada de correo electrónico único (font-size: 16px) y un botón optimizado con un área de pulsación de 48px, observaron un incremento del 42% en los registros completados y un incremento del 28% en las suscripciones a boletines de marketing dentro del primer trimestre [6].

3. Mitigación de riesgos legales y regulatorios

Bajo el GDPR y la CCPA, la recopilación de datos que no cumpla con las normativas acarrea graves sanciones financieras (hasta el 4% de la facturación anual global bajo el GDPR). Confiar en casillas de verificación previamente marcadas o no proporcionar una Política de Privacidad clara y de fácil acceso en su página de bienvenida expone a la empresa a una inmensa responsabilidad legal.

  • ROI de la mitigación: La implementación de una casilla de consentimiento explícita y sin marcar, junto con el alojamiento de las condiciones dentro de un cuadro de desplazamiento optimizado, garantiza el cumplimiento normativo al 100%, mitigando el riesgo de multas reguladoras multimillonarias y protegiendo la reputación de la marca.

Resumen de conclusiones clave

  • El Sandbox de CNA es restrictivo: La Websheet de Apple iOS y el CNA de macOS son entornos altamente aislados en sandbox que bloquean recursos externos, cookies y fuentes web. Todo el estilo y los recursos deben ser autónomos (CSS en línea, imágenes Base64, fuentes del sistema) [1].
  • AJAX interrumpe el saludo de salida de iOS: Para realizar con éxito la transición del dispositivo iOS de "cautivo" a "conectado" (cambiando el botón superior derecho de "Cancelar" a "Listo"), debe activar una redirección HTTP de página completa. Las actualizaciones asíncronas del DOM dejarán al dispositivo en un bucle cautivo.
  • El enfoque móvil primero es obligatorio: Más del 90% de los inicios de sesión se realizan en dispositivos móviles. Diseñe un diseño de una sola columna (ancho máximo: 480px), utilice objetivos táctiles fáciles de pulsar (mínimo 44px x 44px) y aplique un tamaño de fuente mínimo de 16px en todos los campos de entrada de texto para evitar el zoom automático del navegador de iOS.
  • Los jardines vallados controlan el DNS: Cualquier dominio externo referenciado durante el inicio de sesión (por ejemplo, las API de inicio de sesión social) debe estar explícitamente en la lista blanca en el jardín vallado del controlador inalámbrico, o de lo contrario la página no se cargará.
  • Purple elimina la complejidad del backend: El uso del creador de portales de Purple ofrece a los desarrolladores un control total de HTML/CSS a través de un editor personalizado, al tiempo que delega las inmensas cargas de seguridad, escalabilidad y cumplimiento normativo de RADIUS, las integraciones de AP de múltiples proveedores y la gestión de bases de datos conforme al GDPR [3].

Referencias


Escuche la sesión técnica informativa

Escuche a un arquitecto de soluciones sénior analizar las limitaciones técnicas y las estrategias de implementación para portales cautivos personalizados:

Definiciones clave

Captive Portal

Una página web que se muestra a los usuarios recién conectados de una red WiFi antes de que se les conceda un acceso más amplio a los recursos de la red, utilizada habitualmente para la autenticación, el pago o la visualización de las condiciones del servicio.

Los equipos de TI despliegan portales cautivos a nivel de pasarela para controlar el acceso de invitados, capturar datos de usuarios y hacer cumplir el cumplimiento legal.

Captive Network Assistant (CNA)

Un mini-navegador en un entorno aislado y muy restringido que los sistemas operativos (como Apple iOS y macOS) abren automáticamente al detectar una redirección de red cautiva, diseñado exclusivamente para facilitar la autenticación en el portal.

Las vistas web de CNA imponen limitaciones estrictas, incluido el bloqueo de CDNs externas, cookies persistentes y almacenamiento local, lo que con frecuencia rompe los diseños web estándar.

Walled Garden

Una lista restringida de direcciones IP, subredes o nombres de dominio a los que se permite acceder a un usuario invitado no autenticado a través de la pasarela antes de completar el proceso de inicio de sesión en el Captive Portal.

Los desarrolladores deben asegurarse de que cualquier recurso externo (como las APIs de inicio de sesión social o las pasarelas de pago) esté incluido en la lista de permitidos del walled garden para evitar que el flujo de inicio de sesión se detenga.

Codificación Base64

Un esquema de codificación de binario a texto que representa datos binarios (como imágenes) como una cadena ASCII, lo que permite incrustar recursos directamente en documentos HTML o CSS.

El uso de la codificación Base64 para logotipos e iconos elimina las solicitudes HTTP externas, lo que garantiza que los recursos se procesen perfectamente en entornos CNA sin conexión.

RADIUS (Remote Authentication Dial-In User Service)

Un protocolo de red que proporciona una gestión centralizada de autenticación, autorización y contabilidad (AAA) para los usuarios que se conectan y utilizan un servicio de red.

El servidor del Captive Portal se comunica con un servidor RADIUS para autorizar la dirección MAC del invitado en la pasarela de red una vez que se cumplen los criterios de autenticación.

Pila de fuentes del sistema

Una declaración font-family de CSS que prioriza las fuentes preinstaladas del sistema operativo (como San Francisco en iOS, Segoe UI en Windows y Roboto en Android) frente a las fuentes web externas.

La implementación de una pila de fuentes del sistema garantiza un renderizado tipográfico inmediato sin activar solicitudes HTTP externas bloqueadas a servicios como Google Fonts.

Canary URL

Una URL HTTP dedicada y no cifrada que mantienen los proveedores de sistemas operativos (por ejemplo, captive.apple.com) para comprobar si un dispositivo tiene conectividad a internet sin restricciones.

El gestor de red en segundo plano del sistema operativo comprueba esta URL para detectar la presencia de un Captive Portal y activar la ventana emergente de la CNA.

Passpoint (Hotspot 2.0)

Un estándar del sector desarrollado por la WiFi Alliance que permite a los dispositivos móviles descubrir de forma automática y autenticarse de manera segura en puntos de acceso WiFi, evitando los inicios de sesión manuales en un Captive Portal.

Las empresas utilizan Passpoint junto con plataformas como Purple para que los invitados dejen atrás las pantallas de bienvenida con fricciones y disfruten de experiencias de roaming seguras y fluidas, similares a las de las redes móviles.

Ejemplos prácticos

Una cadena hotelera de lujo de 250 habitaciones [Hospitality](/industries/hospitality) desea implementar una página de inicio de sesión de WiFi para invitados personalizada que se adapte perfectamente a las directrices de su marca premium. Su agencia creativa diseñó una página de bienvenida utilizando tipografía de marca personalizada (alojada en Adobe Fonts), múltiples imágenes de fondo de alta resolución (alojadas en un contenedor público de AWS S3) y un asistente animado de JavaScript de varios pasos. Al implementarlo, los invitados de iOS se conectan al SSID, pero el portal aparece como una pantalla blanca en blanco y los usuarios no pueden autenticarse.

Para resolver la pantalla en blanco y el diseño de marca roto, debemos reestructurar la arquitectura frontend del portal para cumplir con las restricciones del sandbox de Apple CNA:

  1. Remediación de tipografía: Dado que Adobe Fonts requiere una solicitud HTTP externa que está bloqueada por el CNA, reemplazamos la llamada a la fuente personalizada con una pila de fuentes del sistema nativa y premium (font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;). Esto garantiza una representación instantánea sin llamadas a redes externas.
  2. Optimización de recursos: Las imágenes de fondo en AWS S3 están bloqueadas porque S3 no está en el walled garden de la puerta de enlace. Comprimimos el logotipo principal de la marca, lo convertimos en un SVG ligero y lo codificamos directamente en el HTML como un URI de datos Base64. Para el fondo, reemplazamos las imágenes pesadas con un degradado CSS limpio y adaptativo que utiliza los colores de la marca del hotel, reduciendo significativamente el peso de la página.
  3. Simplificación de JavaScript: El asistente animado de varios pasos depende de bibliotecas externas de jQuery y GSAP. Eliminamos estas dependencias externas y refactorizamos el formulario en una estructura HTML de una sola columna y una sola página. La validación del formulario se reescribe en JavaScript nativo y ligero.
  4. Apretón de manos de autenticación: El envío del formulario se modifica de un envío basado en AJAX a un <form action="/submit" method="POST"> de HTML nativo para activar una redirección de página completa, lo que permite que el Websheet de iOS ejecute su comprobación de canary y muestre el botón "Listo".
Comentario del examinador: Este escenario representa el conflicto clásico entre el diseño creativo de alta gama y las estrictas restricciones de seguridad de las vistas web cautivas. Las agencias creativas suelen tratar el Captive Portal como un sitio web de escritorio estándar. Sin embargo, debido a que el dispositivo se encuentra en un estado de preautenticación, la red bloquea todo el tráfico externo. Al integrar el CSS, usar fuentes del sistema, codificar los recursos en Base64 y utilizar envíos de formularios nativos, preservamos la estética premium de la marca al tiempo que logramos una fiabilidad operativa del 100% en dispositivos iOS y Android.

Una cadena minorista nacional [Retail](/industries/retail) con 450 tiendas desea capturar los correos electrónicos de los invitados a través de páginas de bienvenida de WiFi para alimentar su CRM. Requieren que los invitados den su consentimiento para recibir boletines informativos de marketing. El diseño inicial tiene una casilla de verificación previamente marcada que dice "Acepto recibir correos electrónicos de marketing". Además, el portal está alojado en un único servidor local en su sede. Durante las horas de mayor actividad (sábado por la tarde), los invitados de todo el país experimentan retrasos graves y muchos no pueden cargar la página de inicio de sesión, lo que provoca una caída masiva en las tasas de captura de datos.

Debemos abordar tanto la infracción de cumplimiento normativo como el cuello de botella en la infraestructura:

  1. Corrección del cumplimiento: Bajo el GDPR y la CCPA, las casillas de consentimiento marcadas previamente son ilegales. Modificamos el HTML para que la casilla de consentimiento de marketing no esté marcada por defecto (<input type="checkbox" id="marketing_consent">). También añadimos una casilla obligatoria y separada para las Condiciones del servicio para desvincular el acuerdo legal del consentimiento de marketing.
  2. Escalado de la infraestructura: Alojar un Captive Portal nacional en un único servidor centralizado crea un punto único de fallo y un enorme cuello de botella en la latencia. Migramos el frontend del portal a una red de distribución de contenidos (CDN) de alta disponibilidad y distribución global con almacenamiento en caché perimetral (edge-caching).
  3. Integración RADIUS: Configuramos los puntos de acceso de las tiendas locales para que apunten a un clúster RADIUS nativo de la nube con redundancia activo-activo, garantizando que las solicitudes de autenticación se procesen localmente en el extremo con una latencia inferior a 50 ms, incluso durante los picos de tráfico de los sábados.
  4. Migración a Purple: Para eliminar toda esta carga de ingeniería, el minorista se migra a Purple. Las herramientas integradas de consentimiento de GDPR de Purple gestionan automáticamente las altas que cumplen la normativa, y su infraestructura en la nube distribuida globalmente gestiona millones de autenticaciones diarias con un tiempo de actividad del 99.99%, resolviendo por completo el cuello de botella de escalado.
Comentario del examinador: Las casillas de consentimiento marcadas previamente representan un grave riesgo de cumplimiento que puede derivar en multas regulatorias masivas. Desvincular el consentimiento de marketing de las Condiciones del servicio es una práctica recomendada tanto técnica como legal. Por el lado de la infraestructura, el alojamiento centralizado de los portales cautivos es un antipatrón. Una presencia comercial a nivel nacional requiere un frontend descentralizado con caché en el extremo combinado con un backend RADIUS nativo de la nube. Migrar a una plataforma gestionada como Purple elimina esta complejidad arquitectónica, lo que permite al minorista centrarse en las campañas de marketing en lugar de en el escalado de bases de datos.

Preguntas de práctica

Q1. Un equipo de TI de un gran aeropuerto internacional [Transport](/industries/transport) despliega un Captive Portal con código personalizado. Observan que, mientras que los usuarios de Android se conectan sin problemas, una parte importante de los usuarios de iOS experimenta un problema por el cual se autentican correctamente pero no pueden navegar por la web. Al examinarlo más de cerca, los dispositivos iOS muestran que están conectados al SSID, pero el botón superior derecho de la ventana emergente cautiva sigue indicando "Cancelar" en lugar de "Listo". ¿Cuál es la causa principal de este problema y cómo debería solucionarlo el desarrollador?

Sugerencia: Analice cómo el asistente de la CNA de Apple detecta que una red ha pasado de cautiva a autenticada y qué acción del navegador es necesaria para activar esta comprobación.

Ver respuesta modelo

La causa principal es que la página de éxito del portal actualiza la interfaz de usuario de forma dinámica mediante JavaScript (enrutamiento AJAX/SPA) en lugar de realizar una navegación HTTP de página completa. El mini-navegador del Captive Network Assistant (CNA) de Apple iOS solo vuelve a ejecutar su comprobación de conectividad en segundo plano (la solicitud de prueba a captive.apple.com) cuando se produce una redirección o navegación de URL de página completa. Si el desarrollador envía el formulario de inicio de sesión mediante AJAX y simplemente muestra un mensaje de "Éxito" en el DOM, la CNA no se entera de que la red se ha desbloqueado. Por consiguiente, el botón superior derecho sigue indicando "Cancelar". Si el usuario hace clic en "Cancelar" para salir, el sistema operativo asume que el inicio de sesión ha fallado y se desconecta de la red WiFi.

Solución: El desarrollador debe modificar el controlador de éxito de la autenticación para forzar una redirección de página completa. Esto se puede lograr enviando el formulario de inicio de sesión de forma nativa a través de un elemento HTML estándar <form action="/submit" method="POST"> o ejecutando window.location.href = '/success_landing_page' en JavaScript una vez que la API devuelva una respuesta de autenticación correcta. Esto activa la carga de página completa requerida, lo que obliga al asistente de la CNA a volver a evaluar el estado de la red, verificar que la Canary URL es ahora accesible y cambiar el botón superior derecho a "Listo".

Q2. Un equipo de operaciones de un estadio [Events] desea lanzar una red WiFi de invitados que recopile consentimientos de marketing. El responsable de cumplimiento normativo insiste en que el portal debe cumplir al 100 % con el GDPR. El equipo de desarrollo presenta una maqueta en la que el formulario de inicio de sesión tiene una casilla premarcada que dice "Acepto las Condiciones de servicio y doy mi consentimiento para recibir boletines de marketing". ¿Por qué este diseño no cumple con la normativa y cómo se debería reestructurar el HTML/CSS y el formulario para cumplir con el GDPR manteniendo una alta tasa de conversión?

Sugerencia: Tenga en cuenta los estrictos requisitos del GDPR relativos al consentimiento explícito, la separación de la aceptación de marketing de las condiciones de servicio y la visibilidad física de los textos legales en las pantallas de los móviles.

Ver respuesta modelo

El diseño propuesto infringe el GDPR en dos aspectos principales: en primer lugar, las casillas de verificación premarcadas no constituyen un consentimiento válido, el cual debe ser libre, específico, informado e inequívoco. En segundo lugar, vincular el consentimiento de marketing con la aceptación de las Condiciones del servicio no cumple con la normativa; no se puede obligar a un usuario a aceptar correos electrónicos de marketing como condición para utilizar el servicio WiFi.

Estrategia de refactorización:

  1. Desvincular el consentimiento: Divida la casilla de verificación en dos casillas distintas. La casilla A es obligatoria y cubre las Condiciones del servicio y la Política de privacidad. La casilla B es opcional y cubre la suscripción al boletín de marketing.
  2. Establecer como no marcadas: Asegúrese de que ambas casillas estén desmarcadas por defecto en el HTML (omitiendo el atributo checked).
  3. Visibilidad CSS: Dado que más del 90% de los usuarios se conectan desde dispositivos móviles, coloque las casillas de verificación justo encima del botón "Conectar" para que sean visibles en la parte superior sin necesidad de hacer scroll. Utilice una pila de fuentes del sistema y configure el tamaño de fuente de la etiqueta a 14px con una altura de línea de 1.4 para mejorar la legibilidad.
  4. Cuadro de desplazamiento de condiciones: Para evitar que el texto legal desplace los elementos del formulario fuera de la pantalla, coloque las Condiciones del servicio detalladas en un contenedor con desplazamiento y altura fija (max-height: 100px; overflow-y: auto; background-color: #F5F1ED; border: 1px solid #D1D5DB; border-radius: 6px;) que se pueda abrir o cerrar mediante un enlace de texto. Esto mantiene un diseño limpio y de alta conversión, al tiempo que garantiza el cumplimiento legal absoluto.

Q3. Una cadena de tiendas [Retail](/industries/retail) está desplegando una página de inicio con código personalizado en 100 establecimientos. El diseñador utilizó Google Fonts (Montserrat) y enlazó a una hoja de estilo Bootstrap alojada en CDN en el head del HTML. Durante las pruebas en una red corporativa, la página se visualiza correctamente. Sin embargo, cuando se despliega en un punto de acceso de prueba de una tienda con una configuración de red cautiva, la página se muestra con texto sin formato en Times New Roman, con la alineación rota y sin iconos. ¿Por qué ocurre esto y cómo deben refactorizarse los recursos?

Sugerencia: Analice el estado de la conexión de red antes de que un usuario se autentique y determine cómo maneja el navegador las solicitudes HTTP externas a dominios fuera del walled garden.

Ver respuesta modelo

Este fallo se produce porque el dispositivo se encuentra en un estado cautivo no autenticado cuando se carga la página de inicio. En este estado, la puerta de enlace inalámbrica bloquea todo el tráfico de internet saliente, permitiendo únicamente solicitudes a dominios explícitamente autorizados en el Walled Garden de la puerta de enlace. Dado que los dominios CDN de Bootstrap (cdn.jsdelivr.net) y Google Fonts (fonts.googleapis.com) no están en la lista blanca, las solicitudes del navegador para obtener la hoja de estilo y los archivos de fuentes fallan silenciosamente. En consecuencia, el navegador recurre a su motor de renderizado por defecto, lo que da como resultado un HTML sin estilos (texto en Times New Roman) y diseños rotos.

Estrategia de refactorización:

  1. CSS en línea: Elimine el enlace externo a la hoja de estilo de Bootstrap. Copie las reglas necesarias de CSS grid/flexbox directamente en un bloque <style> dentro del <head> de la página HTML. Esto garantiza que todas las instrucciones de diseño se entreguen en la carga inicial de la página única.
  2. Implementar pila de fuentes del sistema: Elimine la llamada a Google Fonts mediante @import o <link>. Reemplácela por una pila de fuentes nativas del sistema en el CSS (font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;). Esto obliga al dispositivo a utilizar fuentes de alta calidad que ya están preinstaladas en el sistema operativo, eliminando por completo la dependencia de una red externa.
  3. Codificar iconos/logotipos en Base64: Si el diseño depende de imágenes externas o librerías de iconos (como FontAwesome), convierta estos iconos a formato SVG e intégrelos en línea dentro del HTML o como URI de datos Base64 en el CSS. Esto garantiza que la página sea 100% autónoma y se visualice perfectamente incluso sin conectividad a internet.

Continúe leyendo esta serie

El portal de invitados de Ubiquiti UniFi no redirige: causas y soluciones

Esta guía aisla un fallo de redirección del portal de invitados de UniFi siguiendo en secuencia el estado del invitado, la redirección, la ruta de preautorización y la autorización del controlador. Proporciona a los equipos de TI de los establecimientos un método documentado para abordar la confusión entre red de invitados y Hotspot, las transferencias a portales externos, los requisitos actuales de la cuenta de UniFi OS y las pruebas de aislamiento de DNS.

Leer la guía →

La página splash de Cisco Meraki no funciona: diagrama de flujo de resolución de problemas

Esta guía práctica de soporte post-instalación aísla el punto exacto donde ha fallado un flujo de splash de Cisco Meraki: autorización del cliente, inicio de la redirección HTTP, accesibilidad del walled garden o inicio de sesión RADIUS. Proporciona a los equipos de TI de los establecimientos una ruta de evidencia controlada para restaurar el WiFi de invitados sin realizar cambios drásticos en toda la infraestructura en producción.

Leer la guía →

Guía de configuración de WiFi para invitados empresariales: segmentación de VLAN, seguridad y Captive Portals

Esta guía técnica muestra a los equipos de TI cómo configurar el WiFi para invitados como un servicio controlado de acceso a internet, mediante la segmentación de VLAN, políticas de firewall y un Captive Portal. También explica cómo los formularios de registro y los controles de incorporación de Purple admiten una experiencia de visitante proporcionada sin debilitar el límite en torno a los sistemas operativos, de pago y del personal.

Leer la guía →

¿Tiene preguntas sobre su configuración específica?

Nuestro equipo trabaja con operadores de recintos, responsables de TI e ingenieros de redes en 80 000 espacios. Reserve una llamada de 20 minutos y le mostraremos cómo lo han solucionado otros profesionales como usted.