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 limitaciones 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 milimétrica (pixel-perfect).

📖 11 min de lectura📝 2,731 palabras🔧 2 ejemplos resueltos3 preguntas de práctica📚 8 definiciones clave

Escucha esta guía

Ver transcripción del podcast
Captive Portal personalizado: Guía de HTML y CSS — Un informe técnico de Purple [INTRODUCTION] Bienvenido a la serie de informes técnicos de Purple. Hoy analizaremos a fondo algo que afecta a todas las implementaciones de WiFi para invitados: el Captive Portal. Específicamente, hablaremos sobre cómo escribir HTML y CSS limpios y confiables para una página de inicio de Captive Portal personalizada. Si alguna vez se ha conectado al WiFi de un hotel y se ha topado con una página de inicio rota (imágenes que faltan, texto sin estilo, un botón de inicio de sesión que no responde al tacto), ha experimentado lo que sucede 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 suceda a usted. Este informe está dirigido a desarrolladores frontend, diseñadores creativos y desarrolladores web que están creando un Captive Portal desde cero o personalizando una plantilla existente. Cubriremos la estructura HTML, las reglas CSS que importan, las limitaciones del mini-navegador Apple CNA que confunden incluso a los desarrolladores experimentados, y cómo las plataformas como el constructor de portales de Purple pueden eliminar por completo la mayor parte de esta complejidad. Comencemos. [TECHNICAL DEEP-DIVE] Primero, 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. Este es el Captive Portal. El usuario ve una página de bienvenida, completa una acción (ingresar un correo electrónico, aceptar términos, iniciar sesión a través de redes sociales) y luego la red otorga acceso completo a Internet. Lo fundamental es entender dónde se procesa esta página. En dispositivos iOS, se abre dentro del Captive Network Assistant de Apple (el CNA), que es una vista web (webview) de WebKit simplificada. No es Safari. No tiene cookies persistentes. No puede cargar recursos externos. Tiene un soporte limitado para JavaScript. Y se cierra en el momento en que el usuario cambia a otra aplicación. En macOS, el CNA se procesa a una resolución fija de 900 por 572 píxeles. En Android, los dispositivos modernos utilizan Chrome Custom Tabs, que son considerablemente más capaces. Windows 10 abre el navegador predeterminado del usuario. Los dispositivos Samsung utilizan Samsung Internet. Esta fragmentación de plataformas es la mayor fuente de fallas en los Captive Portals en producción. Los desarrolladores realizan pruebas en sus teléfonos Android, todo se ve genial y luego los huéspedes del hotel con iPhone ven una pantalla en blanco con texto sin estilo. Así que hablemos de cómo programar de forma defensiva. La regla de oro para el HTML y CSS de un Captive Portal es esta: 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 — una fuente de Google, una hoja de estilo alojada en un CDN, una biblioteca de JavaScript, la imagen de un logotipo — fallará silenciosamente o provocará un icono de carga que nunca se resolverá. Comenzando con la estructura HTML. Tu documento debe ser una página HTML5 limpia. En el head, necesitas una etiqueta meta viewport con el contenido configurado como width igual a device-width e initial-scale igual a uno. Esto no es negociable para la renderización móvil. Sin ella, iOS renderizará la página a 980 píxeles de ancho y la reducirá, haciendo que todo se vea microscópico. Tu CSS debe ser incorporado (inline), ya sea en un bloque de estilo dentro del elemento head, o como atributos de estilo inline en elementos individuales. No uses una hoja de estilo externa vinculada a través de una etiqueta de enlace. Esa hoja de estilo reside en tu servidor, al cual la red cautiva no puede acceder durante la autenticación. La página se renderizará completamente sin estilos. Para las fuentes, utiliza una pila de fuentes del sistema (system font stack). 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 utilices Google Fonts. La llamada de importación fallará y tu fuente de respaldo será Times New Roman, lo cual no es la experiencia de marca por la que tu cliente está pagando. Para las imágenes —tu logotipo, gráficos de fondo, elementos decorativos— tienes dos opciones. O bien, sírvelas 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, codifícalas como URIs de datos Base64 directamente en tu HTML o CSS. Esto elimina por completo la dependencia externa. Ahora hablemos del diseño de la página. Dado que más del noventa por ciento de los inicios de sesión de Captive Portal ocurren en dispositivos móviles, tu diseño debe ser mobile-first. 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. Usa flexbox en el elemento body: display flex, flex-direction column, align-items centre, justify-content centre, min-height 100 viewport height. Esto centra tu tarjeta de contenido vertical y horizontalmente en cualquier tamaño de pantalla. Tu botón de llamada a la acción (CTA) 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 un CTA principal, es mejor algo más cercano a los 48 píxeles de alto, de ancho completo dentro del contenedor y con un border-radius de aproximadamente 8 a 12 píxeles. Para los campos de formulario —entrada de correo electrónico, entrada de nombre— establece el font-size en al menos 16 píxeles. Esto es crítico. iOS Safari y el CNA se acercarán automáticamente (zoom) en cualquier campo de entrada con un font-size inferior a 16 píxeles, lo que romperá tu diseño cuidadosamente elaborado. Configurar 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. Bajo la regulación GDPR, si estás recopilando datos personales —incluso solo una dirección de correo electrónico— necesitas un consentimiento explícito e informado. Esto significa una casilla de verificación desmarcada por defecto, con una etiqueta visible que indique claramente a qué está dando su consentimiento el usuario. No marques previamente la casilla. La casilla de consentimiento en sí debe ser claramente visible sin necesidad de desplazarse. Ahora, un detalle de implementación crítico específicamente para iOS CNA. Cuando el usuario completa la autenticación, el CNA monitorea si el dominio cautivo se ha vuelto accesible. La verificació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 un redireccionamiento de página completo, el CNA nunca detectará que la autenticación se ha completado. Debes redireccionar a una nueva URL después de la autenticación: un redireccionamiento HTTP completo, 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, mantenlo al mínimo. El CNA tiene soporte de JS limitado y no tiene acceso a localStorage o sessionStorage. Cookies se destruyen cuando se cierra el CNA. Cualquier gestión de estado que dependa de estas APIs del navegador fallará. Los event listeners de JavaScript vanilla están bien. jQuery es una dependencia externa de 30 kilobytes que no se cargará. [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 de toque amigables, mínimo de 44 por 44 píxeles. Séptimo: diseño de una sola columna, ancho máximo de 480 píxeles. Octavo: redireccionamiento de página completa en la autenticación, no una actualización de estado de JavaScript. Noveno: casilla de consentimiento que cumpla con el 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 con más frecuencia en producción. Número uno: Google Fonts — elimina la importación, fallará. Número dos: librerías 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 un redireccionamiento posterior a la autenticación — el CNA no detectará la finalización de la autenticación. Ahora, una conversación honesta sobre desarrollar versus comprar. Desarrollar un captive portal personalizado desde cero significa que también eres responsable de la infraestructura del 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 constante 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 los desarrolladores que necesitan un control de píxel perfecto, al tiempo que gestiona toda la infraestructura del backend: la autenticación, la captura de datos, las analíticas, las herramientas de cumplimiento de GDPR y las integraciones de red con más de 200 proveedores 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 en línea son totalmente compatibles y preferibles a los PNG codificados en Base64 para los logotipos, ya que se escalan perfectamente en pantallas retina. ¿El CNA de macOS admite las mismas restricciones que el CNA de iOS? En general sí, con una diferencia: el CNA de macOS 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 depurado y autónomo, y lo insertas en línea en tu bloque de estilo. ¿Qué pasa con HTTPS? Tu Captive Portal debe ser servido a través de HTTP para que el redireccionamiento 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. El CNA de Apple y las webviews de Android imponen límites estrictos a los recursos externos, cookies, JavaScript y el estado de la sesión. La solución es crear páginas HTML autónomas con CSS en línea, fuentes del sistema, imágenes codificadas en Base64 y redireccionamientos de página completa al autenticarse. Para los operadores de establecimientos y equipos de TI que evalúan sus opciones: si tu requisito es un portal personalizado y con la marca completa con HTML y CSS a la medida, la elección es entre crear y mantener toda la arquitectura por ti mismo —lo cual es un compromiso de ingeniería sustancial— o usar una plataforma como Purple que ofrece 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í: revisa la documentación del editor de portales de Purple, audita tu portal existente con la lista de verificación móvil que cubrimos hoy y, si estás comenzando desde cero, utiliza la estructura de la plantilla HTML que describimos como base. Gracias por escucharnos y nos vemos en la próxima sesión.

📚 Part of our core series: La guía definitiva de Captive Portals

header_image.png

Resumen Ejecutivo

Para los establecimientos empresariales (que abarcan 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 para invitados es la puerta de entrada digital. Sin embargo, más del 90% de los inicios de sesión de WiFi para invitados ocurren en dispositivos móviles, donde la visualización no está a cargo de navegadores estándar como Safari o Chrome, sino de vistas web muy restringidas de Captive Network Assistant (CNA) [1]. Estos "mininavegadores" imponen estrictas limitaciones de sandbox: bloquean las CDN externas, desactivan las cookies persistentes, ignoran las fuentes web externas y restringen severamente la ejecución de JavaScript para mitigar los 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 roto, la pérdida de elementos de marca y botones de inicio de sesión que no funcionan, lo que afecta directamente la satisfacción del cliente y la interacción digital. Esta guía ofrece soluciones a estos desafíos, presentando prácticas de codificación defensiva (como CSS en línea, codificación de recursos en Base64, conjuntos de fuentes del sistema y protocolos de autenticación explícitos basados en la navegación) para garantizar una visualización multiplataforma fluida. 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 completo de HTML/CSS al tiempo que 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 que sea resistente, los desarrolladores deben comprender la interceptación a nivel de red y la virtualización del navegador que ocurren cuando un invitado se asocia a un SSID abierto.

El Ciclo de Vida del Captive Portal

Cuando un dispositivo cliente se asocia con un SSID cautivo, se activa la siguiente secuencia:

  1. Asociación de IP: El dispositivo completa un protocolo de enlace de 3 vías y solicita una dirección IP a través de DHCP.
  2. Prueba de Conectividad Activa: El administrador 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 LAN inalámbrica (WLC) o punto de acceso (AP) local intercepta esta solicitud HTTP del puerto 80. En lugar de devolver el estado HTTP 200 o 204 esperado, la puerta de enlace 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. Generación de Vista Web: Al detectar la redirección, el sistema operativo genera su mininavegador 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, el cual instruye a la puerta de enlace (a menudo a través de un RADIUS Access-Accept o una llamada de API externa) para autorizar la dirección MAC.
  5. Apretón de manos de salida de CNA: El mini-navegador del CNA realiza otro HTTP GET a su URL canario. Si recibe la respuesta 200/204 esperada, cambia su botón superior derecho de "Cancelar" a "Listo" y establece la conexión WiFi como la interfaz de red principal.

Restricciones del mini-navegador específicas de cada plataforma

Cada sistema operativo maneja este ciclo de vida dentro de diferentes entornos de webview, lo que resulta en un comportamiento altamente 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) Emergente de mini-navegador Bloqueadas (Destruidas al cerrar) Bloqueadas (Sin conexión) Limitada (Sin localStorage/sessionStorage) Responsivo (Ancho del dispositivo) Solo redireccionamiento HTTP de página completa [1]
Apple macOS CNA (Captive Network Assistant) Emergente de mini-navegador Bloqueadas Bloqueadas Limitada (Sin diálogos de alerta/confirmación) Fijas (900px x 572px) Solo redireccionamiento 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 walled garden) Completa Responsivo Automático (Captive Portal API / Verificación 204) [2]
Samsung Android (Samsung Internet) Notificación push -> Mini-navegador Permitidas Permitidas Completa Responsivo Automático
Windows 10/11 (Navegador predeterminado) Inicio automático del navegador predeterminado Permitidas (Contexto completo del navegador) Permitidas Completa Responsivo Manual / Automático

