@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.
- package/README.md +66 -8
- 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
|
|
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
|
-
###
|
|
236
|
+
### Protección en 2 capas
|
|
237
237
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
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
|
-
//
|
|
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)
|