@tgtone/auth-sdk 1.2.3 → 1.3.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 +127 -9
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/interceptor.d.ts +26 -0
- package/dist/interceptor.d.ts.map +1 -0
- package/dist/interceptor.js +114 -0
- package/dist/interceptor.js.map +1 -0
- package/dist/react-hook.d.ts +11 -2
- package/dist/react-hook.d.ts.map +1 -1
- package/dist/react-hook.js +44 -5
- package/dist/react-hook.js.map +1 -1
- package/dist/tgtone-auth-client.d.ts +22 -1
- package/dist/tgtone-auth-client.d.ts.map +1 -1
- package/dist/tgtone-auth-client.js +162 -7
- package/dist/tgtone-auth-client.js.map +1 -1
- package/docs/LOVABLE_QUICK_START.md +9 -1
- package/docs/MIGRATION_GUIDE.md +315 -0
- package/package.json +9 -2
package/README.md
CHANGED
|
@@ -229,6 +229,75 @@ Verifica si el usuario tiene acceso a una app.
|
|
|
229
229
|
|
|
230
230
|
---
|
|
231
231
|
|
|
232
|
+
## 🚫 Session Revocation (v1.3.0)
|
|
233
|
+
|
|
234
|
+
El SDK detecta automáticamente cuando un usuario o tenant es eliminado/desactivado y cierra la sesión.
|
|
235
|
+
|
|
236
|
+
### Cómo funciona
|
|
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
|
|
241
|
+
|
|
242
|
+
### Habilitar en React
|
|
243
|
+
|
|
244
|
+
```tsx
|
|
245
|
+
import { useTGTAuth } from '@tgtone/auth-sdk/react';
|
|
246
|
+
|
|
247
|
+
function App() {
|
|
248
|
+
const { session, loading, revokedError } = useTGTAuth({
|
|
249
|
+
identityUrl: 'https://identity.tgtone.cl',
|
|
250
|
+
appDomain: 'zenith.tgtone.cl',
|
|
251
|
+
enableHeartbeat: true, // Default: true
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
if (revokedError) {
|
|
255
|
+
// Sesión fue revocada - redirigiendo a /blocked
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// ...
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Con Interceptor Axios
|
|
264
|
+
|
|
265
|
+
```typescript
|
|
266
|
+
import { createAxiosInterceptor } from '@tgtone/auth-sdk/interceptor';
|
|
267
|
+
|
|
268
|
+
const api = axios.create({ baseURL: '/api' });
|
|
269
|
+
createAxiosInterceptor(api, authClient, {
|
|
270
|
+
handleRevoked: true,
|
|
271
|
+
excludeUrls: ['/public/health'],
|
|
272
|
+
});
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Nuevos métodos
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
// Control manual del heartbeat
|
|
279
|
+
authClient.startHeartbeat();
|
|
280
|
+
authClient.stopHeartbeat();
|
|
281
|
+
authClient.isHeartbeatActive();
|
|
282
|
+
|
|
283
|
+
// URL de redirección para sesión revocada
|
|
284
|
+
authClient.getBlockedRedirectUrl(error);
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Códigos de error
|
|
288
|
+
|
|
289
|
+
| Código | Descripción | Redirect |
|
|
290
|
+
|--------|-------------|----------|
|
|
291
|
+
| `USER_INACTIVE` | Usuario desactivado | `/blocked?type=user` |
|
|
292
|
+
| `USER_NOT_FOUND` | Usuario eliminado | `/blocked?type=user` |
|
|
293
|
+
| `TENANT_INACTIVE` | Empresa suspendida | `/blocked?type=tenant` |
|
|
294
|
+
| `APP_SUBSCRIPTION_LOCKED` | Suscripción bloqueada | `/blocked?type=subscription` |
|
|
295
|
+
| `TRIAL_EXPIRED` | Trial expirado | `/blocked?type=trial` |
|
|
296
|
+
|
|
297
|
+
Ver **[MIGRATION_GUIDE.md](./MIGRATION_GUIDE.md)** para instrucciones detalladas.
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
232
301
|
## 🔄 Cómo Funciona
|
|
233
302
|
|
|
234
303
|
### Flujo estándar (con `checkSession()`)
|
|
@@ -304,9 +373,11 @@ interface TGTUser {
|
|
|
304
373
|
interface TGTAuthConfig {
|
|
305
374
|
identityUrl: string; // URL del backend Identity
|
|
306
375
|
appDomain: string; // Dominio de tu app
|
|
307
|
-
allowedRedirectHosts?: string[]; //
|
|
376
|
+
allowedRedirectHosts?: string[]; // Hosts permitidos para redirecciones (opcional)
|
|
308
377
|
onAuthSuccess?: (session: TGTSession) => void;
|
|
309
|
-
onAuthFailure?: () => void;
|
|
378
|
+
onAuthFailure?: (error?: AuthError) => void;
|
|
379
|
+
onSessionRevoked?: (error: AuthError) => void; // 🆕 Callback para sesión revocada
|
|
380
|
+
heartbeatIntervalMs?: number; // 🆕 Intervalo de validación de sesión (default: 5 min)
|
|
310
381
|
debug?: boolean;
|
|
311
382
|
}
|
|
312
383
|
```
|
|
@@ -318,7 +389,7 @@ const auth = new TGTAuthClient({
|
|
|
318
389
|
identityUrl: 'https://identity.tgtone.cl',
|
|
319
390
|
appDomain: 'tgtone.cl',
|
|
320
391
|
|
|
321
|
-
//
|
|
392
|
+
// Permitir redirecciones a estos dominios
|
|
322
393
|
allowedRedirectHosts: [
|
|
323
394
|
'tgtone.cl',
|
|
324
395
|
'www.tgtone.cl',
|
|
@@ -329,21 +400,55 @@ const auth = new TGTAuthClient({
|
|
|
329
400
|
// Callbacks opcionales
|
|
330
401
|
onAuthSuccess: (session) => {
|
|
331
402
|
console.log('Usuario autenticado:', session.user.email);
|
|
332
|
-
//
|
|
403
|
+
// Iniciar heartbeat para detectar sesión revocada
|
|
404
|
+
auth.startHeartbeat();
|
|
333
405
|
},
|
|
334
406
|
|
|
335
|
-
onAuthFailure: () => {
|
|
336
|
-
console.log('Sin sesión');
|
|
407
|
+
onAuthFailure: (error) => {
|
|
408
|
+
console.log('Sin sesión:', error?.message);
|
|
337
409
|
// Mostrar landing page pública
|
|
338
410
|
},
|
|
339
411
|
|
|
412
|
+
// 🆕 Manejar sesión revocada (usuario/tenant eliminado)
|
|
413
|
+
onSessionRevoked: (error) => {
|
|
414
|
+
console.log('Sesión revocada:', error.code, error.message);
|
|
415
|
+
// Opcional: analytics, logging, etc.
|
|
416
|
+
// Si no se define, redirige automáticamente a /blocked
|
|
417
|
+
},
|
|
418
|
+
|
|
419
|
+
// 🆕 Validar sesión cada 5 minutos (default)
|
|
420
|
+
heartbeatIntervalMs: 5 * 60 * 1000, // 5 minutos
|
|
421
|
+
// Para deshabilitar: heartbeatIntervalMs: 0
|
|
422
|
+
|
|
340
423
|
debug: true // Logs en consola para desarrollo
|
|
341
424
|
});
|
|
342
425
|
```
|
|
343
426
|
|
|
344
427
|
---
|
|
345
428
|
|
|
346
|
-
##
|
|
429
|
+
## � Flujo SSO y Redirecciones
|
|
430
|
+
|
|
431
|
+
El SDK está diseñado para manejar el flujo de Single Sign-On (SSO) de forma automática.
|
|
432
|
+
|
|
433
|
+
1. **Redirección al Identity**: Usa `auth.redirectToLogin()` para enviar al usuario al portal central de Identity.
|
|
434
|
+
2. **Retorno con Token**: Tras el login exitoso, Identity redirige de vuelta a tu app con un parámetro `?token=...` en la URL.
|
|
435
|
+
3. **Captura Automática**: Al llamar a `auth.checkSession()`, el SDK detecta el token en la URL, lo guarda en `localStorage` y limpia la URL.
|
|
436
|
+
|
|
437
|
+
### ⚠️ Nota Crítica para SPAs (React/Vue/etc)
|
|
438
|
+
|
|
439
|
+
En aplicaciones con enrutamiento en el cliente (como React Router), es vital **bloquear el renderizado de las rutas** mientras el SDK está verificando la sesión inicial.
|
|
440
|
+
|
|
441
|
+
Si el Router se monta y detecta una ruta protegida antes de que `checkSession()` termine, podría redirigir al usuario a `/login`, limpiando los parámetros de la URL y causando que el SDK pierda el token que venía desde Identity.
|
|
442
|
+
|
|
443
|
+
**Solución recomendada:**
|
|
444
|
+
```tsx
|
|
445
|
+
if (loading) return <LoadingSpinner />;
|
|
446
|
+
return <AppRouter />;
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
---
|
|
450
|
+
|
|
451
|
+
## �🔐 Seguridad
|
|
347
452
|
|
|
348
453
|
- **Token storage**: localStorage (`tgtone_auth_token`)
|
|
349
454
|
- **Transport**: Authorization header con Bearer token
|
|
@@ -352,11 +457,24 @@ const auth = new TGTAuthClient({
|
|
|
352
457
|
|
|
353
458
|
---
|
|
354
459
|
|
|
355
|
-
**Versión:** 1.
|
|
356
|
-
**Última actualización:**
|
|
460
|
+
**Versión:** 1.3.0
|
|
461
|
+
**Última actualización:** 2026-03-26
|
|
357
462
|
|
|
358
463
|
## 🆕 Changelog
|
|
359
464
|
|
|
465
|
+
### v1.3.0 (2026-03-26)
|
|
466
|
+
- ✅ **Session Revocation**: Detección automática de usuario/tenant eliminado
|
|
467
|
+
- ✅ `startHeartbeat()` / `stopHeartbeat()` - Validación periódica de sesión
|
|
468
|
+
- ✅ `onSessionRevoked` - Callback para sesión revocada
|
|
469
|
+
- ✅ `getBlockedRedirectUrl()` - URL de redirección para sesión revocada
|
|
470
|
+
- ✅ Nuevo módulo `interceptor.ts` para Axios/Fetch
|
|
471
|
+
- ✅ Hook `useTGTAuth` mejorado con `enableHeartbeat` y `showRevokedState`
|
|
472
|
+
- ✅ Página `/blocked` mejorada en Identity con soporte para tipos de error
|
|
473
|
+
|
|
474
|
+
### v1.2.3 (2025-12-27)
|
|
475
|
+
- ✅ Mejora en el flujo de captura de token desde URL para evitar race conditions en SPAs.
|
|
476
|
+
- ✅ Documentación actualizada sobre mejores prácticas de integración con React/Lovable.
|
|
477
|
+
|
|
360
478
|
### v1.2.0 (2025-10-30)
|
|
361
479
|
- ✅ `checkSessionSilent()` - Verificar sesión sin redirigir automáticamente
|
|
362
480
|
- ✅ `allowedRedirectHosts` - Configurar hosts permitidos para redirecciones
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
export { TGTAuthClient } from './tgtone-auth-client';
|
|
1
|
+
export { TGTAuthClient, isRevocationError, REVOCATION_ERROR_CODES } from './tgtone-auth-client';
|
|
2
2
|
export { useTGTAuth } from './react-hook';
|
|
3
|
-
export
|
|
4
|
-
export type {
|
|
3
|
+
export { createAxiosInterceptor, createAuthFetch, handleAuthError } from './interceptor';
|
|
4
|
+
export type { InterceptorConfig } from './interceptor';
|
|
5
|
+
export type { TGTUser, TGTAuthConfig, SessionResponse, AuthErrorCode, AuthError, } from './tgtone-auth-client';
|
|
6
|
+
export type { UseTGTAuthResult, UseTGTAuthConfig } from './react-hook';
|
|
5
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAGhG,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACzF,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGvD,YAAY,EACV,OAAO,EACP,aAAa,EACb,eAAe,EACf,aAAa,EACb,SAAS,GACV,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export { TGTAuthClient } from './tgtone-auth-client';
|
|
1
|
+
export { TGTAuthClient, isRevocationError, REVOCATION_ERROR_CODES } from './tgtone-auth-client';
|
|
2
2
|
export { useTGTAuth } from './react-hook';
|
|
3
|
+
export { createAxiosInterceptor, createAuthFetch, handleAuthError } from './interceptor';
|
|
3
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAGhG,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { TGTAuthClient, AuthError } from './tgtone-auth-client';
|
|
2
|
+
export interface InterceptorConfig {
|
|
3
|
+
handleRevoked?: boolean;
|
|
4
|
+
onAuthError?: (error: AuthError) => void;
|
|
5
|
+
excludeUrls?: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare function createAxiosInterceptor(axios: any, authClient: TGTAuthClient, config?: InterceptorConfig): () => void;
|
|
8
|
+
export declare function createAuthFetch(authClient: TGTAuthClient, config?: InterceptorConfig): (url: string | URL, init?: RequestInit) => Promise<Response>;
|
|
9
|
+
export declare function handleAuthError(error: {
|
|
10
|
+
response?: {
|
|
11
|
+
status?: number;
|
|
12
|
+
data?: {
|
|
13
|
+
code?: string;
|
|
14
|
+
message?: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
}, authClient: TGTAuthClient, options?: {
|
|
18
|
+
onRevoked?: (error: AuthError) => void;
|
|
19
|
+
}): boolean;
|
|
20
|
+
declare const _default: {
|
|
21
|
+
createAxiosInterceptor: typeof createAxiosInterceptor;
|
|
22
|
+
createAuthFetch: typeof createAuthFetch;
|
|
23
|
+
handleAuthError: typeof handleAuthError;
|
|
24
|
+
};
|
|
25
|
+
export default _default;
|
|
26
|
+
//# sourceMappingURL=interceptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../interceptor.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAiB,MAAM,sBAAsB,CAAC;AAM/E,MAAM,WAAW,iBAAiB;IAKhC,aAAa,CAAC,EAAE,OAAO,CAAC;IAMxB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAMzC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AA6BD,wBAAgB,sBAAsB,CAEpC,KAAK,EAAE,GAAG,EACV,UAAU,EAAE,aAAa,EACzB,MAAM,GAAE,iBAAsB,GAC7B,MAAM,IAAI,CAqDZ;AAyBD,wBAAgB,eAAe,CAC7B,UAAU,EAAE,aAAa,EACzB,MAAM,GAAE,iBAAsB,GAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CA4D9D;AAgCD,wBAAgB,eAAe,CAC7B,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;CAAE,EACrF,UAAU,EAAE,aAAa,EACzB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAA;CAAO,GACvD,OAAO,CA6BT;;;;;;AAED,wBAIE"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
export function createAxiosInterceptor(axios, authClient, config = {}) {
|
|
2
|
+
const { handleRevoked = true, onAuthError, excludeUrls = [] } = config;
|
|
3
|
+
const interceptorId = axios.interceptors.response.use((response) => response, (error) => {
|
|
4
|
+
if (!error.response) {
|
|
5
|
+
return Promise.reject(error);
|
|
6
|
+
}
|
|
7
|
+
const { status, data } = error.response;
|
|
8
|
+
const requestUrl = error.config?.url || '';
|
|
9
|
+
const isExcluded = excludeUrls.some(url => requestUrl.includes(url));
|
|
10
|
+
if (isExcluded) {
|
|
11
|
+
return Promise.reject(error);
|
|
12
|
+
}
|
|
13
|
+
if (status === 401) {
|
|
14
|
+
const authError = data?.code && data?.message
|
|
15
|
+
? {
|
|
16
|
+
code: data.code,
|
|
17
|
+
message: data.message,
|
|
18
|
+
}
|
|
19
|
+
: undefined;
|
|
20
|
+
if (authError && isRevocationError(authError.code) && handleRevoked) {
|
|
21
|
+
authClient.stopHeartbeat();
|
|
22
|
+
if (onAuthError) {
|
|
23
|
+
onAuthError(authError);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
const blockedUrl = authClient.getBlockedRedirectUrl(authError);
|
|
27
|
+
window.location.href = blockedUrl;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return Promise.reject(error);
|
|
32
|
+
});
|
|
33
|
+
return () => {
|
|
34
|
+
axios.interceptors.response.eject(interceptorId);
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function createAuthFetch(authClient, config = {}) {
|
|
38
|
+
const { handleRevoked = true, onAuthError, excludeUrls = [] } = config;
|
|
39
|
+
return async (url, init) => {
|
|
40
|
+
const urlString = url.toString();
|
|
41
|
+
const token = authClient.getToken();
|
|
42
|
+
const headers = new Headers(init?.headers);
|
|
43
|
+
if (token && !headers.has('Authorization')) {
|
|
44
|
+
headers.set('Authorization', `Bearer ${token}`);
|
|
45
|
+
}
|
|
46
|
+
const response = await fetch(url, {
|
|
47
|
+
...init,
|
|
48
|
+
headers,
|
|
49
|
+
});
|
|
50
|
+
const isExcluded = excludeUrls.some(excludedUrl => urlString.includes(excludedUrl));
|
|
51
|
+
if (isExcluded) {
|
|
52
|
+
return response;
|
|
53
|
+
}
|
|
54
|
+
if (response.status === 401 && handleRevoked) {
|
|
55
|
+
try {
|
|
56
|
+
const clonedResponse = response.clone();
|
|
57
|
+
const errorData = await clonedResponse.json();
|
|
58
|
+
if (errorData?.code && errorData?.message) {
|
|
59
|
+
const authError = {
|
|
60
|
+
code: errorData.code,
|
|
61
|
+
message: errorData.message,
|
|
62
|
+
};
|
|
63
|
+
if (isRevocationError(authError.code)) {
|
|
64
|
+
authClient.stopHeartbeat();
|
|
65
|
+
if (onAuthError) {
|
|
66
|
+
onAuthError(authError);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
const blockedUrl = authClient.getBlockedRedirectUrl(authError);
|
|
70
|
+
window.location.href = blockedUrl;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return response;
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function isRevocationError(code) {
|
|
82
|
+
return ['TENANT_INACTIVE', 'USER_INACTIVE', 'USER_NOT_FOUND'].includes(code);
|
|
83
|
+
}
|
|
84
|
+
export function handleAuthError(error, authClient, options = {}) {
|
|
85
|
+
if (!error.response || error.response.status !== 401) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
const { data } = error.response;
|
|
89
|
+
if (!data?.code || !data?.message) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
const authError = {
|
|
93
|
+
code: data.code,
|
|
94
|
+
message: data.message,
|
|
95
|
+
};
|
|
96
|
+
if (isRevocationError(authError.code)) {
|
|
97
|
+
authClient.stopHeartbeat();
|
|
98
|
+
if (options.onRevoked) {
|
|
99
|
+
options.onRevoked(authError);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
const blockedUrl = authClient.getBlockedRedirectUrl(authError);
|
|
103
|
+
window.location.href = blockedUrl;
|
|
104
|
+
}
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
export default {
|
|
110
|
+
createAxiosInterceptor,
|
|
111
|
+
createAuthFetch,
|
|
112
|
+
handleAuthError,
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../interceptor.ts"],"names":[],"mappings":"AA2EA,MAAM,UAAU,sBAAsB,CAEpC,KAAU,EACV,UAAyB,EACzB,SAA4B,EAAE;IAE9B,MAAM,EAAE,aAAa,GAAG,IAAI,EAAE,WAAW,EAAE,WAAW,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;IAEvE,MAAM,aAAa,GAAG,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CACnD,CAAC,QAAiB,EAAE,EAAE,CAAC,QAAQ,EAC/B,CAAC,KAAgH,EAAE,EAAE;QAEnH,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC;QACxC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;QAG3C,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QACrE,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAGD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,SAAS,GAA0B,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,OAAO;gBAClE,CAAC,CAAC;oBACE,IAAI,EAAE,IAAI,CAAC,IAAqB;oBAChC,OAAO,EAAE,IAAI,CAAC,OAAO;iBACtB;gBACH,CAAC,CAAC,SAAS,CAAC;YAGd,IAAI,SAAS,IAAI,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,aAAa,EAAE,CAAC;gBAEpE,UAAU,CAAC,aAAa,EAAE,CAAC;gBAG3B,IAAI,WAAW,EAAE,CAAC;oBAChB,WAAW,CAAC,SAAS,CAAC,CAAC;gBACzB,CAAC;qBAAM,CAAC;oBAEN,MAAM,UAAU,GAAG,UAAU,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;oBAC/D,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,UAAU,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CACF,CAAC;IAGF,OAAO,GAAG,EAAE;QACV,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACnD,CAAC,CAAC;AACJ,CAAC;AAyBD,MAAM,UAAU,eAAe,CAC7B,UAAyB,EACzB,SAA4B,EAAE;IAE9B,MAAM,EAAE,aAAa,GAAG,IAAI,EAAE,WAAW,EAAE,WAAW,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;IAEvE,OAAO,KAAK,EAAE,GAAiB,EAAE,IAAkB,EAAqB,EAAE;QACxE,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;QAGjC,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAE3C,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC;QAClD,CAAC;QAGD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,GAAG,IAAI;YACP,OAAO;SACR,CAAC,CAAC;QAGH,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;QACpF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,QAAQ,CAAC;QAClB,CAAC;QAGD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACxC,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;gBAE9C,IAAI,SAAS,EAAE,IAAI,IAAI,SAAS,EAAE,OAAO,EAAE,CAAC;oBAC1C,MAAM,SAAS,GAAc;wBAC3B,IAAI,EAAE,SAAS,CAAC,IAAqB;wBACrC,OAAO,EAAE,SAAS,CAAC,OAAO;qBAC3B,CAAC;oBAGF,IAAI,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;wBAEtC,UAAU,CAAC,aAAa,EAAE,CAAC;wBAG3B,IAAI,WAAW,EAAE,CAAC;4BAChB,WAAW,CAAC,SAAS,CAAC,CAAC;wBACzB,CAAC;6BAAM,CAAC;4BAEN,MAAM,UAAU,GAAG,UAAU,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;4BAC/D,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,UAAU,CAAC;wBACpC,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;YAET,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC;AASD,SAAS,iBAAiB,CAAC,IAAmB;IAC5C,OAAO,CAAC,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC/E,CAAC;AAqBD,MAAM,UAAU,eAAe,CAC7B,KAAqF,EACrF,UAAyB,EACzB,UAAsD,EAAE;IAExD,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACrD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC;IAChC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAc;QAC3B,IAAI,EAAE,IAAI,CAAC,IAAqB;QAChC,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;IAEF,IAAI,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,UAAU,CAAC,aAAa,EAAE,CAAC;QAE3B,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,UAAU,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;YAC/D,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,UAAU,CAAC;QACpC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,eAAe;IACb,sBAAsB;IACtB,eAAe;IACf,eAAe;CAChB,CAAC"}
|
package/dist/react-hook.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import { TGTAuthClient, TGTSession, TGTAuthConfig } from './tgtone-auth-client';
|
|
1
|
+
import { TGTAuthClient, TGTSession, TGTAuthConfig, AuthError } from './tgtone-auth-client';
|
|
2
|
+
export interface UseTGTAuthConfig extends TGTAuthConfig {
|
|
3
|
+
enableHeartbeat?: boolean;
|
|
4
|
+
showRevokedState?: boolean;
|
|
5
|
+
}
|
|
2
6
|
export interface UseTGTAuthResult {
|
|
3
7
|
session: TGTSession | null;
|
|
4
8
|
loading: boolean;
|
|
@@ -8,6 +12,11 @@ export interface UseTGTAuthResult {
|
|
|
8
12
|
hasAccessToApp: (appName: string) => boolean;
|
|
9
13
|
tenantId: string | null;
|
|
10
14
|
authClient: TGTAuthClient;
|
|
15
|
+
revokedError: AuthError | null;
|
|
16
|
+
isHeartbeatActive: boolean;
|
|
17
|
+
startHeartbeat: () => void;
|
|
18
|
+
stopHeartbeat: () => void;
|
|
11
19
|
}
|
|
12
|
-
export declare function useTGTAuth(config:
|
|
20
|
+
export declare function useTGTAuth(config: UseTGTAuthConfig): UseTGTAuthResult;
|
|
21
|
+
export default useTGTAuth;
|
|
13
22
|
//# sourceMappingURL=react-hook.d.ts.map
|
package/dist/react-hook.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-hook.d.ts","sourceRoot":"","sources":["../react-hook.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"react-hook.d.ts","sourceRoot":"","sources":["../react-hook.tsx"],"names":[],"mappings":"AA6BA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE3F,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IAKrD,eAAe,CAAC,EAAE,OAAO,CAAC;IAO1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAE/B,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;IAG3B,OAAO,EAAE,OAAO,CAAC;IAGjB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAG5B,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IAGxD,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IAGxC,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAG7C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAGxB,UAAU,EAAE,aAAa,CAAC;IAG1B,YAAY,EAAE,SAAS,GAAG,IAAI,CAAC;IAG/B,iBAAiB,EAAE,OAAO,CAAC;IAG3B,cAAc,EAAE,MAAM,IAAI,CAAC;IAG3B,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAgED,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAwFrE;AAED,eAAe,UAAU,CAAC"}
|
package/dist/react-hook.js
CHANGED
|
@@ -1,14 +1,34 @@
|
|
|
1
|
-
import { useState, useEffect } from 'react';
|
|
1
|
+
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
2
2
|
import { TGTAuthClient } from './tgtone-auth-client';
|
|
3
3
|
export function useTGTAuth(config) {
|
|
4
4
|
const [session, setSession] = useState(null);
|
|
5
5
|
const [loading, setLoading] = useState(true);
|
|
6
|
-
const [
|
|
6
|
+
const [revokedError, setRevokedError] = useState(null);
|
|
7
|
+
const [isHeartbeatActive, setIsHeartbeatActive] = useState(false);
|
|
8
|
+
const clientRef = useRef(null);
|
|
9
|
+
if (!clientRef.current) {
|
|
10
|
+
const { enableHeartbeat = true, showRevokedState = false, ...authConfig } = config;
|
|
11
|
+
const finalConfig = {
|
|
12
|
+
...authConfig,
|
|
13
|
+
onSessionRevoked: showRevokedState
|
|
14
|
+
? (error) => {
|
|
15
|
+
setRevokedError(error);
|
|
16
|
+
setSession(null);
|
|
17
|
+
}
|
|
18
|
+
: authConfig.onSessionRevoked,
|
|
19
|
+
};
|
|
20
|
+
clientRef.current = new TGTAuthClient(finalConfig);
|
|
21
|
+
}
|
|
22
|
+
const authClient = clientRef.current;
|
|
7
23
|
useEffect(() => {
|
|
8
24
|
async function validateSession() {
|
|
9
25
|
try {
|
|
10
26
|
const authenticatedSession = await authClient.checkSession();
|
|
11
27
|
setSession(authenticatedSession);
|
|
28
|
+
if (authenticatedSession && config.enableHeartbeat !== false) {
|
|
29
|
+
authClient.startHeartbeat();
|
|
30
|
+
setIsHeartbeatActive(true);
|
|
31
|
+
}
|
|
12
32
|
}
|
|
13
33
|
catch (error) {
|
|
14
34
|
console.error('[useTGTAuth] Error validando sesión:', error);
|
|
@@ -19,11 +39,25 @@ export function useTGTAuth(config) {
|
|
|
19
39
|
}
|
|
20
40
|
}
|
|
21
41
|
validateSession();
|
|
22
|
-
|
|
23
|
-
|
|
42
|
+
return () => {
|
|
43
|
+
authClient.stopHeartbeat();
|
|
44
|
+
};
|
|
45
|
+
}, [authClient, config.enableHeartbeat]);
|
|
46
|
+
const logout = useCallback(async () => {
|
|
47
|
+
authClient.stopHeartbeat();
|
|
48
|
+
setIsHeartbeatActive(false);
|
|
24
49
|
await authClient.logout();
|
|
25
50
|
setSession(null);
|
|
26
|
-
|
|
51
|
+
setRevokedError(null);
|
|
52
|
+
}, [authClient]);
|
|
53
|
+
const startHeartbeat = useCallback(() => {
|
|
54
|
+
authClient.startHeartbeat();
|
|
55
|
+
setIsHeartbeatActive(authClient.isHeartbeatActive());
|
|
56
|
+
}, [authClient]);
|
|
57
|
+
const stopHeartbeat = useCallback(() => {
|
|
58
|
+
authClient.stopHeartbeat();
|
|
59
|
+
setIsHeartbeatActive(false);
|
|
60
|
+
}, [authClient]);
|
|
27
61
|
return {
|
|
28
62
|
session,
|
|
29
63
|
loading,
|
|
@@ -33,6 +67,11 @@ export function useTGTAuth(config) {
|
|
|
33
67
|
hasAccessToApp: authClient.hasAccessToApp.bind(authClient),
|
|
34
68
|
tenantId: authClient.getTenantId(),
|
|
35
69
|
authClient,
|
|
70
|
+
revokedError,
|
|
71
|
+
isHeartbeatActive,
|
|
72
|
+
startHeartbeat,
|
|
73
|
+
stopHeartbeat,
|
|
36
74
|
};
|
|
37
75
|
}
|
|
76
|
+
export default useTGTAuth;
|
|
38
77
|
//# sourceMappingURL=react-hook.js.map
|
package/dist/react-hook.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-hook.js","sourceRoot":"","sources":["../react-hook.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"react-hook.js","sourceRoot":"","sources":["../react-hook.tsx"],"names":[],"mappings":"AA4BA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,aAAa,EAAwC,MAAM,sBAAsB,CAAC;AAqH3F,MAAM,UAAU,UAAU,CAAC,MAAwB;IACjD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAoB,IAAI,CAAC,CAAC;IAChE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAmB,IAAI,CAAC,CAAC;IACzE,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAGlE,MAAM,SAAS,GAAG,MAAM,CAAuB,IAAI,CAAC,CAAC;IAGrD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,EAAE,eAAe,GAAG,IAAI,EAAE,gBAAgB,GAAG,KAAK,EAAE,GAAG,UAAU,EAAE,GAAG,MAAM,CAAC;QAGnF,MAAM,WAAW,GAAkB;YACjC,GAAG,UAAU;YACb,gBAAgB,EAAE,gBAAgB;gBAChC,CAAC,CAAC,CAAC,KAAgB,EAAE,EAAE;oBACnB,eAAe,CAAC,KAAK,CAAC,CAAC;oBACvB,UAAU,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;gBACH,CAAC,CAAC,UAAU,CAAC,gBAAgB;SAChC,CAAC;QAEF,SAAS,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC;IAErC,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,UAAU,eAAe;YAC5B,IAAI,CAAC;gBACH,MAAM,oBAAoB,GAAG,MAAM,UAAU,CAAC,YAAY,EAAE,CAAC;gBAC7D,UAAU,CAAC,oBAAoB,CAAC,CAAC;gBAGjC,IAAI,oBAAoB,IAAI,MAAM,CAAC,eAAe,KAAK,KAAK,EAAE,CAAC;oBAC7D,UAAU,CAAC,cAAc,EAAE,CAAC;oBAC5B,oBAAoB,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;gBAC7D,UAAU,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;oBAAS,CAAC;gBACT,UAAU,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QAED,eAAe,EAAE,CAAC;QAGlB,OAAO,GAAG,EAAE;YACV,UAAU,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACpC,UAAU,CAAC,aAAa,EAAE,CAAC;QAC3B,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;QAC1B,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,eAAe,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,UAAU,CAAC,cAAc,EAAE,CAAC;QAC5B,oBAAoB,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACvD,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;QACrC,UAAU,CAAC,aAAa,EAAE,CAAC;QAC3B,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,OAAO;QACL,OAAO;QACP,OAAO;QACP,MAAM;QACN,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QAC5C,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;QAC9C,cAAc,EAAE,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC;QAC1D,QAAQ,EAAE,UAAU,CAAC,WAAW,EAAE;QAClC,UAAU;QACV,YAAY;QACZ,iBAAiB;QACjB,cAAc;QACd,aAAa;KACd,CAAC;AACJ,CAAC;AAED,eAAe,UAAU,CAAC"}
|
|
@@ -31,13 +31,20 @@ export interface TGTAuthConfig {
|
|
|
31
31
|
identityUrl: string;
|
|
32
32
|
appDomain: string;
|
|
33
33
|
onAuthSuccess?: (session: TGTSession) => void;
|
|
34
|
-
onAuthFailure?: () => void;
|
|
34
|
+
onAuthFailure?: (error?: AuthError) => void;
|
|
35
|
+
onSessionRevoked?: (error: AuthError) => void;
|
|
35
36
|
debug?: boolean;
|
|
36
37
|
allowedRedirectHosts?: string[];
|
|
38
|
+
heartbeatIntervalMs?: number;
|
|
37
39
|
}
|
|
38
40
|
export interface SessionResponse {
|
|
39
41
|
user: TGTUser;
|
|
40
42
|
}
|
|
43
|
+
export type AuthErrorCode = 'TENANT_INACTIVE' | 'USER_INACTIVE' | 'USER_NOT_FOUND' | 'APP_SUBSCRIPTION_LOCKED' | 'TRIAL_EXPIRED';
|
|
44
|
+
export interface AuthError {
|
|
45
|
+
code: AuthErrorCode;
|
|
46
|
+
message: string;
|
|
47
|
+
}
|
|
41
48
|
export interface SignupData {
|
|
42
49
|
email: string;
|
|
43
50
|
password?: string;
|
|
@@ -48,6 +55,7 @@ export interface SignupData {
|
|
|
48
55
|
export interface LoginData {
|
|
49
56
|
email: string;
|
|
50
57
|
password: string;
|
|
58
|
+
targetApp?: string;
|
|
51
59
|
}
|
|
52
60
|
export interface AuthResponse {
|
|
53
61
|
token: string;
|
|
@@ -67,10 +75,13 @@ export interface AuthResponse {
|
|
|
67
75
|
export declare class TGTAuthClient {
|
|
68
76
|
private static readonly TOKEN_KEY;
|
|
69
77
|
private static readonly TEMP_TOKEN_KEY;
|
|
78
|
+
private static readonly DEFAULT_HEARTBEAT_INTERVAL_MS;
|
|
70
79
|
private config;
|
|
71
80
|
private currentUser;
|
|
72
81
|
private currentSession;
|
|
73
82
|
private allowedRedirectHosts;
|
|
83
|
+
private heartbeatTimer;
|
|
84
|
+
private isHeartbeatRunning;
|
|
74
85
|
constructor(config: TGTAuthConfig);
|
|
75
86
|
signup(data: SignupData): Promise<AuthResponse>;
|
|
76
87
|
login(data: LoginData): Promise<AuthResponse>;
|
|
@@ -87,8 +98,16 @@ export declare class TGTAuthClient {
|
|
|
87
98
|
hasRole(appName: string, roleName: string): boolean;
|
|
88
99
|
getRoles(appName: string): string[];
|
|
89
100
|
hasAccessToApp(appName: string): boolean;
|
|
101
|
+
startHeartbeat(): void;
|
|
102
|
+
stopHeartbeat(): void;
|
|
103
|
+
isHeartbeatActive(): boolean;
|
|
104
|
+
getBlockedRedirectUrl(error: AuthError): string;
|
|
105
|
+
private handleSessionRevoked;
|
|
106
|
+
private isRevocationError;
|
|
107
|
+
private mapErrorCodeToBlockedType;
|
|
90
108
|
private getTokenFromUrl;
|
|
91
109
|
private removeTokenFromUrl;
|
|
110
|
+
private getCurrentAppKey;
|
|
92
111
|
private storeToken;
|
|
93
112
|
private getStoredToken;
|
|
94
113
|
private clearStoredToken;
|
|
@@ -99,5 +118,7 @@ export declare class TGTAuthClient {
|
|
|
99
118
|
private log;
|
|
100
119
|
}
|
|
101
120
|
export declare function useTGTAuth(config: TGTAuthConfig): void;
|
|
121
|
+
export declare const REVOCATION_ERROR_CODES: AuthErrorCode[];
|
|
122
|
+
export declare function isRevocationError(code: AuthErrorCode): boolean;
|
|
102
123
|
export default TGTAuthClient;
|
|
103
124
|
//# sourceMappingURL=tgtone-auth-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tgtone-auth-client.d.ts","sourceRoot":"","sources":["../tgtone-auth-client.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IAEnB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAK5B,WAAW,EAAE,MAAM,CAAC;IAMpB,SAAS,EAAE,MAAM,CAAC;IAMlB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IAM9C,aAAa,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"tgtone-auth-client.d.ts","sourceRoot":"","sources":["../tgtone-auth-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,15 +4,23 @@ export class TGTAuthClient {
|
|
|
4
4
|
this.currentUser = null;
|
|
5
5
|
this.currentSession = null;
|
|
6
6
|
this.allowedRedirectHosts = [];
|
|
7
|
+
this.heartbeatTimer = null;
|
|
8
|
+
this.isHeartbeatRunning = false;
|
|
7
9
|
this.config = {
|
|
8
10
|
onAuthSuccess: () => { },
|
|
9
11
|
onAuthFailure: () => { },
|
|
12
|
+
onSessionRevoked: undefined,
|
|
10
13
|
debug: false,
|
|
14
|
+
heartbeatIntervalMs: TGTAuthClient.DEFAULT_HEARTBEAT_INTERVAL_MS,
|
|
11
15
|
...config,
|
|
12
16
|
allowedRedirectHosts: config.allowedRedirectHosts ?? [config.appDomain],
|
|
13
17
|
};
|
|
14
18
|
this.allowedRedirectHosts = this.config.allowedRedirectHosts || [this.config.appDomain];
|
|
15
|
-
this.log('🔹 TGT Auth Client inicializado',
|
|
19
|
+
this.log('🔹 TGT Auth Client inicializado', {
|
|
20
|
+
identityUrl: this.config.identityUrl,
|
|
21
|
+
appDomain: this.config.appDomain,
|
|
22
|
+
heartbeatIntervalMs: this.config.heartbeatIntervalMs,
|
|
23
|
+
});
|
|
16
24
|
}
|
|
17
25
|
async signup(data) {
|
|
18
26
|
try {
|
|
@@ -62,12 +70,16 @@ export class TGTAuthClient {
|
|
|
62
70
|
async login(data) {
|
|
63
71
|
try {
|
|
64
72
|
this.log('🔹 Iniciando sesión...');
|
|
73
|
+
const targetApp = data.targetApp || this.getCurrentAppKey();
|
|
65
74
|
const response = await fetch(`${this.config.identityUrl}/api/v1/auth/login`, {
|
|
66
75
|
method: 'POST',
|
|
67
76
|
headers: {
|
|
68
77
|
'Content-Type': 'application/json',
|
|
69
78
|
},
|
|
70
|
-
body: JSON.stringify(
|
|
79
|
+
body: JSON.stringify({
|
|
80
|
+
...data,
|
|
81
|
+
...(targetApp ? { targetApp } : {}),
|
|
82
|
+
}),
|
|
71
83
|
});
|
|
72
84
|
if (!response.ok) {
|
|
73
85
|
const error = await response.json().catch(() => ({ message: 'Credenciales inválidas' }));
|
|
@@ -158,7 +170,11 @@ export class TGTAuthClient {
|
|
|
158
170
|
this.log('🔹 Expira:', expiresAt);
|
|
159
171
|
this.log('🔹 Roles:', decoded.roles);
|
|
160
172
|
this.log('🔹 Verificando sesión con backend...');
|
|
161
|
-
const
|
|
173
|
+
const appKey = this.getCurrentAppKey();
|
|
174
|
+
const meUrl = appKey
|
|
175
|
+
? `${this.config.identityUrl}/api/v1/auth/me?app=${encodeURIComponent(appKey)}`
|
|
176
|
+
: `${this.config.identityUrl}/api/v1/auth/me`;
|
|
177
|
+
const response = await fetch(meUrl, {
|
|
162
178
|
method: 'GET',
|
|
163
179
|
headers: {
|
|
164
180
|
'Content-Type': 'application/json',
|
|
@@ -167,8 +183,21 @@ export class TGTAuthClient {
|
|
|
167
183
|
});
|
|
168
184
|
if (!response.ok) {
|
|
169
185
|
this.log('❌ Backend rechazó el token (HTTP', response.status, ')');
|
|
186
|
+
let authError;
|
|
187
|
+
try {
|
|
188
|
+
const errorData = await response.json();
|
|
189
|
+
if (errorData.code && errorData.message) {
|
|
190
|
+
authError = {
|
|
191
|
+
code: errorData.code,
|
|
192
|
+
message: errorData.message,
|
|
193
|
+
};
|
|
194
|
+
this.log('❌ Error de autenticación:', authError.code, '-', authError.message);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
}
|
|
170
199
|
this.clearStoredToken();
|
|
171
|
-
this.handleNoSession();
|
|
200
|
+
this.handleNoSession(authError);
|
|
172
201
|
return null;
|
|
173
202
|
}
|
|
174
203
|
const data = await response.json();
|
|
@@ -266,7 +295,11 @@ Posibles causas:
|
|
|
266
295
|
}
|
|
267
296
|
if (validateWithServer) {
|
|
268
297
|
try {
|
|
269
|
-
const
|
|
298
|
+
const appKey = this.getCurrentAppKey();
|
|
299
|
+
const meUrl = appKey
|
|
300
|
+
? `${this.config.identityUrl}/api/v1/auth/me?app=${encodeURIComponent(appKey)}`
|
|
301
|
+
: `${this.config.identityUrl}/api/v1/auth/me`;
|
|
302
|
+
const response = await fetch(meUrl, {
|
|
270
303
|
method: 'GET',
|
|
271
304
|
headers: {
|
|
272
305
|
'Content-Type': 'application/json',
|
|
@@ -416,6 +449,108 @@ Posibles causas:
|
|
|
416
449
|
hasAccessToApp(appName) {
|
|
417
450
|
return this.getRoles(appName).length > 0;
|
|
418
451
|
}
|
|
452
|
+
startHeartbeat() {
|
|
453
|
+
if (this.config.heartbeatIntervalMs === 0) {
|
|
454
|
+
this.log('🔹 Heartbeat deshabilitado (interval = 0)');
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
457
|
+
if (this.isHeartbeatRunning) {
|
|
458
|
+
this.log('⚠️ Heartbeat ya está corriendo');
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
461
|
+
this.log(`🔹 Iniciando heartbeat cada ${this.config.heartbeatIntervalMs / 1000}s`);
|
|
462
|
+
this.isHeartbeatRunning = true;
|
|
463
|
+
this.heartbeatTimer = setInterval(async () => {
|
|
464
|
+
try {
|
|
465
|
+
this.log('💓 Heartbeat: verificando sesión...');
|
|
466
|
+
const token = this.getStoredToken();
|
|
467
|
+
if (!token) {
|
|
468
|
+
this.log('💓 Heartbeat: no hay token, deteniendo');
|
|
469
|
+
this.stopHeartbeat();
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
const appKey = this.getCurrentAppKey();
|
|
473
|
+
const meUrl = appKey
|
|
474
|
+
? `${this.config.identityUrl}/api/v1/auth/me?app=${encodeURIComponent(appKey)}`
|
|
475
|
+
: `${this.config.identityUrl}/api/v1/auth/me`;
|
|
476
|
+
const response = await fetch(meUrl, {
|
|
477
|
+
method: 'GET',
|
|
478
|
+
headers: {
|
|
479
|
+
'Content-Type': 'application/json',
|
|
480
|
+
'Authorization': `Bearer ${token}`,
|
|
481
|
+
},
|
|
482
|
+
});
|
|
483
|
+
if (!response.ok) {
|
|
484
|
+
this.log('💓 Heartbeat: sesión rechazada (HTTP', response.status, ')');
|
|
485
|
+
let authError;
|
|
486
|
+
try {
|
|
487
|
+
const errorData = await response.json();
|
|
488
|
+
if (errorData.code && errorData.message) {
|
|
489
|
+
authError = {
|
|
490
|
+
code: errorData.code,
|
|
491
|
+
message: errorData.message,
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
catch {
|
|
496
|
+
}
|
|
497
|
+
if (authError && this.isRevocationError(authError.code)) {
|
|
498
|
+
this.log('💓 Heartbeat: sesión revocada:', authError.code);
|
|
499
|
+
this.stopHeartbeat();
|
|
500
|
+
this.handleSessionRevoked(authError);
|
|
501
|
+
}
|
|
502
|
+
return;
|
|
503
|
+
}
|
|
504
|
+
this.log('💓 Heartbeat: sesión OK');
|
|
505
|
+
}
|
|
506
|
+
catch (error) {
|
|
507
|
+
this.log('💓 Heartbeat: error de red (ignorando):', error);
|
|
508
|
+
}
|
|
509
|
+
}, this.config.heartbeatIntervalMs);
|
|
510
|
+
}
|
|
511
|
+
stopHeartbeat() {
|
|
512
|
+
if (this.heartbeatTimer) {
|
|
513
|
+
clearInterval(this.heartbeatTimer);
|
|
514
|
+
this.heartbeatTimer = null;
|
|
515
|
+
this.isHeartbeatRunning = false;
|
|
516
|
+
this.log('🔹 Heartbeat detenido');
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
isHeartbeatActive() {
|
|
520
|
+
return this.isHeartbeatRunning;
|
|
521
|
+
}
|
|
522
|
+
getBlockedRedirectUrl(error) {
|
|
523
|
+
const type = this.mapErrorCodeToBlockedType(error.code);
|
|
524
|
+
return `${this.config.identityUrl}/blocked?type=${type}&message=${encodeURIComponent(error.message)}`;
|
|
525
|
+
}
|
|
526
|
+
handleSessionRevoked(error) {
|
|
527
|
+
this.log('🚫 Sesión revocada:', error.code, '-', error.message);
|
|
528
|
+
this.currentUser = null;
|
|
529
|
+
this.currentSession = null;
|
|
530
|
+
this.clearStoredToken();
|
|
531
|
+
this.clearTempToken();
|
|
532
|
+
if (this.config.onSessionRevoked) {
|
|
533
|
+
this.config.onSessionRevoked(error);
|
|
534
|
+
}
|
|
535
|
+
else {
|
|
536
|
+
const blockedUrl = this.getBlockedRedirectUrl(error);
|
|
537
|
+
this.log('🔄 Redirigiendo a blocked:', blockedUrl);
|
|
538
|
+
window.location.href = blockedUrl;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
isRevocationError(code) {
|
|
542
|
+
return ['TENANT_INACTIVE', 'USER_INACTIVE', 'USER_NOT_FOUND'].includes(code);
|
|
543
|
+
}
|
|
544
|
+
mapErrorCodeToBlockedType(code) {
|
|
545
|
+
const mapping = {
|
|
546
|
+
'TENANT_INACTIVE': 'tenant',
|
|
547
|
+
'USER_INACTIVE': 'user',
|
|
548
|
+
'USER_NOT_FOUND': 'user',
|
|
549
|
+
'APP_SUBSCRIPTION_LOCKED': 'subscription',
|
|
550
|
+
'TRIAL_EXPIRED': 'trial',
|
|
551
|
+
};
|
|
552
|
+
return mapping[code] || 'unknown';
|
|
553
|
+
}
|
|
419
554
|
getTokenFromUrl() {
|
|
420
555
|
if (typeof window === 'undefined')
|
|
421
556
|
return null;
|
|
@@ -429,6 +564,17 @@ Posibles causas:
|
|
|
429
564
|
url.searchParams.delete('token');
|
|
430
565
|
window.history.replaceState({}, '', url.toString());
|
|
431
566
|
}
|
|
567
|
+
getCurrentAppKey() {
|
|
568
|
+
const host = this.config.appDomain?.split(':')[0]?.toLowerCase();
|
|
569
|
+
if (!host || host === 'localhost' || host === '127.0.0.1') {
|
|
570
|
+
return undefined;
|
|
571
|
+
}
|
|
572
|
+
const parts = host.split('.').filter(Boolean);
|
|
573
|
+
if (parts.length < 3) {
|
|
574
|
+
return undefined;
|
|
575
|
+
}
|
|
576
|
+
return parts[0];
|
|
577
|
+
}
|
|
432
578
|
storeToken(token) {
|
|
433
579
|
if (typeof window === 'undefined')
|
|
434
580
|
return;
|
|
@@ -495,8 +641,8 @@ Posibles causas:
|
|
|
495
641
|
this.log('❌ Error eliminando token temporal:', error);
|
|
496
642
|
}
|
|
497
643
|
}
|
|
498
|
-
handleNoSession() {
|
|
499
|
-
this.config.onAuthFailure();
|
|
644
|
+
handleNoSession(error) {
|
|
645
|
+
this.config.onAuthFailure(error);
|
|
500
646
|
this.redirectToLogin();
|
|
501
647
|
}
|
|
502
648
|
log(...args) {
|
|
@@ -507,8 +653,17 @@ Posibles causas:
|
|
|
507
653
|
}
|
|
508
654
|
TGTAuthClient.TOKEN_KEY = 'tgtone_auth_token';
|
|
509
655
|
TGTAuthClient.TEMP_TOKEN_KEY = 'tgtone_temp_token';
|
|
656
|
+
TGTAuthClient.DEFAULT_HEARTBEAT_INTERVAL_MS = 5 * 60 * 1000;
|
|
510
657
|
export function useTGTAuth(config) {
|
|
511
658
|
throw new Error('useTGTAuth requiere React. Importa desde tgtone-auth-client/react');
|
|
512
659
|
}
|
|
660
|
+
export const REVOCATION_ERROR_CODES = [
|
|
661
|
+
'TENANT_INACTIVE',
|
|
662
|
+
'USER_INACTIVE',
|
|
663
|
+
'USER_NOT_FOUND',
|
|
664
|
+
];
|
|
665
|
+
export function isRevocationError(code) {
|
|
666
|
+
return REVOCATION_ERROR_CODES.includes(code);
|
|
667
|
+
}
|
|
513
668
|
export default TGTAuthClient;
|
|
514
669
|
//# sourceMappingURL=tgtone-auth-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tgtone-auth-client.js","sourceRoot":"","sources":["../tgtone-auth-client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tgtone-auth-client.js","sourceRoot":"","sources":["../tgtone-auth-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -115,7 +115,15 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
|
|
115
115
|
getToken,
|
|
116
116
|
isAuthenticated: !!session
|
|
117
117
|
}}>
|
|
118
|
-
{
|
|
118
|
+
{/* ⚠️ CRÍTICO: No renderizar hijos mientras carga para evitar que el Router
|
|
119
|
+
limpie los parámetros de la URL (?token=...) antes de que el SDK los procese */}
|
|
120
|
+
{loading ? (
|
|
121
|
+
<div className="flex items-center justify-center min-h-screen">
|
|
122
|
+
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-primary"></div>
|
|
123
|
+
</div>
|
|
124
|
+
) : (
|
|
125
|
+
children
|
|
126
|
+
)}
|
|
119
127
|
</AuthContext.Provider>
|
|
120
128
|
);
|
|
121
129
|
}
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
# Guía de Migración a v1.3.0 - Session Revocation
|
|
2
|
+
|
|
3
|
+
Esta guía explica cómo migrar tus aplicaciones existentes para usar las nuevas funcionalidades de detección de sesión revocada.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 📋 Resumen de Cambios
|
|
8
|
+
|
|
9
|
+
| Feature | Descripción |
|
|
10
|
+
|---------|-------------|
|
|
11
|
+
| `onSessionRevoked` | Callback ejecutado cuando usuario/tenant es eliminado |
|
|
12
|
+
| `heartbeatIntervalMs` | Intervalo de validación periódica de sesión |
|
|
13
|
+
| `startHeartbeat()` / `stopHeartbeat()` | Control manual del heartbeat |
|
|
14
|
+
| `getBlockedRedirectUrl()` | Genera URL de redirección para sesión revocada |
|
|
15
|
+
| `createAxiosInterceptor()` | Interceptor para Axios que maneja 401 |
|
|
16
|
+
| `createAuthFetch()` | Wrapper de fetch con manejo de sesión |
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 🔄 Migración por Tipo de App
|
|
21
|
+
|
|
22
|
+
### 1. Apps React con Context (Console, Baco, Zenith)
|
|
23
|
+
|
|
24
|
+
**Antes (v1.2.x):**
|
|
25
|
+
```tsx
|
|
26
|
+
// src/lib/auth-client.ts
|
|
27
|
+
import { TGTAuthClient } from '@tgtone/auth-sdk';
|
|
28
|
+
|
|
29
|
+
export const authClient = new TGTAuthClient({
|
|
30
|
+
identityUrl: 'https://identity.tgtone.cl',
|
|
31
|
+
appDomain: window.location.host,
|
|
32
|
+
debug: import.meta.env.DEV,
|
|
33
|
+
onAuthFailure: (error) => {
|
|
34
|
+
if (error?.code) {
|
|
35
|
+
window.location.href = `${identityUrl}/login?error=${error.code.toLowerCase()}`;
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Después (v1.3.0):**
|
|
42
|
+
```tsx
|
|
43
|
+
// src/lib/auth-client.ts
|
|
44
|
+
import { TGTAuthClient, AuthError, isRevocationError } from '@tgtone/auth-sdk';
|
|
45
|
+
|
|
46
|
+
const identityUrl = import.meta.env.VITE_IDENTITY_URL || 'https://identity.tgtone.cl';
|
|
47
|
+
|
|
48
|
+
export const authClient = new TGTAuthClient({
|
|
49
|
+
identityUrl,
|
|
50
|
+
appDomain: window.location.host,
|
|
51
|
+
debug: import.meta.env.DEV,
|
|
52
|
+
|
|
53
|
+
// 🆕 Validar sesión cada 5 minutos
|
|
54
|
+
heartbeatIntervalMs: 5 * 60 * 1000,
|
|
55
|
+
|
|
56
|
+
onAuthFailure: (error) => {
|
|
57
|
+
if (error?.code) {
|
|
58
|
+
window.location.href = `${identityUrl}/login?error=${error.code.toLowerCase()}`;
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
// 🆕 Manejar sesión revocada
|
|
63
|
+
onSessionRevoked: (error: AuthError) => {
|
|
64
|
+
console.log('[Auth] Sesión revocada:', error.code, error.message);
|
|
65
|
+
const blockedUrl = authClient.getBlockedRedirectUrl(error);
|
|
66
|
+
window.location.href = blockedUrl;
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 2. Apps con Hook useTGTAuth
|
|
72
|
+
|
|
73
|
+
**Antes (v1.2.x):**
|
|
74
|
+
```tsx
|
|
75
|
+
import { useTGTAuth } from '@tgtone/auth-sdk';
|
|
76
|
+
|
|
77
|
+
function App() {
|
|
78
|
+
const { session, loading, logout } = useTGTAuth({
|
|
79
|
+
identityUrl: 'https://identity.tgtone.cl',
|
|
80
|
+
appDomain: 'zenith.tgtone.cl',
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
// ...
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**Después (v1.3.0):**
|
|
88
|
+
```tsx
|
|
89
|
+
import { useTGTAuth } from '@tgtone/auth-sdk';
|
|
90
|
+
|
|
91
|
+
function App() {
|
|
92
|
+
const {
|
|
93
|
+
session,
|
|
94
|
+
loading,
|
|
95
|
+
logout,
|
|
96
|
+
revokedError, // 🆕 Error de sesión revocada
|
|
97
|
+
isHeartbeatActive // 🆕 Estado del heartbeat
|
|
98
|
+
} = useTGTAuth({
|
|
99
|
+
identityUrl: 'https://identity.tgtone.cl',
|
|
100
|
+
appDomain: 'zenith.tgtone.cl',
|
|
101
|
+
enableHeartbeat: true, // 🆕 Default: true
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
// El heartbeat se inicia automáticamente después del login
|
|
105
|
+
// ...
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 3. Landing Pages (sin redirección automática)
|
|
110
|
+
|
|
111
|
+
**Después (v1.3.0):**
|
|
112
|
+
```tsx
|
|
113
|
+
import { useTGTAuth } from '@tgtone/auth-sdk';
|
|
114
|
+
|
|
115
|
+
function LandingApp() {
|
|
116
|
+
const { session, loading, revokedError } = useTGTAuth({
|
|
117
|
+
identityUrl: 'https://identity.tgtone.cl',
|
|
118
|
+
appDomain: 'tgtone.cl',
|
|
119
|
+
showRevokedState: true, // 🆕 No redirigir, mostrar estado
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
if (loading) return <Spinner />;
|
|
123
|
+
|
|
124
|
+
// 🆕 Manejar sesión revocada con UI personalizado
|
|
125
|
+
if (revokedError) {
|
|
126
|
+
return (
|
|
127
|
+
<RevokedSessionPage
|
|
128
|
+
error={revokedError}
|
|
129
|
+
onContactSupport={() => window.open('mailto:soporte@tgtone.cl')}
|
|
130
|
+
/>
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (!session) {
|
|
135
|
+
return <PublicLanding onLogin={() => authClient.redirectToLogin()} />;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return <PrivateContent user={session.user} />;
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 4. Apps con Axios
|
|
143
|
+
|
|
144
|
+
**Después (v1.3.0):**
|
|
145
|
+
```tsx
|
|
146
|
+
import axios from 'axios';
|
|
147
|
+
import { createAxiosInterceptor } from '@tgtone/auth-sdk/interceptor';
|
|
148
|
+
import { authClient } from './lib/auth-client';
|
|
149
|
+
|
|
150
|
+
const api = axios.create({
|
|
151
|
+
baseURL: '/api',
|
|
152
|
+
headers: { 'Content-Type': 'application/json' }
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
// 🆕 Configurar interceptor
|
|
156
|
+
const removeInterceptor = createAxiosInterceptor(api, authClient, {
|
|
157
|
+
handleRevoked: true,
|
|
158
|
+
excludeUrls: ['/public/health', '/public/metrics'],
|
|
159
|
+
onAuthError: (error) => {
|
|
160
|
+
// Opcional: logging, analytics
|
|
161
|
+
console.error('Auth error:', error.code);
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
export default api;
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### 5. Apps con Fetch nativo
|
|
169
|
+
|
|
170
|
+
**Después (v1.3.0):**
|
|
171
|
+
```tsx
|
|
172
|
+
import { createAuthFetch } from '@tgtone/auth-sdk/interceptor';
|
|
173
|
+
import { authClient } from './lib/auth-client';
|
|
174
|
+
|
|
175
|
+
// 🆕 Crear fetch con autenticación automática
|
|
176
|
+
const authFetch = createAuthFetch(authClient, {
|
|
177
|
+
handleRevoked: true,
|
|
178
|
+
excludeUrls: ['/public/'],
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
// Uso igual que fetch nativo
|
|
182
|
+
const response = await authFetch('/api/users');
|
|
183
|
+
const data = await response.json();
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## 🎯 Casos de Uso por Escenario
|
|
189
|
+
|
|
190
|
+
### Escenario 1: Usuario eliminado mientras trabaja
|
|
191
|
+
|
|
192
|
+
```
|
|
193
|
+
1. Admin elimina usuario desde Console
|
|
194
|
+
2. Usuario hace request API o heartbeat se ejecuta
|
|
195
|
+
3. Backend retorna 401 + USER_NOT_FOUND
|
|
196
|
+
4. SDK detecta error de revocación
|
|
197
|
+
5. Se ejecuta onSessionRevoked callback
|
|
198
|
+
6. Usuario es redirigido a /blocked?type=user
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Escenario 2: Tenant suspendido
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
1. Se suspende el tenant (falta de pago, etc.)
|
|
205
|
+
2. Usuario continúa trabajando
|
|
206
|
+
3. Heartbeat detecta TENANT_INACTIVE
|
|
207
|
+
4. Usuario es redirigido a /blocked?type=tenant
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Escenario 3: Usuario desactivado
|
|
211
|
+
|
|
212
|
+
```
|
|
213
|
+
1. Admin desactiva usuario
|
|
214
|
+
2. Backend retorna USER_INACTIVE
|
|
215
|
+
3. Usuario ve página de blocked con mensaje apropiado
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## ⚙️ Configuración Avanzada
|
|
221
|
+
|
|
222
|
+
### Deshabilitar Heartbeat
|
|
223
|
+
|
|
224
|
+
```tsx
|
|
225
|
+
const authClient = new TGTAuthClient({
|
|
226
|
+
// ...
|
|
227
|
+
heartbeatIntervalMs: 0, // Deshabilitado
|
|
228
|
+
});
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Heartbeat más frecuente (1 minuto)
|
|
232
|
+
|
|
233
|
+
```tsx
|
|
234
|
+
const authClient = new TGTAuthClient({
|
|
235
|
+
// ...
|
|
236
|
+
heartbeatIntervalMs: 60 * 1000, // 1 minuto
|
|
237
|
+
});
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Callback personalizado sin redirección
|
|
241
|
+
|
|
242
|
+
```tsx
|
|
243
|
+
const authClient = new TGTAuthClient({
|
|
244
|
+
// ...
|
|
245
|
+
onSessionRevoked: (error) => {
|
|
246
|
+
// Loguear para analytics
|
|
247
|
+
analytics.track('session_revoked', { code: error.code });
|
|
248
|
+
|
|
249
|
+
// Mostrar modal en lugar de redirigir
|
|
250
|
+
showSessionRevokedModal(error);
|
|
251
|
+
},
|
|
252
|
+
});
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## 🧪 Testing
|
|
258
|
+
|
|
259
|
+
### Simular sesión revocada
|
|
260
|
+
|
|
261
|
+
```typescript
|
|
262
|
+
// En desarrollo, puedes simular el error:
|
|
263
|
+
const testError = {
|
|
264
|
+
code: 'USER_NOT_FOUND' as AuthErrorCode,
|
|
265
|
+
message: 'El usuario ha sido eliminado',
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
authClient.onSessionRevoked?.(testError);
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### Verificar heartbeat
|
|
272
|
+
|
|
273
|
+
```typescript
|
|
274
|
+
// Verificar si está activo
|
|
275
|
+
console.log('Heartbeat activo:', authClient.isHeartbeatActive());
|
|
276
|
+
|
|
277
|
+
// Iniciar manualmente
|
|
278
|
+
authClient.startHeartbeat();
|
|
279
|
+
|
|
280
|
+
// Detener
|
|
281
|
+
authClient.stopHeartbeat();
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## 📦 Checklist de Migración
|
|
287
|
+
|
|
288
|
+
- [ ] Actualizar `@tgtone/auth-sdk` a `^1.3.0`
|
|
289
|
+
- [ ] Agregar `heartbeatIntervalMs` a la configuración
|
|
290
|
+
- [ ] Agregar `onSessionRevoked` callback
|
|
291
|
+
- [ ] (Opcional) Configurar interceptor Axios
|
|
292
|
+
- [ ] (Opcional) Actualizar hook useTGTAuth
|
|
293
|
+
- [ ] Probar flujo de sesión revocada
|
|
294
|
+
- [ ] Verificar redirección a `/blocked`
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## ❓ FAQ
|
|
299
|
+
|
|
300
|
+
**P: ¿El heartbeat afecta el rendimiento?**
|
|
301
|
+
R: No, es un request ligero cada 5 minutos por defecto.
|
|
302
|
+
|
|
303
|
+
**P: ¿Qué pasa si el backend está offline durante el heartbeat?**
|
|
304
|
+
R: El heartbeat ignora errores de red y reintenta en el próximo intervalo.
|
|
305
|
+
|
|
306
|
+
**P: ¿Puedo usar mi propia página de blocked?**
|
|
307
|
+
R: Sí, usa `onSessionRevoked` para manejar el error y mostrar tu propia UI.
|
|
308
|
+
|
|
309
|
+
**P: ¿Necesito configurar el interceptor si uso el heartbeat?**
|
|
310
|
+
R: No es obligatorio, pero recomendado para detectar errores en requests API también.
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
**Versión:** 1.3.0
|
|
315
|
+
**Última actualización:** 2026-03-26
|
package/package.json
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tgtone/auth-sdk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.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",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"build": "tsc",
|
|
9
9
|
"prepublishOnly": "npm run build",
|
|
10
|
-
"clean": "rm -rf dist"
|
|
10
|
+
"clean": "rm -rf dist",
|
|
11
|
+
"test": "jest",
|
|
12
|
+
"test:watch": "jest --watch",
|
|
13
|
+
"test:coverage": "jest --coverage"
|
|
11
14
|
},
|
|
12
15
|
"keywords": [
|
|
13
16
|
"sso",
|
|
@@ -37,7 +40,11 @@
|
|
|
37
40
|
"jwt-decode": "^4.0.0"
|
|
38
41
|
},
|
|
39
42
|
"devDependencies": {
|
|
43
|
+
"@types/jest": "^29.5.14",
|
|
40
44
|
"@types/react": "^18.2.0 || ^19.0.0",
|
|
45
|
+
"jest": "^29.7.0",
|
|
46
|
+
"jest-environment-jsdom": "^29.7.0",
|
|
47
|
+
"ts-jest": "^29.4.6",
|
|
41
48
|
"typescript": "^5.3.0"
|
|
42
49
|
},
|
|
43
50
|
"peerDependencies": {
|