cna_constraints_comparison.png

Programación en torno a la trampa del botón "Listo" de Apple CNA

Uno de los modos de fallo más frecuentes en el desarrollo de portales personalizados es la "Trampa" del botón "Listo" en dispositivos iOS. Cuando un usuario se autentica, el webview Websheet de iOS debe detectar que la red ya no está cautiva. Hace esto monitoreando el éxito de sus solicitudes de fondo al canario.

Crucialmente, el CNA de iOS solo activará esta verificació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 de forma dinámica sin cambiar la URL, el CNA nunca volverá a ejecutar su verificación de conectividad. El usuario se autenticará a nivel de gateway, pero el botón del CNA en la esquina superior derecha seguirá apareciendo como "Cancel". Si el usuario frustrado hace clic en "Cancel", el dispositivo iOS se desasociará inmediatamente del SSID, finalizando la sesión de WiFi [1].

Para evitar esto, el controlador de éxito de 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 uniforme en todas las plataformas, los desarrolladores deben hacer la transición 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 del cliente no tiene acceso a la red de internet en general. Solo puede resolver y acceder a direcciones IP y dominios incluidos explícitamente 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 manera defensiva, implemente la siguiente Lista de verificación de diseño de Captive Portal Mobile-First:

mobile_first_checklist.png

