@tgtone/auth-sdk 1.4.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +66 -8
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -229,15 +229,26 @@ Verifica si el usuario tiene acceso a una app.
229
229
 
230
230
  ---
231
231
 
232
- ## 🚫 Session Revocation (v1.3.0)
232
+ ## 🚫 Session Revocation & Access Blocking (v1.3.0+, actualizado v1.4.0)
233
233
 
234
- El SDK detecta automáticamente cuando un usuario o tenant es eliminado/desactivado y cierra la sesión.
234
+ El SDK detecta automáticamente cuando un usuario/tenant es eliminado/desactivado, o cuando una suscripción es bloqueada/trial expirado, y cierra la sesión.
235
235
 
236
- ### Cómo funciona
236
+ ### Protección en 2 capas
237
237
 
238
- 1. **Heartbeat**: Cada 5 minutos (configurable), el SDK valida la sesión con el backend
239
- 2. **Interceptor HTTP**: Captura errores 401 en cada request
240
- 3. **Acción automática**: Limpia token y redirige a `/blocked` o ejecuta callback personalizado
238
+ | Capa | Dónde | Qué hace |
239
+ |------|-------|----------|
240
+ | **Backend (AuthGuard)** | Todos los endpoints API | Valida estado de usuario y tenant en cada request (con caché de 30s). Retorna 401 con código de error. |
241
+ | **Frontend (SDK)** | Heartbeat + Interceptors | Detecta errores 401, limpia token, redirige a `/blocked` o ejecuta callback personalizado. |
242
+
243
+ ```
244
+ Usuario eliminado en Console
245
+
246
+
247
+ Backend AuthGuard → DB lookup → user.deletedAt? → 401 { code: 'USER_INACTIVE' }
248
+
249
+ ├── Si la app hace request API → Interceptor Axios/Fetch detecta 401 → redirect
250
+ └── Si no hay requests → Heartbeat (cada 5 min) detecta 401 → redirect
251
+ ```
241
252
 
242
253
  ### Habilitar en React
243
254
 
@@ -272,6 +283,41 @@ createAxiosInterceptor(api, authClient, {
272
283
  });
273
284
  ```
274
285
 
286
+ ### Con Interceptor Fetch
287
+
288
+ ```typescript
289
+ import { createAuthFetch } from '@tgtone/auth-sdk/interceptor';
290
+
291
+ const authFetch = createAuthFetch(authClient, {
292
+ handleRevoked: true,
293
+ excludeUrls: ['/public/'],
294
+ });
295
+
296
+ // Uso igual que fetch nativo — inyecta Authorization header automáticamente
297
+ const response = await authFetch('/api/users');
298
+ const data = await response.json();
299
+ ```
300
+
301
+ ### Verificar errores manualmente
302
+
303
+ ```typescript
304
+ import { isRevocationError } from '@tgtone/auth-sdk';
305
+
306
+ // En tu manejo de errores personalizado
307
+ try {
308
+ await api.call();
309
+ } catch (error) {
310
+ const code = error.response?.data?.code;
311
+ if (code && isRevocationError(code)) {
312
+ // Sesión revocada: usuario eliminado, tenant suspendido,
313
+ // suscripción bloqueada o trial expirado
314
+ // El SDK ya maneja la redirección si usas los interceptors
315
+ // Pero puedes agregar lógica extra aquí (analytics, logging, etc.)
316
+ console.log('Acceso bloqueado:', code);
317
+ }
318
+ }
319
+ ```
320
+
275
321
  ### Nuevos métodos
276
322
 
277
323
  ```typescript
@@ -300,6 +346,16 @@ Ver **[MIGRATION_GUIDE.md](./MIGRATION_GUIDE.md)** para instrucciones detalladas
300
346
 
301
347
  ## 🔄 Cómo Funciona
302
348
 
349
+ ### Protección de usuario activo (v1.4.0)
350
+
351
+ El backend valida el estado del usuario y tenant en **cada request API**, no solo en `/auth/me`:
352
+
353
+ 1. **AuthGuard con caché**: Todos los endpoints usan un guard que verifica `user.isActive`, `user.deletedAt` y `tenant.isActive`
354
+ 2. **Caché de 30s**: Los resultados se cachean en memoria para evitar DB lookups repetidos (ideal para Cloud Run)
355
+ 3. **Error codes**: Si el usuario/tenant no es válido, retorna 401 con código estructurado (`USER_INACTIVE`, `TENANT_INACTIVE`, etc.)
356
+
357
+ Esto significa que un usuario eliminado o tenant suspendido **no puede hacer ningún request API**, incluso entre heartbeats.
358
+
303
359
  ### Flujo estándar (con `checkSession()`)
304
360
 
305
361
  1. Usuario visita tu app
@@ -375,7 +431,7 @@ interface TGTAuthConfig {
375
431
  appDomain: string; // Dominio de tu app
376
432
  allowedRedirectHosts?: string[]; // Hosts permitidos para redirecciones (opcional)
377
433
  onAuthSuccess?: (session: TGTSession) => void;
378
- onAuthFailure?: (error?: AuthError) => void;
434
+ onAuthFailure?: (error?: AuthError) => void; // ⚠️ Si se provee, NO redirige automáticamente al login (v1.4.0)
379
435
  onSessionRevoked?: (error: AuthError) => void; // 🆕 Callback para sesión revocada
380
436
  heartbeatIntervalMs?: number; // 🆕 Intervalo de validación de sesión (default: 5 min)
381
437
  debug?: boolean;
@@ -406,7 +462,9 @@ const auth = new TGTAuthClient({
406
462
 
407
463
  onAuthFailure: (error) => {
408
464
  console.log('Sin sesión:', error?.message);
409
- // Mostrar landing page pública
465
+ // ⚠️ Si defines este callback, el SDK NO redirige automáticamente.
466
+ // Debes manejar la redirección manualmente si la necesitas:
467
+ // window.location.href = '/login';
410
468
  },
411
469
 
412
470
  // 🆕 Manejar sesión revocada (usuario/tenant eliminado)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tgtone/auth-sdk",
3
- "version": "1.4.0",
3
+ "version": "1.4.1",
4
4
  "description": "SDK de autenticación JWT + Bearer Token para el ecosistema TGT One",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",