AuthService: ciclo de vida de sesiónUbicación: libs/shared/data-access/src/lib/auth/auth.service.ts. Se exporta por @nebula-shared/data-access.
/jwt-get.El constructor llama initializeAuthState(). En navegador, revisa token y expiración; si el token supera el margen de 30 segundos, decodifica el payload, reconstruye usuario/sessionId, marca isAuthenticatedSubject=true y programa refresh. Esa comprobación local no prueba que la firma sea válida ni que el servidor no haya revocado el token.
LoginService delega a handleSuccessfulAuth(AuthContent). El método mantiene tokens en memoria, persiste access_token, refresh_token y token_expiry, decodifica el usuario del JWT, guarda datos seguros y publica autenticación. Después agenda el refresh y reinicia el indicador de sesión expirada.
Luego el componente de login pide /jwt-get para obtener los datos de sesión completos. El método validateTokenOnly() es una consulta distinta al endpoint /jwt para validar el token sin recuperar todo el usuario.
scheduleTokenRefresh() programa una llamada a refreshToken() 30 segundos antes de la expiración (mínimo un segundo). refreshToken() hace POST con el refresh token y procesa una nueva AuthContent como un login exitoso. Los errores 401/403 fuerzan logout; los 500 pueden reintentarse hasta el límite configurado con backoff.
handle401Error() serializa refreshes simultáneos con un lock y una cola de callbacks. Cuando se renueva, reintenta la petición con el nuevo token. Si ya se completó un refresh hace poco y otra petición llega con el token antiguo, puede reintentarse con el token vigente sin iniciar otro refresh.
updateTokensAfterCompanySelection() reemplaza access token, refresh token si se proporciona y expiración. Actualiza el usuario desde el JWT, el estado de autenticación, el temporizador y la cookie puente.
logout() intenta POST /logout con access token; independientemente del resultado, limpia almacenamiento, cookies, navegación y temporizadores, y redirige a /login. _forceLogout() es el camino de sesión expirada/refresh rechazado; también limpia navegación y redirige con sessionExpired=true.
clearAllData() elimina tokens, usuario, selección de producto/módulo, banderas de cambio de contraseña y claves de sesión relacionadas; borra cookies user_profile, app_data y otras usadas por la app.
getCurrentUser(), getUserRoles(), getUserPermissions(), getCompanyId(), getCustomerId() y métodos relacionados entregan el contexto del frontend. Roles/authorities usados para presentación no deben considerarse prueba de autorización de una operación backend.