1. Configuración del Viewport

Para evitar que los dispositivos móviles reduzcan la escala del viewport a un ancho de escritorio (normalmente 980px), el `` del HTML debe incluir una etiqueta meta de viewport responsiva. Sin esto, el texto y los campos de entrada se verán microscópicos en los dispositivos móviles:


2. Integración de CSS en Línea y Eliminación de Dependencias Externas

Nunca enlace a archivos CSS externos o redes CDN (por ejemplo, Bootstrap, Tailwind o Google Fonts). Todo el CSS debe estar integrado dentro de un bloque `

<div class="portal-card">
    <div class="logo-container">
        
        
            
            SU MARCA
        
    </div>
    
    <h1>Bienvenido a Guest WiFi</h1>
    <p>Por favor, ingrese sus datos a continuación para acceder a internet de alta velocidad de forma segura.</p>
    
    
    
        <div class="form-group">
            Nombre completo
            
        </div>
        
        <div class="form-group">
            Correo electrónico
            
        </div>
        
        <div class="consent-group">
            
            
                Acepto los <a href="#">Términos de servicio</a> y doy mi consentimiento para el procesamiento de datos de conformidad con las regulaciones de GDPR.
            
        </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 únicamente para fines de autenticación y aceptación de marketing de conformidad con nuestra Política de privacidad.
        </div>
        
        Conectarse a WiFi
    
    
    <div class="footer">
        Powered by Purple | Secure Guest WiFi
    </div>
</div>

## Solución de problemas y mitigación de riesgos

Al implementar Captive Portals con HTML/CSS codificados a la medida, los equipos de operaciones de TI suelen enfrentarse a varios riesgos operativos graves:

### 1. El bucle de advertencia de certificado 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 el gateway 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. Dependa por completo del asistente nativo del CNA 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 *únicamente después* de que la redirección HTTP inicial haya dirigido con éxito al usuario a su dominio del portal [2].

### 2. Fallas en la resolución de DNS (La trampa del jardín amurallado o Walled Garden)

Si su página HTML personalizada hace referencia a recursos externos, como un endpoint OAuth de inicio de sesión social (por ejemplo, Facebook, Google) o una pasarela de pago, las solicitudes de DNS para estos dominios fallarán a menos que se agreguen explícitamente a la lista de permitidos en el Walled Garden del controlador inalámbrico. Si falta un dominio en la lista de permitidos, 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, agregue a la lista de permitidos los dominios comodín 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 Captive Portals estándar autentican los dispositivos según 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 provocar que se solicite repetidamente a los invitados que se vuelvan a autenticar, lo que arruina 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 Captive Portals basados en MAC.

## Relevancia del producto Purple: Desarrollar frente a comprar

Aunque codificar una sola página HTML es sencillo, alojar, asegurar y escalar una infraestructura de Captive Portal personalizada presenta enormes desafíos técnicos y de cumplimiento. La siguiente tabla compara las realidades operativas y de ingeniería de alojar un portal personalizado por cuenta propia frente a utilizar la plataforma empresarial gestionada de Purple:

| Característica / Requisito operativo | Portal personalizado autoalojado | Plataforma Enterprise WiFi de Purple |
| :--- | :--- | :--- |
| **Personalización de HTML/CSS** | Codificación totalmente manual, subida de archivos a AP individuales o servidores web locales. | **Editor para desarrolladores con precisión de píxel** que permite inyecciones personalizadas de HTML/CSS, combinado con un generador 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 AP 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 lista para usar** con más de 200 modelos de hardware; implementación de portal unificada en infraestructuras con 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 datos de los interesados y alojamiento seguro con certificación ISO 27001.
| **Analytics &amp; Marketing** | Requires building custom data ingestion pipelines and integrating third-party marketing tools. | **Enterprise-grade analytics dashboard** with real-time footfall tracking, return-rate metrics, and automated marketing campaign triggers [6].
| **Identity Provider Integrations** | Manual OAuth2 integrations with Google, Facebook, Apple, and local SMS gateways. | **One-click integrations** with major social platforms, SMS gateways, and Azure AD / Okta for corporate guests.

Purple's platform resolves the "Build vs. Buy" dilemma. It provides developers with the complete creative freedom of a custom HTML/CSS workspace while eliminating the complex, high-risk backend infrastructure engineering required to support secure RADIUS authentication at scale.

## ROI &amp; Business Impact

Investing in a professionally engineered, responsive custom captive portal delivers quantifiable returns across IT operations, marketing, and legal compliance.

### 1. Operational Cost Reduction (IT Helpdesk Tickets)

In large-scale deployments, such as a stadium or multi-site retail chain, a broken captive portal is a leading driver of IT helpdesk escalations. When guests encounter a "white screen" or a non-responsive login button, they overwhelm on-site staff or submit support tickets.

$$\text{Annual Support Savings} = (\text{Total Annual Guest Visits} \times \text{Portal Failure Rate} \times \text{Helpdesk Contact Rate}) \times \text{Cost Per Support Ticket}$$

* **Scenario**: A convention center with 1,000,000 annual visitors. A poorly coded portal has a 5% failure rate on older iOS devices, leading to a 10% helpdesk contact rate. At an industry-standard $15 per support ticket, the operational cost is:
  $$(1,000,000 \times 0.05 \times 0.10) \times \$15 = \$75,000 \text{ annually in avoidable support overhead}$$
* **Outcome**: Transitioning to a CNA-optimized, mobile-first template reduces the portal failure rate to &lt;0.1%, virtually eliminating this operational drain.

### 2. Marketing Data Capture and Opt-in Optimization

For retail and hospitality venues, the guest WiFi portal is the primary mechanism for capturing clean, first-party customer data. A poorly designed user interface with microscopic text or a clunky form layout causes high **bounce rates**—users abandon the login process entirely, resulting in lost marketing opportunities.

* **Case Study (Retail)**: A national retail chain implemented a mobile-first optimized captive portal utilizing Purple's platform. By replacing a multi-step login form with a single-field email input (font-size: 16px) and an optimized 48px tap-target button, they saw a **42% increase in completed registrations** and a **28% increase in marketing newsletter opt-ins** within the first quarter [6].

### 3. Legal and Regulatory Risk Mitigation

Bajo el GDPR y la CCPA, la recopilación de datos que no cumple con las normativas conlleva graves sanciones financieras (hasta el 4% de la facturación anual global bajo el GDPR). Depender de casillas de verificación previamente marcadas o no proporcionar una Política de Privacidad clara y fácilmente accesible en su splash page expone a la empresa a una inmensa responsabilidad legal.

* **ROI de mitigación**: Implementar una casilla de consentimiento explícita y sin marcar, y alojar los términos dentro de un cuadro de desplazamiento optimizado garantiza el cumplimiento normativo al 100%, mitigando el riesgo de multas regulatorias multimillonarias y protegiendo la reputación de la marca.

## Resumen de puntos clave

* **El Sandbox del CNA es restrictivo**: El Websheet de iOS de Apple y el CNA de macOS son entornos altamente aislados (sandboxed) que bloquean recursos externos, cookies y fuentes web. Todo el estilo y los recursos deben ser autocontenidos (CSS en línea, imágenes Base64, fuentes del sistema) [1].
* **AJAX interrumpe el saludo de salida de iOS**: Para realizar la transición exitosa 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 Mobile-First es obligatorio**: Más del 90% de los inicios de sesión ocurren en dispositivos móviles. Diseñe un diseño de una sola columna (ancho máximo: 480px), utilice objetivos táctiles fáciles de presionar (mínimo 44px x 44px) y aplique un tamaño de fuente mínimo de 16px en todas las entradas de texto para evitar el zoom automático del navegador de iOS.
* **Los Walled Gardens controlan el DNS**: Cualquier dominio externo al que se haga referencia durante el inicio de sesión (por ejemplo, las API de inicio de sesión social) debe incluirse explícitamente en la lista blanca en el walled garden del controlador inalámbrico, o la página no se cargará.
* **Purple elimina la complejidad del backend**: El uso del constructor de portales de Purple otorga a los desarrolladores un control total de HTML/CSS a través de un editor personalizado, al tiempo que libera la inmensa carga de seguridad, escalabilidad y cumplimiento de RADIUS, integraciones de AP de múltiples proveedores y la gestión de bases de datos que cumplen con el GDPR [3].

## Referencias

* [1] [Wireless Broadband Alliance: Captive Network Portal Behavior](https://captivebehavior.wballiance.com/)
* [2] [Android Open Source Project: Captive Portal Login Webview Integration](https://source.android.com/docs/core/connect/android-custom-tabs-captive-portal)
* [3] [European Data Protection Board: Guidelines on Consent under Regulation 2016/679](https://edpb.europa.eu/our-work-tools/our-documents/guidelines/guidelines-052020-consent-under-regulation-2016679_en)
* [4] [How to Implement 802.1X Authentication with Cloud RADIUS](/guides/implementing-8021x-with-cloud-radius)
* [5] [Cisco Wireless APs: 2026 Guide to Products &amp; Deployment](/blog/cisco-wireless-ap)
* [6] [Purple WiFi Marketing &amp; Analytics Platform](/guest-wifi-marketing-analytics-platform)

---

## Escuche el informe técnico

Escuche a un arquitecto de soluciones sénior hablar sobre las limitaciones técnicas y las estrategias de implementación para Captive Portals personalizados:

Definiciones clave

Captive Portal

Una página web que se muestra a los usuarios recién conectados a una red Wi-Fi antes de que se les otorgue un acceso más amplio a los recursos de la red, utilizada comúnmente para autenticación, pago o para mostrar los términos de servicio.

Los equipos de TI implementan Captive Portals a nivel de gateway para controlar el acceso de invitados, recopilar datos de usuarios y garantizar el cumplimiento legal.

Captive Network Assistant (CNA)

Un mininavegador en un entorno aislado (sandbox) y sumamente 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 del portal.

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

Walled Garden

Una lista restringida de direcciones IP, subredes o nombres de dominio a los que un usuario invitado no autenticado tiene permiso de acceder a través del gateway antes de completar el proceso de inicio de sesión del Captive Portal.

Los desarrolladores deben asegurarse de que cualquier recurso externo (como las API de inicio de sesión social o las pasarelas de pago) esté en la lista de permitidos dentro 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 dentro de documentos HTML o CSS.

El uso de la codificación Base64 para logotipos e íconos elimina las solicitudes HTTP externas, garantizando que los recursos se rendericen perfectamente dentro de entornos CNA sin conexión.

RADIUS (Remote Authentication Dial-In User Service)

Un protocolo de red que proporciona una administració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 el gateway de red una vez que se cumplen los criterios de autenticación.

System Font Stack

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) sobre las fuentes web externas.

La implementación de un system font stack garantiza la renderización inmediata de la tipografía sin activar solicitudes HTTP externas bloqueadas a servicios como Google Fonts.

Canary URL

Una URL HTTP dedicada y sin cifrar mantenida por los proveedores de sistemas operativos (por ejemplo, captive.apple.com) para probar si un dispositivo tiene conectividad a internet sin restricciones.

El administrador de red en segundo plano del SO comprueba esta URL para detectar la presencia de un Captive Portal y activar la ventana emergente de la vista web de CNA.

Passpoint (Hotspot 2.0)

Un estándar de la industria desarrollado por Wi-Fi Alliance que permite a los dispositivos móviles descubrir de forma automática y autenticarse de manera segura en puntos de acceso Wi-Fi, omitiendo los inicios de sesión manuales en el 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 pasen a tener experiencias de roaming seguras y fluidas, similares a las de la red celular.

Ejemplos resueltos

Una cadena de hoteles 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 alinee perfectamente con sus pautas de marca premium. Su agencia creativa diseñó una página de inicio que utiliza tipografía de marca personalizada (alojada en Adobe Fonts), múltiples imágenes de fondo de alta resolución (alojadas en un bucket público de AWS S3) y un asistente de JavaScript animado de varios pasos. Al implementarse, los invitados con iOS se conectan al SSID, pero el Captive 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 Captive 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 es bloqueada por el CNA, reemplazamos la llamada de fuente personalizada por una familia de fuentes del sistema nativa y premium (font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;). Esto garantiza un renderizado instantáneo sin llamadas de red 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 del gateway. Comprimimos el logotipo principal de la marca, lo convertimos a un formato 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 gradiente CSS limpio y responsivo utilizando 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 puro y ligero.
  4. Handshake de Autenticación: La solicitud de envío del formulario se modifica de un envío basado en AJAX a un <form action="/submit" method="POST"> HTML nativo para activar un redireccionamiento de página completa, lo que permite que la hoja web 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 a menudo tratan al Captive Portal como un sitio web de escritorio estándar. Sin embargo, debido a que el dispositivo se encuentra en un estado previo a la autenticación, la red bloquea todo el tráfico externo. Al incluir CSS en línea, usar fuentes del sistema, codificar recursos en Base64 y utilizar envíos de formularios nativos, preservamos la estética de la marca premium al tiempo que logramos una confiabilidad operativa del 100% en dispositivos iOS y Android.

Una cadena nacional de retail [Retail](/industries/retail) con 450 tiendas desea capturar los correos electrónicos de los invitados a través de páginas de inicio de WiFi para alimentar su CRM. Requieren que los invitados opten por recibir boletines de marketing. El diseño inicial tiene una casilla de verificación marcada previamente que dice 'Acepto recibir correos electrónicos de marketing'. Además, el Captive Portal está alojado en un único servidor local en su sede. Durante las horas pico (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 de la infraestructura:

  1. Remediación de Cumplimiento Normativo: 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 agregamos una casilla de verificación obligatoria y separada para los Términos de Servicio para desvincular el acuerdo legal del consentimiento de marketing.
  2. Escalamiento de Infraestructura: Alojar un Captive Portal nacional en un único servidor centralizado crea un punto único de falla y un cuello de botella de latencia masivo. Migramos el frontend del Captive Portal a una red de entrega de contenido (CDN) altamente disponible y distribuida globalmente 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, lo que garantiza que las solicitudes de autenticación se procesen localmente en el extremo con una latencia inferior a 50 ms, incluso durante el tráfico pico de los sábados.
  4. Migración a Purple: Para eliminar toda esta carga de ingeniería, el minorista migra a Purple. Las herramientas de consentimiento de GDPR integradas de Purple gestionan automáticamente los registros conformes a la ley, y su infraestructura en la nube distribuida globalmente maneja millones de autenticaciones diarias con un tiempo de actividad del 99.99%, resolviendo por completo el cuello de botella de escalamiento.
Comentario del examinador: Las casillas de consentimiento marcadas previamente representan un riesgo grave de cumplimiento que puede dar lugar a multas regulatorias masivas. Desvincular el consentimiento de marketing de los Términos de Servicio es una mejor práctica técnica y legal. En el lado de la infraestructura, el alojamiento centralizado de los portales cautivos es un antipatrón. Una presencia de retail a nivel nacional requiere un frontend descentralizado con almacenamiento en caché perimetral combinado con un backend RADIUS nativo de la nube. Migrar a una plataforma administrada como Purple elimina esta complejidad arquitectónica, lo que permite al minorista enfocarse en las campañas de marketing en lugar del escalamiento de la base de datos.

Preguntas de práctica

Q1. An IT team at a major international airport [Transport](/industries/transport) deploys a custom-coded captive portal. They notice that while Android users connect seamlessly, a significant portion of iOS users experience an issue where they authenticate successfully but cannot browse the web. On closer inspection, the iOS devices show they are connected to the SSID, but the top-right button on the captive popup still says 'Cancel' instead of 'Done'. What is the root cause of this issue, and how should the developer fix it?

Sugerencia: Analyze how the Apple CNA helper detects that a network has transitioned from captive to authenticated, and what browser action is required to trigger this check.

Ver respuesta modelo

The root cause is that the portal's success page is updating the UI dynamically via JavaScript (AJAX/SPA routing) rather than performing a full-page HTTP navigation. The Apple iOS Captive Network Assistant (CNA) mini-browser only re-runs its background connectivity check (the canary request to captive.apple.com) when a full-page URL redirect or navigation occurs. If the developer submits the login form via AJAX and simply displays a 'Success' message in the DOM, the CNA remains unaware that the network has been unlocked. Consequently, the top-right button remains as 'Cancel'. If the user clicks 'Cancel' to exit, the OS assumes the login failed and disconnects from the WiFi network.

Solution: The developer must modify the authentication success handler to force a full-page redirect. This can be achieved by submitting the login form natively via a standard HTML <form action="/submit" method="POST"> or by executing window.location.href = '/success_landing_page' in JavaScript once the API returns a successful authentication response. This triggers the required full-page load, forcing the CNA helper to re-evaluate the network state, verify that the canary URL is now reachable, and change the top-right button to 'Done'.

Q2. A stadium operations team [Events] wants to launch a guest WiFi network that captures marketing opt-ins. The compliance officer insists that the portal must be 100% GDPR-compliant. The development team presents a mockup where the login form has a pre-checked box saying 'I agree to the Terms of Service and consent to receive marketing newsletters'. Why is this design non-compliant, and how should the HTML/CSS and form structure be refactored to satisfy GDPR while maintaining a high conversion rate?

Sugerencia: Consider GDPR's strict requirements regarding explicit consent, the decoupling of marketing opt-ins from terms of service, and the physical visibility of legal text on mobile screens.

Ver respuesta modelo

The proposed design violates GDPR on two major fronts: first, pre-checked checkboxes do not constitute valid consent, which must be freely given, specific, informed, and unambiguous. Second, bundling marketing consent with the agreement to the Terms of Service is non-compliant; a user cannot be forced to accept marketing emails as a condition of using the WiFi service.

Refactoring Strategy:

  1. Decouple Consent: Split the checkbox into two separate checkboxes. Checkbox A is mandatory and covers the Terms of Service and Privacy Policy. Checkbox B is optional and covers marketing newsletter opt-in.
  2. Set to Unchecked: Ensure both checkboxes are unchecked by default in the HTML (checked attribute omitted).
  3. CSS Visibility: Since over 90% of users are on mobile, place the checkboxes directly above the 'Connect' button so they are visible 'above the fold' without scrolling. Use a system font stack and set the label font size to 14px with a line-height of 1.4 for readability.
  4. Terms Scrollbox: To prevent the legal text from pushing the form elements off the screen, place the detailed Terms of Service in a scrollable container with a fixed height (max-height: 100px; overflow-y: auto; background-color: #F5F1ED; border: 1px solid #D1D5DB; border-radius: 6px;) that can be toggled open or closed via a text link. This maintains a clean, high-converting layout while ensuring absolute legal compliance.

Q3. A retail chain [Retail](/industries/retail) is deploying a custom-coded splash page across 100 stores. The designer used Google Fonts (Montserrat) and linked to a CDN-hosted Bootstrap stylesheet in the HTML head. During testing on a corporate network, the page renders beautifully. However, when deployed on a test store AP with a captive network configuration, the page renders with unstyled Times New Roman text, broken alignment, and missing icons. Why does this happen, and how must the assets be refactored?

Sugerencia: Analyze the state of the network connection before a user is authenticated, and determine how the browser handles external HTTP requests to domains outside the walled garden.

Ver respuesta modelo

This failure occurs because the device is in an unauthenticated, captive state when the splash page is loaded. In this state, the wireless gateway blocks all outbound internet traffic, allowing requests only to domains explicitly whitelisted in the gateway's Walled Garden. Because the CDN domains for Bootstrap (cdn.jsdelivr.net) and Google Fonts (fonts.googleapis.com) are not whitelisted, the browser's requests to fetch the stylesheet and font files fail silently. Consequently, the browser falls back to its default rendering engine, resulting in unstyled HTML (Times New Roman text) and broken layouts.

Refactoring Strategy:

  1. Inline CSS: Remove the external Bootstrap stylesheet link. Copy the necessary CSS grid/flexbox rules directly into a <style> block in the HTML <head>. This ensures that all layout instructions are delivered in the initial single-page payload.
  2. Implement System Font Stack: Remove the Google Fonts @import or <link> call. Replace it with a native system font stack in the CSS (font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;). This forces the device to use high-quality fonts already pre-installed on the operating system, eliminating the external network dependency entirely.
  3. Base64 Encode Icons/Logos: If the layout relies on external images or icon libraries (like FontAwesome), convert these icons into SVG format and embed them inline within the HTML or as Base64 Data URIs in the CSS. This guarantees that the page is 100% self-contained and renders perfectly even with zero internet connectivity.

Continúe leyendo esta serie

Cómo configurar un Captive Portal en Starlink: Una guía para ubicaciones remotas y marítimas

Esta guía detalla cómo omitir el hardware nativo de Starlink e integrar un Captive Portal administrado en la nube utilizando equipos de enrutamiento empresariales. Aprenderá cómo superar la limitación de CGNAT, aplicar la segmentación de VLAN, administrar las restricciones de ancho de banda satelital y garantizar el cumplimiento normativo.

Leer la guía →

Mejores prácticas de Captive Portal: Diseñando para una alta conversión y cumplimiento

Esta guía técnica ofrece a los gerentes de TI, arquitectos de red y directores de operaciones de establecimientos un plan completo para implementar captive portals que equilibren la seguridad de la red con una alta conversión de usuarios. Cubre toda la arquitectura, desde la segmentación de VLAN y la autenticación RADIUS hasta el diseño de consentimiento conforme a GDPR y la selección del método de autenticación. Basada en la experiencia operativa de Purple en más de 80,000 establecimientos y 440 millones de inicios de sesión en 2024, cada recomendación se fundamenta en datos reales de implementación.

Leer la guía →

Cómo optimizar los captive portals para una máxima seguridad de red y conversión de usuarios

Esta guía proporciona un plan técnico completo para optimizar los captive portals en entornos empresariales, abarcando la arquitectura de segmentación de red, la selección del método de autenticación, el diseño de consentimiento conforme a GDPR y la optimización de la conversión. Está dirigida a gerentes de TI, arquitectos de red y CTOs en hoteles, cadenas de retail, estadios y organizaciones del sector público que necesitan equilibrar la seguridad de la red con la captura de datos de primera mano. Purple opera la infraestructura de captive portal en más de 80,000 establecimientos con 440 millones de inicios de sesión en 2024, y los marcos de trabajo aquí presentados reflejan esa experiencia operativa.

Leer la guía →