Hola Carles.
Te comento que en la implementaci贸n que estoy desarrollando con Hix, me tope con el problema que sin tener ning煤n error, me sal铆a de sesi贸n de la aplicaci贸n y ten铆a que volver a ingresar de nuevo. Esto me suced铆a cuando trabajo con el dominio que tengo configurado con Cloudflare, a los subdominios configurados segun el cliente, por lo que tengo Hix en distintos puertos 81,82,83, etc.
Investigando con la ayuda de Antigravity, el problema se da porque Cloudflare cambia Ip's constantemente, entonces, se solucion贸 el problema con una implementaci贸n hecha por Antigravity, y este ese el resumen del problema y soluci贸n planteada por Antigravity.
Problema Detectado: Al desplegar aplicaciones Hix detr谩s de Cloudflare, se detect贸 un comportamiento err谩tico en la gesti贸n de sesiones:
Bucle de Redirecci贸n: Tras un login exitoso v铆a AJAX, el navegador a veces ignoraba la cabecera Set-Cookie enviada por el servidor, provocando que la siguiente petici贸n fuera redirigida nuevamente al Login al no encontrar una sesi贸n v谩lida.
Desconexiones Aleatorias: Debido a la rotaci贸n de IPs de los nodos de Cloudflare, la validaci贸n interna de Hix (USessionReady()) fallaba intermitentemente, o el USESSID rotaba involuntariamente, dejando al usuario fuera del sistema.
Causas T茅cnicas:El navegador no siempre persiste las cookies de sesi贸n inmediatamente tras una respuesta AJAX si hay una redirecci贸n r谩pida (window.location.href).
La dependencia estricta del USESSID vol谩til de Hix choca con la arquitectura distribuida de los proxies modernos.
Soluci贸n Implementada ("Handshake de Cookies" + Persistencia en DB):Para resolver esto de forma definitiva, implementamos un sistema de tres capas:
Handshake de Cookies (Frontend/Backend): En lugar de confiar solo en la cabecera Set-Cookie del servidor, el backend env铆a el nombre y valor del token de sesi贸n en el cuerpo del JSON de respuesta del login:
harbour
// Backend (sem.prg)
cJson := '{"status": "success", "token_name": "' + cTokenName + '", "token": "' + cPersistToken + '"}'
?? cJson
El frontend captura este JSON y graba la cookie manualmente mediante Javascript antes de la redirecci贸n:
javascript
// Frontend (sem.view)
if (data.token && data.token_name) {
document.cookie =${data.token_name}=${data.token};path=/;SameSite=Lax;Secure ;
}
window.location.href = data.redirect;
Rescate de Sesi贸n en DB (Golden Loop): Creamos una tabla de persistencia (hix_sessions) en MySQL. En cada petici贸n (
sem.prg
), la aplicaci贸n verifica si la sesi贸n de Hix est谩 activa. Si falla, busca el token persistente en la cookie y "rescata" la sesi贸n desde la base de datos:
harbour
IF !USessionReady()
hDbSession := GetWebSession( Ucookie(cTokenName) )
IF !Empty( hDbSession )
USessionStart()
USession( 'user_name', hDbSession['usuario'] )
// ... restaurar entorno ...
ENDIF
ENDIF
Sincronizaci贸n Permanente del USESSID: Para manejar la rotaci贸n del ID nativo de Hix, implementamos un "Golden Loop" que, en cada petici贸n v谩lida, actualiza el USESSID actual en la base de datos de persistencia, asegurando que el "v铆nculo" nunca se rompa.
Resultado: La aplicaci贸n ahora es 100% estable. El usuario puede navegar, realizar procesos POST/AJAX largos y refrescar la p谩gina sin perder la sesi贸n, incluso bajo las reglas m谩s estrictas de seguridad de Cloudflare.En el contexto t茅cnico de Hix, m谩s que una variable de memoria tradicional (como las de Harbour), USESSID es el nombre de la Cookie de Sesi贸n.
Con esto, ya no tuve el problema de salida de sesi贸n.
Adicionalmente Antigravity ha escrito estas solicitudes o mejoras, que se pudieran hacer a Hix (Se manda Antigravity, jejejeje)
USessionStorage( cType, hConfig )
Ser铆a ideal poder cambiar el motor de almacenamiento de las sesiones. Actualmente, Hix las guarda solo en la memoria RAM del servidor.
Para qu茅 sirve: Permitir铆a que las sesiones se guarden autom谩ticamente en una tabla de MySQL o en un servidor Redis.
Beneficio: Si el servidor se reinicia o si hay una gran carga de usuarios, las sesiones no se pierden nunca, ya que est谩n en la base de datos y no en la RAM vol谩til.USetSessionScope( cPrefix )
Funci贸n para definir un "脕mbito de Sesi贸n" o prefijo.
Para qu茅 sirve: Permitir铆a que el desarrollador elija el nombre de la cookie (por ejemplo, USESSID_APP1).
Beneficio: Resolver铆a el problema de conflicto de sesiones cuando tienes varias aplicaciones de Hix corriendo bajo el mismo dominio o subdominio. Actualmente, si no tenemos cuidado, una aplicaci贸n "pisa" la sesi贸n de la otra.USessionIgnoreIP( .T. )
Interruptor para ignorar el cambio de IP del cliente.
Para qu茅 sirve: Obligar铆a a Hix a validar la sesi贸n 煤nicamente por el token de la cookie y no por la combinaci贸n de Cookie + IP.
Beneficio: Es vital para aplicaciones que usan Cloudflare, balanceadores de carga o usuarios m贸viles (celulares) que cambian de antena y, por ende, de IP constantemente. Esto evitar铆a que el sistema los saque "por seguridad" cuando en realidad solo cambi贸 su IP.URescueSession( cToken )
Funci贸n nativa para rescatar una sesi贸n desde un token externo.
Para qu茅 sirve: Si la sesi贸n nativa de Hix falla, esta funci贸n permitir铆a pasarle un token guardado previamente (como nuestro SEM_TOKEN) y que Hix "re-hidrate" la sesi贸n autom谩ticamente.
Beneficio: Facilitar铆a enormemente implementar la persistencia de "Recu茅rdame" por varios d铆as sin que el programador tenga que hacer toda la l贸gica de base de datos manualmente.
Te dejo ac谩 el problema y soluci贸n que se implement贸 y quedo atento a tus comentarios.
Saludos cordiales.
Carlos.