@cbm-common/auth-service
v0.0.1
Published
This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 20.1.0.
Readme
AuthService
This project was generated using Angular CLI version 20.1.0.
Code scaffolding
Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
ng generate component component-name
## @cbm-common/auth-service — Servicio de autenticación
Este paquete expone `CbmAuthService`, un servicio singleton que centraliza el manejo de tokens JWT en la aplicación: lectura/decodificación, validación de expiración, persistencia en localStorage y redirección al login cuando la sesión expira.
Resumen rápido
- Servicio: `CbmAuthService` (providedIn: 'root')
- Funcionalidades principales:
- Almacenar tres tipos de token en localStorage: token global, token de usuario y token de consola.
- Decodificar los tokens JWT usando `jwt-decode` y exponer los datos tipados.
- Detectar tokens vencidos y forzar logout + redirección a `auth/login` publicando una alerta con `pubsub-js`.
Estructuras de datos expuestas
- `CbmAuthData` — Representa el payload esperado para el token global (contiene `user`, `company`, `roles`, `modules`, `exp`, `iat`, ...).
- `CbmTokenUserData` — Payload del token de usuario.
- `CbmConsoleTokenData` — Payload para tokens de consola.
- `LOCAL_STORAGE_KEY` — Enum con las claves usadas en localStorage:
- `TOKEN_GLOBAL_KEY = 'tokenGlobal'`
- `TOKEN_USER_KEY = 'tokenUser'`
- `CONSOLE_TOKEN_KEY = 'consoleToken'`
API pública (principales setters/getters)
- Setters (guardan en localStorage y disparan decodificación):
- `authToken = '<jwt>'` — Guarda el token global y decodifica su payload.
- `userToken = '<jwt>'` — Guarda el token de usuario y decodifica su payload.
- `consoleToken = '<jwt>'` — Guarda el token de consola y decodifica su payload.
- Getters (devuelven el payload decodificado o fuerzan logout si faltan/expiraron):
- `authData: CbmAuthData` — Lanza error y redirige al login si no existe o está vencido.
- `userData: CbmTokenUserData` — Igual comportamiento para token de usuario.
- `consoleData: CbmConsoleTokenData` — Igual comportamiento para token de consola.
Comportamiento y reglas
- Al instanciarse (constructor) el servicio intenta leer desde `localStorage` las 3 claves y decodificarlas.
- Si detecta que el token está vencido, o la decodificación falla, llama internamente a `logOut()`.
- `logOut()` realiza:
- Navegación a `['auth','login']` mediante `Router`.
- Publica en `PubSub` un mensaje tipo alerta: `{ type: 'sweetAlert', status: 'warning', message: 'Su sesión ha caducado.' }`.
Dependencias importantes
- `jwt-decode` — usado para extraer payload del JWT.
- `pubsub-js` — usado para emitir la alerta cuando expira la sesión.
Ejemplo de uso
```ts
// Guardar token global
cbmAuthService.authToken = tokenString;
// Leer datos seguros (lanza y redirige si no hay token válido)
try {
const auth = cbmAuthService.authData;
console.log(auth.user.full_name);
} catch (e) {
// el servicio redirigirá al login automáticamente
}Consideraciones de seguridad
- El servicio almacena tokens en
localStorage. Evalúa el riesgo XSS en tu aplicación y, si es necesario, considera almacenamiento más seguro o técnicas de mitigación (HttpOnly cookies, Content Security Policy, sanitización estricta).
Notas de integración
- Asegúrate de instalar las peerDependencies declaradas en
package.json(pubsub-js,jwt-decode) en el proyecto que consuma este paquete.
Comprobaciones y pruebas
- El paquete no incluye tests en este directorio; para validar el comportamiento, crea un spec que simule tokens válidos y expirados y confirme que
logOut()se dispara correctamente.
Publicación y build
- Para construir la librería desde la raíz del workspace:
ng build auth-serviceConclusión
@cbm-common/auth-servicees un servicio ligero y directo para el manejo de JWT en la UI, con lógica de expiración y logout centralizada. Si quieres, puedo:- Añadir ejemplos de tests unitarios para cubrir decodificación y expiración.
- Reforzar la documentación con diagramas de flujo de token y ejemplos de integración en
app.config.ts.
