@neodaten/auth-native 0.0.0-stage → 0.1.0

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 (104) hide show
  1. package/README.md +200 -2
  2. package/dist/almacen-con-desbloqueo.d.ts +19 -0
  3. package/dist/almacen-con-desbloqueo.js +117 -0
  4. package/dist/almacen-con-desbloqueo.js.map +1 -0
  5. package/dist/almacen-seguro.d.ts +5 -0
  6. package/dist/almacen-seguro.js +2 -0
  7. package/dist/almacen-seguro.js.map +1 -0
  8. package/dist/base64url.d.ts +3 -0
  9. package/dist/base64url.js +40 -0
  10. package/dist/base64url.js.map +1 -0
  11. package/dist/bienvenida/bienvenida-con-ultima-cuenta.d.ts +13 -0
  12. package/dist/bienvenida/bienvenida-con-ultima-cuenta.js +73 -0
  13. package/dist/bienvenida/bienvenida-con-ultima-cuenta.js.map +1 -0
  14. package/dist/bienvenida/estado-de-la-bienvenida.d.ts +14 -0
  15. package/dist/bienvenida/estado-de-la-bienvenida.js +18 -0
  16. package/dist/bienvenida/estado-de-la-bienvenida.js.map +1 -0
  17. package/dist/bienvenida/index.d.ts +5 -0
  18. package/dist/bienvenida/index.js +5 -0
  19. package/dist/bienvenida/index.js.map +1 -0
  20. package/dist/bienvenida/marca-de-la-bienvenida.d.ts +12 -0
  21. package/dist/bienvenida/marca-de-la-bienvenida.js +2 -0
  22. package/dist/bienvenida/marca-de-la-bienvenida.js.map +1 -0
  23. package/dist/bienvenida/textos-de-la-bienvenida.d.ts +9 -0
  24. package/dist/bienvenida/textos-de-la-bienvenida.js +12 -0
  25. package/dist/bienvenida/textos-de-la-bienvenida.js.map +1 -0
  26. package/dist/bienvenida/use-bienvenida.d.ts +13 -0
  27. package/dist/bienvenida/use-bienvenida.js +42 -0
  28. package/dist/bienvenida/use-bienvenida.js.map +1 -0
  29. package/dist/canal-del-canje.d.ts +3 -0
  30. package/dist/canal-del-canje.js +22 -0
  31. package/dist/canal-del-canje.js.map +1 -0
  32. package/dist/cliente-de-identidad-nativa.d.ts +32 -0
  33. package/dist/cliente-de-identidad-nativa.js +179 -0
  34. package/dist/cliente-de-identidad-nativa.js.map +1 -0
  35. package/dist/criptografia.d.ts +15 -0
  36. package/dist/criptografia.js +28 -0
  37. package/dist/criptografia.js.map +1 -0
  38. package/dist/error-de-identidad.d.ts +6 -0
  39. package/dist/error-de-identidad.js +29 -0
  40. package/dist/error-de-identidad.js.map +1 -0
  41. package/dist/expo/crear-almacen-expo.d.ts +17 -0
  42. package/dist/expo/crear-almacen-expo.js +30 -0
  43. package/dist/expo/crear-almacen-expo.js.map +1 -0
  44. package/dist/expo/index.d.ts +1 -0
  45. package/dist/expo/index.js +2 -0
  46. package/dist/expo/index.js.map +1 -0
  47. package/dist/index.d.ts +11 -0
  48. package/dist/index.js +9 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/keychain/crear-almacen-keychain.d.ts +34 -0
  51. package/dist/keychain/crear-almacen-keychain.js +46 -0
  52. package/dist/keychain/crear-almacen-keychain.js.map +1 -0
  53. package/dist/keychain/index.d.ts +1 -0
  54. package/dist/keychain/index.js +2 -0
  55. package/dist/keychain/index.js.map +1 -0
  56. package/dist/llaves-del-emisor.d.ts +4 -0
  57. package/dist/llaves-del-emisor.js +42 -0
  58. package/dist/llaves-del-emisor.js.map +1 -0
  59. package/dist/login-hospedado.d.ts +29 -0
  60. package/dist/login-hospedado.js +123 -0
  61. package/dist/login-hospedado.js.map +1 -0
  62. package/dist/navegacion-del-login.d.ts +20 -0
  63. package/dist/navegacion-del-login.js +27 -0
  64. package/dist/navegacion-del-login.js.map +1 -0
  65. package/dist/pantalla/index.d.ts +2 -0
  66. package/dist/pantalla/index.js +3 -0
  67. package/dist/pantalla/index.js.map +1 -0
  68. package/dist/pantalla/manejador-de-carga.d.ts +11 -0
  69. package/dist/pantalla/manejador-de-carga.js +12 -0
  70. package/dist/pantalla/manejador-de-carga.js.map +1 -0
  71. package/dist/pantalla/pantalla-de-login-hospedado.d.ts +6 -0
  72. package/dist/pantalla/pantalla-de-login-hospedado.js +30 -0
  73. package/dist/pantalla/pantalla-de-login-hospedado.js.map +1 -0
  74. package/dist/passkey-de-la-bienvenida.d.ts +20 -0
  75. package/dist/passkey-de-la-bienvenida.js +50 -0
  76. package/dist/passkey-de-la-bienvenida.js.map +1 -0
  77. package/dist/pkce.d.ts +8 -0
  78. package/dist/pkce.js +13 -0
  79. package/dist/pkce.js.map +1 -0
  80. package/dist/respuesta-del-emisor.d.ts +17 -0
  81. package/dist/respuesta-del-emisor.js +70 -0
  82. package/dist/respuesta-del-emisor.js.map +1 -0
  83. package/dist/sesion-guardada.d.ts +12 -0
  84. package/dist/sesion-guardada.js +44 -0
  85. package/dist/sesion-guardada.js.map +1 -0
  86. package/dist/sha256.d.ts +1 -0
  87. package/dist/sha256.js +84 -0
  88. package/dist/sha256.js.map +1 -0
  89. package/dist/textos-del-desbloqueo.d.ts +7 -0
  90. package/dist/textos-del-desbloqueo.js +7 -0
  91. package/dist/textos-del-desbloqueo.js.map +1 -0
  92. package/dist/ticket-de-atestacion.d.ts +21 -0
  93. package/dist/ticket-de-atestacion.js +33 -0
  94. package/dist/ticket-de-atestacion.js.map +1 -0
  95. package/dist/ultima-cuenta.d.ts +13 -0
  96. package/dist/ultima-cuenta.js +67 -0
  97. package/dist/ultima-cuenta.js.map +1 -0
  98. package/dist/validar-id-token.d.ts +15 -0
  99. package/dist/validar-id-token.js +86 -0
  100. package/dist/validar-id-token.js.map +1 -0
  101. package/dist/vuelo-unico.d.ts +1 -0
  102. package/dist/vuelo-unico.js +10 -0
  103. package/dist/vuelo-unico.js.map +1 -0
  104. package/package.json +61 -3
@@ -0,0 +1,42 @@
1
+ import { useCallback, useEffect, useState } from 'react';
2
+ import { ErrorDeIdentidad } from '../error-de-identidad';
3
+ import { estadoDeLaBienvenida, resultadoDelError, } from './estado-de-la-bienvenida';
4
+ const leerEstado = async (cliente) => estadoDeLaBienvenida(await cliente.ultimaCuenta(), await cliente.biometriaDeLaPasskey());
5
+ export function useBienvenida(cliente) {
6
+ const [estado, setEstado] = useState({ tipo: 'cargando' });
7
+ const [entrando, setEntrando] = useState(false);
8
+ const [error, setError] = useState(null);
9
+ useEffect(() => {
10
+ let vigente = true;
11
+ void leerEstado(cliente).then((leido) => {
12
+ if (vigente)
13
+ setEstado(leido);
14
+ });
15
+ return () => {
16
+ vigente = false;
17
+ };
18
+ }, [cliente]);
19
+ const entrarConPasskey = useCallback(async () => {
20
+ setEntrando(true);
21
+ setError(null);
22
+ try {
23
+ await cliente.entrarConPasskey();
24
+ return 'dentro';
25
+ }
26
+ catch (fallo) {
27
+ const resultado = resultadoDelError(fallo);
28
+ if (resultado === 'reintentar' && fallo instanceof ErrorDeIdentidad)
29
+ setError(fallo);
30
+ return resultado;
31
+ }
32
+ finally {
33
+ setEntrando(false);
34
+ }
35
+ }, [cliente]);
36
+ const usarOtraCuenta = useCallback(async () => {
37
+ await cliente.usarOtraCuenta();
38
+ setEstado({ tipo: 'sin_cuenta' });
39
+ }, [cliente]);
40
+ return { estado, entrando, error, entrarConPasskey, usarOtraCuenta };
41
+ }
42
+ //# sourceMappingURL=use-bienvenida.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-bienvenida.js","sourceRoot":"","sources":["../../src/bienvenida/use-bienvenida.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EACL,oBAAoB,EACpB,iBAAiB,GAGlB,MAAM,2BAA2B,CAAC;AAenC,MAAM,UAAU,GAAG,KAAK,EAAE,OAAgB,EAAiC,EAAE,CAC3E,oBAAoB,CAAC,MAAM,OAAO,CAAC,YAAY,EAAE,EAAE,MAAM,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;AAE3F,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAuB,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IACjF,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAA0B,IAAI,CAAC,CAAC;IAElE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YACtC,IAAI,OAAO;gBAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE;YACV,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,IAAmC,EAAE;QAC7E,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC;YACjC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,SAAS,KAAK,YAAY,IAAI,KAAK,YAAY,gBAAgB;gBAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrF,OAAO,SAAS,CAAC;QACnB,CAAC;gBAAS,CAAC;YACT,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC5C,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC;QAC/B,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC;AACvE,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const esCanalSeguro: (direccion: string, emisor: string) => boolean;
2
+ export declare const exigirCanalSeguroDelCanje: (tokenEndpoint: string, emisor: string) => void;
3
+ export declare const exigirOrigenDelLogin: (origen: string, emisor: string) => string;
@@ -0,0 +1,22 @@
1
+ import { ErrorDeIdentidad } from './error-de-identidad';
2
+ const HOSTS_LOCALES = new Set(['localhost', '127.0.0.1', '[::1]']);
3
+ const esLocal = (url) => HOSTS_LOCALES.has(url.hostname);
4
+ export const esCanalSeguro = (direccion, emisor) => {
5
+ if (!URL.canParse(direccion))
6
+ return false;
7
+ const url = new URL(direccion);
8
+ if (url.protocol === 'https:')
9
+ return true;
10
+ return url.protocol === 'http:' && esLocal(url) && esLocal(new URL(emisor));
11
+ };
12
+ export const exigirCanalSeguroDelCanje = (tokenEndpoint, emisor) => {
13
+ if (!esCanalSeguro(tokenEndpoint, emisor))
14
+ throw new ErrorDeIdentidad('canal_inseguro');
15
+ };
16
+ export const exigirOrigenDelLogin = (origen, emisor) => {
17
+ const esOrigen = URL.canParse(origen) && new URL(origen).origin === origen;
18
+ if (!esOrigen || !esCanalSeguro(origen, emisor))
19
+ throw new ErrorDeIdentidad('canal_inseguro');
20
+ return origen;
21
+ };
22
+ //# sourceMappingURL=canal-del-canje.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canal-del-canje.js","sourceRoot":"","sources":["../src/canal-del-canje.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAExF,MAAM,OAAO,GAAG,CAAC,GAAQ,EAAW,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAEvE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAiB,EAAE,MAAc,EAAW,EAAE;IAC1E,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,aAAqB,EAAE,MAAc,EAAQ,EAAE;IACvF,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC;QAAE,MAAM,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;AAC1F,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAc,EAAE,MAAc,EAAU,EAAE;IAC7E,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;IAC3E,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC;QAAE,MAAM,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAC9F,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { AlmacenSeguro } from './almacen-seguro';
2
+ import { type Criptografia } from './criptografia';
3
+ import { type LoginAbierto, type OpcionesDeApertura } from './login-hospedado';
4
+ import { type BiometriaDelDispositivo, type ProveedorDePasskey } from './passkey-de-la-bienvenida';
5
+ import type { ProveedorDeAtestacion } from './ticket-de-atestacion';
6
+ import { type UltimaCuenta } from './ultima-cuenta';
7
+ export interface OpcionesDelCliente {
8
+ emisor: string;
9
+ coreApiUrl: string;
10
+ clienteId: string;
11
+ recurso: string;
12
+ redireccion: string;
13
+ almacen: AlmacenSeguro;
14
+ origenDelLogin?: string;
15
+ alcance?: string;
16
+ proveedorDeAtestacion?: ProveedorDeAtestacion;
17
+ proveedorDePasskey?: ProveedorDePasskey;
18
+ criptografia?: Criptografia;
19
+ fetch?: typeof fetch;
20
+ ahora?: () => number;
21
+ }
22
+ export interface ClienteDeIdentidadNativa {
23
+ abrirLoginHospedado(opciones?: OpcionesDeApertura): Promise<LoginAbierto>;
24
+ tokenDeAcceso(): Promise<string | null>;
25
+ renovar(): Promise<string | null>;
26
+ cerrarSesion(): Promise<void>;
27
+ entrarConPasskey(): Promise<void>;
28
+ biometriaDeLaPasskey(): Promise<BiometriaDelDispositivo | null>;
29
+ ultimaCuenta(): Promise<UltimaCuenta | null>;
30
+ usarOtraCuenta(): Promise<void>;
31
+ }
32
+ export declare function crearClienteDeIdentidadNativa({ emisor, coreApiUrl, clienteId, recurso, redireccion, almacen, origenDelLogin, alcance, proveedorDeAtestacion, proveedorDePasskey, criptografia, fetch: hacerFetch, ahora, }: OpcionesDelCliente): ClienteDeIdentidadNativa;
@@ -0,0 +1,179 @@
1
+ import { exigirCanalSeguroDelCanje } from './canal-del-canje';
2
+ import { criptografiaDelEntorno } from './criptografia';
3
+ import { ErrorDeIdentidad, esErrorDeDesbloqueo } from './error-de-identidad';
4
+ import { crearLlavesDelEmisor } from './llaves-del-emisor';
5
+ import { abrirLoginHospedado } from './login-hospedado';
6
+ import { GRANT_TYPE_PASSKEY, pedirRetoDePasskey, } from './passkey-de-la-bienvenida';
7
+ import { metadatosDe, sinConexion, tokensDe, } from './respuesta-del-emisor';
8
+ import { borrarSesion, guardarSesion, leerSesion } from './sesion-guardada';
9
+ import { guardarUltimaCuenta, leerUltimaCuenta, olvidarUltimaCuenta, ultimaCuentaDe, } from './ultima-cuenta';
10
+ import { reclamosDelIdToken, validarIdToken } from './validar-id-token';
11
+ import { crearVueloUnico } from './vuelo-unico';
12
+ const ALCANCES = 'openid profile phone offline_access';
13
+ const MILISEGUNDOS_POR_SEGUNDO = 1000;
14
+ const MARGEN_DE_VENCIMIENTO_MS = 30_000;
15
+ const formulario = (campos, encabezados = {}) => ({
16
+ method: 'POST',
17
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded', ...encabezados },
18
+ body: new URLSearchParams(campos).toString(),
19
+ });
20
+ const encabezadosDelDispositivo = (dispositivo) => dispositivo === null ? {} : { 'x-dispositivo': dispositivo };
21
+ export function crearClienteDeIdentidadNativa({ emisor, coreApiUrl, clienteId, recurso, redireccion, almacen, origenDelLogin, alcance = ALCANCES, proveedorDeAtestacion, proveedorDePasskey, criptografia = criptografiaDelEntorno() ?? undefined, fetch: hacerFetch = (...argumentos) => fetch(...argumentos), ahora = Date.now, }) {
22
+ let descubrimiento = null;
23
+ async function pedir(url, init) {
24
+ try {
25
+ return await hacerFetch(url, init);
26
+ }
27
+ catch (error) {
28
+ throw sinConexion(error);
29
+ }
30
+ }
31
+ function metadatos() {
32
+ descubrimiento ??= pedir(`${emisor}/.well-known/openid-configuration`)
33
+ .then((respuesta) => metadatosDe(respuesta, emisor))
34
+ .catch((error) => {
35
+ descubrimiento = null;
36
+ throw error;
37
+ });
38
+ return descubrimiento;
39
+ }
40
+ const sesionDe = (tokens, anterior) => ({
41
+ acceso: tokens.access_token,
42
+ venceEn: ahora() + tokens.expires_in * MILISEGUNDOS_POR_SEGUNDO,
43
+ refresco: tokens.refresh_token,
44
+ identidad: tokens.id_token ?? anterior?.identidad ?? null,
45
+ });
46
+ async function pedirTokens(campos, encabezados = {}) {
47
+ const { token_endpoint } = await metadatos();
48
+ return tokensDe(await pedir(token_endpoint, formulario({ client_id: clienteId, resource: recurso, ...campos }, encabezados)));
49
+ }
50
+ async function recordarCuenta(identidad) {
51
+ if (identidad === undefined)
52
+ return;
53
+ const cuenta = ultimaCuentaDe(reclamosDelIdToken(identidad));
54
+ if (cuenta !== null)
55
+ await guardarUltimaCuenta(almacen, cuenta);
56
+ }
57
+ async function guardarEntrada(tokens) {
58
+ await guardarSesion(almacen, sesionDe(tokens, null));
59
+ await recordarCuenta(tokens.id_token);
60
+ }
61
+ async function validarIdentidadDeLaPasskey(tokens, cripto) {
62
+ if (tokens.id_token === undefined)
63
+ throw new ErrorDeIdentidad('identidad_invalida');
64
+ const { issuer, jwks_uri } = await metadatos();
65
+ await validarIdToken(tokens.id_token, { emisor: issuer, clienteId, nonce: null, ahoraMs: ahora() }, { llaves: crearLlavesDelEmisor(() => Promise.resolve(jwks_uri), pedir), cripto });
66
+ }
67
+ async function canjearPasskey(proveedor, cripto) {
68
+ const { token_endpoint, issuer } = await metadatos();
69
+ if (cripto.verificarEs256 === null)
70
+ exigirCanalSeguroDelCanje(token_endpoint, issuer);
71
+ const reto = await pedirRetoDePasskey({
72
+ coreApiUrl,
73
+ emisor,
74
+ clienteId,
75
+ proveedorDeAtestacion: proveedorDeAtestacion ?? null,
76
+ pedir,
77
+ });
78
+ const respuesta = await proveedor.firmar(reto.opcionesJson);
79
+ return pedirTokens({ grant_type: GRANT_TYPE_PASSKEY, reto: reto.reto, respuesta, scope: alcance }, encabezadosDelDispositivo(reto.dispositivo));
80
+ }
81
+ async function renovarGuardada() {
82
+ const guardada = await leerSesion(almacen);
83
+ if (guardada === null)
84
+ return null;
85
+ try {
86
+ const tokens = await pedirTokens({
87
+ grant_type: 'refresh_token',
88
+ refresh_token: guardada.refresco,
89
+ });
90
+ const renovada = sesionDe(tokens, guardada);
91
+ await guardarSesion(almacen, renovada);
92
+ await recordarCuenta(tokens.id_token);
93
+ return renovada.acceso;
94
+ }
95
+ catch (error) {
96
+ if (!(error instanceof ErrorDeIdentidad) || error.codigo !== 'codigo_invalido')
97
+ throw error;
98
+ await borrarSesion(almacen);
99
+ return null;
100
+ }
101
+ }
102
+ const renovar = crearVueloUnico(renovarGuardada);
103
+ async function refrescoParaRevocar() {
104
+ try {
105
+ return (await leerSesion(almacen))?.refresco ?? null;
106
+ }
107
+ catch (error) {
108
+ if (esErrorDeDesbloqueo(error))
109
+ return null;
110
+ throw error;
111
+ }
112
+ }
113
+ return {
114
+ async abrirLoginHospedado(opciones) {
115
+ if (criptografia === undefined)
116
+ throw new ErrorDeIdentidad('sin_criptografia');
117
+ return abrirLoginHospedado({
118
+ clienteId,
119
+ recurso,
120
+ redireccion,
121
+ alcance,
122
+ coreApiUrl,
123
+ origenDelLogin: origenDelLogin ?? null,
124
+ cripto: criptografia,
125
+ proveedorDeAtestacion: proveedorDeAtestacion ?? null,
126
+ metadatos,
127
+ pedir,
128
+ ahora,
129
+ guardar: guardarEntrada,
130
+ }, opciones);
131
+ },
132
+ async tokenDeAcceso() {
133
+ const guardada = await leerSesion(almacen);
134
+ if (guardada === null)
135
+ return null;
136
+ if (guardada.venceEn - MARGEN_DE_VENCIMIENTO_MS > ahora())
137
+ return guardada.acceso;
138
+ return renovar();
139
+ },
140
+ renovar,
141
+ async cerrarSesion() {
142
+ const refresco = await refrescoParaRevocar();
143
+ await borrarSesion(almacen);
144
+ if (refresco === null)
145
+ return;
146
+ const { revocation_endpoint } = await metadatos();
147
+ if (revocation_endpoint === undefined)
148
+ return;
149
+ const respuesta = await pedir(revocation_endpoint, formulario({
150
+ client_id: clienteId,
151
+ token: refresco,
152
+ token_type_hint: 'refresh_token',
153
+ }));
154
+ if (!respuesta.ok)
155
+ throw new ErrorDeIdentidad('servicio_no_disponible');
156
+ },
157
+ async entrarConPasskey() {
158
+ if (proveedorDePasskey === undefined)
159
+ throw new ErrorDeIdentidad('sin_passkey');
160
+ if (criptografia === undefined)
161
+ throw new ErrorDeIdentidad('sin_criptografia');
162
+ const tokens = await canjearPasskey(proveedorDePasskey, criptografia);
163
+ await validarIdentidadDeLaPasskey(tokens, criptografia);
164
+ await guardarEntrada(tokens);
165
+ },
166
+ biometriaDeLaPasskey() {
167
+ return proveedorDePasskey === undefined
168
+ ? Promise.resolve(null)
169
+ : proveedorDePasskey.biometria();
170
+ },
171
+ ultimaCuenta() {
172
+ return leerUltimaCuenta(almacen);
173
+ },
174
+ async usarOtraCuenta() {
175
+ await olvidarUltimaCuenta(almacen);
176
+ },
177
+ };
178
+ }
179
+ //# sourceMappingURL=cliente-de-identidad-nativa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliente-de-identidad-nativa.js","sourceRoot":"","sources":["../src/cliente-de-identidad-nativa.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface LlavePublicaEc {
2
+ kty: 'EC';
3
+ crv: 'P-256';
4
+ x: string;
5
+ y: string;
6
+ }
7
+ export type VerificadorEs256 = (llave: LlavePublicaEc, datos: Uint8Array, firma: Uint8Array) => Promise<boolean>;
8
+ export interface Criptografia {
9
+ bytesAleatorios(cantidad: number): Uint8Array;
10
+ sha256(datos: Uint8Array): Promise<Uint8Array>;
11
+ verificarEs256: VerificadorEs256 | null;
12
+ }
13
+ export declare const criptografiaWeb: (sutil: SubtleCrypto, aleatorio: Crypto) => Criptografia;
14
+ export declare const criptografiaSinFirma: (aleatorio: Pick<Crypto, "getRandomValues">) => Criptografia;
15
+ export declare const criptografiaDelEntorno: () => Criptografia | null;
@@ -0,0 +1,28 @@
1
+ import { sha256 } from './sha256';
2
+ const ECDSA_P256 = { name: 'ECDSA', namedCurve: 'P-256' };
3
+ const FIRMA_ES256 = { name: 'ECDSA', hash: 'SHA-256' };
4
+ const copiaDe = (datos) => new Uint8Array(datos);
5
+ const verificadorWeb = (sutil) => async (llave, datos, firma) => {
6
+ const publica = await sutil.importKey('jwk', llave, ECDSA_P256, false, ['verify']);
7
+ return sutil.verify(FIRMA_ES256, publica, copiaDe(firma), copiaDe(datos));
8
+ };
9
+ const aleatorioDe = (fuente) => (cantidad) => fuente.getRandomValues(new Uint8Array(cantidad));
10
+ export const criptografiaWeb = (sutil, aleatorio) => ({
11
+ bytesAleatorios: aleatorioDe(aleatorio),
12
+ sha256: async (datos) => new Uint8Array(await sutil.digest('SHA-256', copiaDe(datos))),
13
+ verificarEs256: verificadorWeb(sutil),
14
+ });
15
+ export const criptografiaSinFirma = (aleatorio) => ({
16
+ bytesAleatorios: aleatorioDe(aleatorio),
17
+ sha256: (datos) => Promise.resolve(sha256(datos)),
18
+ verificarEs256: null,
19
+ });
20
+ export const criptografiaDelEntorno = () => {
21
+ const entorno = globalThis.crypto;
22
+ if (typeof entorno?.getRandomValues !== 'function')
23
+ return null;
24
+ return entorno.subtle === undefined
25
+ ? criptografiaSinFirma(entorno)
26
+ : criptografiaWeb(entorno.subtle, entorno);
27
+ };
28
+ //# sourceMappingURL=criptografia.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"criptografia.js","sourceRoot":"","sources":["../src/criptografia.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAqBlC,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAW,CAAC;AACnE,MAAM,WAAW,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAW,CAAC;AAEhE,MAAM,OAAO,GAAG,CAAC,KAAiB,EAA2B,EAAE,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;AAEtF,MAAM,cAAc,GAClB,CAAC,KAAmB,EAAoB,EAAE,CAC1C,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IAC5B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnF,OAAO,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5E,CAAC,CAAC;AAEJ,MAAM,WAAW,GACf,CAAC,MAAuC,EAAE,EAAE,CAC5C,CAAC,QAAgB,EAAc,EAAE,CAC/B,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;AAErD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAmB,EAAE,SAAiB,EAAgB,EAAE,CAAC,CAAC;IACxF,eAAe,EAAE,WAAW,CAAC,SAAS,CAAC;IACvC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACtF,cAAc,EAAE,cAAc,CAAC,KAAK,CAAC;CACtC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,SAA0C,EAAgB,EAAE,CAAC,CAAC;IACjG,eAAe,EAAE,WAAW,CAAC,SAAS,CAAC;IACvC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjD,cAAc,EAAE,IAAI;CACrB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAwB,EAAE;IAC9D,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC;IAClC,IAAI,OAAO,OAAO,EAAE,eAAe,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAChE,OAAO,OAAO,CAAC,MAAM,KAAK,SAAS;QACjC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC;QAC/B,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type CodigoDeErrorDeIdentidad = 'codigo_invalido' | 'servicio_no_disponible' | 'sin_conexion' | 'respuesta_invalida' | 'respuesta_ajena' | 'identidad_invalida' | 'acceso_cancelado' | 'login_ya_completado' | 'atestacion_fallida' | 'sin_criptografia' | 'canal_inseguro' | 'desbloqueo_cancelado' | 'desbloqueo_invalidado' | 'desbloqueo_no_disponible' | 'sin_sesion' | 'sin_passkey';
2
+ export declare class ErrorDeIdentidad extends Error {
3
+ readonly codigo: CodigoDeErrorDeIdentidad;
4
+ constructor(codigo: CodigoDeErrorDeIdentidad, opciones?: ErrorOptions);
5
+ }
6
+ export declare const esErrorDeDesbloqueo: (error: unknown) => error is ErrorDeIdentidad;
@@ -0,0 +1,29 @@
1
+ const MENSAJES = {
2
+ codigo_invalido: 'El código no es correcto o ya venció.',
3
+ servicio_no_disponible: 'El servicio de identidad no está disponible. Intenta de nuevo en unos minutos.',
4
+ sin_conexion: 'Sin conexión a internet. Verifica tu conexión e intenta de nuevo.',
5
+ respuesta_invalida: 'El servicio de identidad respondió algo inesperado.',
6
+ respuesta_ajena: 'La respuesta del inicio de sesión no corresponde a esta solicitud.',
7
+ identidad_invalida: 'No se pudo confirmar la identidad que entregó el servicio.',
8
+ acceso_cancelado: 'Se canceló el inicio de sesión.',
9
+ login_ya_completado: 'Este inicio de sesión ya terminó. Vuelve a empezar.',
10
+ atestacion_fallida: 'No se pudo comprobar que la app es auténtica en este dispositivo.',
11
+ canal_inseguro: 'La conexión con el servicio de identidad no es segura.',
12
+ sin_criptografia: 'Este dispositivo no ofrece las funciones de cifrado que hacen falta.',
13
+ desbloqueo_cancelado: 'No se confirmó tu identidad. Puedes entrar con tu código.',
14
+ desbloqueo_invalidado: 'Cambiaron los rostros o las huellas de este dispositivo. Vuelve a iniciar sesión.',
15
+ desbloqueo_no_disponible: 'Este dispositivo no tiene Face ID, Touch ID ni huella configurados.',
16
+ sin_sesion: 'No hay una sesión iniciada en este dispositivo.',
17
+ sin_passkey: 'No encontramos una passkey para esta cuenta en este dispositivo.',
18
+ };
19
+ export class ErrorDeIdentidad extends Error {
20
+ codigo;
21
+ constructor(codigo, opciones) {
22
+ super(MENSAJES[codigo], opciones);
23
+ this.codigo = codigo;
24
+ this.name = 'ErrorDeIdentidad';
25
+ }
26
+ }
27
+ export const esErrorDeDesbloqueo = (error) => error instanceof ErrorDeIdentidad &&
28
+ (error.codigo === 'desbloqueo_cancelado' || error.codigo === 'desbloqueo_invalidado');
29
+ //# sourceMappingURL=error-de-identidad.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-de-identidad.js","sourceRoot":"","sources":["../src/error-de-identidad.ts"],"names":[],"mappings":"AAkBA,MAAM,QAAQ,GAAuD;IACnE,eAAe,EAAE,uCAAuC;IACxD,sBAAsB,EACpB,gFAAgF;IAClF,YAAY,EAAE,mEAAmE;IACjF,kBAAkB,EAAE,qDAAqD;IACzE,eAAe,EAAE,oEAAoE;IACrF,kBAAkB,EAAE,4DAA4D;IAChF,gBAAgB,EAAE,iCAAiC;IACnD,mBAAmB,EAAE,qDAAqD;IAC1E,kBAAkB,EAAE,mEAAmE;IACvF,cAAc,EAAE,wDAAwD;IACxE,gBAAgB,EAAE,sEAAsE;IACxF,oBAAoB,EAAE,2DAA2D;IACjF,qBAAqB,EACnB,mFAAmF;IACrF,wBAAwB,EAAE,qEAAqE;IAC/F,UAAU,EAAE,iDAAiD;IAC7D,WAAW,EAAE,kEAAkE;CAChF,CAAC;AAEF,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAE9B;IADX,YACW,MAAgC,EACzC,QAAuB;QAEvB,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC;QAHzB,WAAM,GAAN,MAAM,CAA0B;QAIzC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAA6B,EAAE,CAC/E,KAAK,YAAY,gBAAgB;IACjC,CAAC,KAAK,CAAC,MAAM,KAAK,sBAAsB,IAAI,KAAK,CAAC,MAAM,KAAK,uBAAuB,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type AlmacenConDesbloqueo } from '../almacen-con-desbloqueo';
2
+ import { type TextosDelDesbloqueo } from '../textos-del-desbloqueo';
3
+ export interface OpcionesDeSecureStore {
4
+ keychainService?: string;
5
+ requireAuthentication?: boolean;
6
+ authenticationPrompt?: string;
7
+ keychainAccessible?: number;
8
+ }
9
+ export interface ModuloSecureStore {
10
+ readonly AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY: number;
11
+ readonly WHEN_PASSCODE_SET_THIS_DEVICE_ONLY: number;
12
+ getItemAsync(llave: string, opciones?: OpcionesDeSecureStore): Promise<string | null>;
13
+ setItemAsync(llave: string, valor: string, opciones?: OpcionesDeSecureStore): Promise<void>;
14
+ deleteItemAsync(llave: string, opciones?: OpcionesDeSecureStore): Promise<void>;
15
+ canUseBiometricAuthentication(): boolean;
16
+ }
17
+ export declare const crearAlmacenExpo: (secureStore: ModuloSecureStore, textos?: TextosDelDesbloqueo) => AlmacenConDesbloqueo;
@@ -0,0 +1,30 @@
1
+ import { crearAlmacenConDesbloqueo, } from '../almacen-con-desbloqueo';
2
+ import { TEXTOS_DEL_DESBLOQUEO } from '../textos-del-desbloqueo';
3
+ const SERVICIO_PROTEGIDO = 'neodaten.desbloqueo';
4
+ const almacenComun = (secureStore) => {
5
+ const opciones = { keychainAccessible: secureStore.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY };
6
+ return {
7
+ obtener: (llave) => secureStore.getItemAsync(llave, opciones),
8
+ guardar: (llave, valor) => secureStore.setItemAsync(llave, valor, opciones),
9
+ borrar: (llave) => secureStore.deleteItemAsync(llave, opciones),
10
+ };
11
+ };
12
+ const almacenProtegido = (secureStore, textos) => {
13
+ const opciones = {
14
+ keychainService: SERVICIO_PROTEGIDO,
15
+ requireAuthentication: true,
16
+ keychainAccessible: secureStore.WHEN_PASSCODE_SET_THIS_DEVICE_ONLY,
17
+ authenticationPrompt: textos.motivo,
18
+ };
19
+ return {
20
+ leer: (llave) => secureStore.getItemAsync(llave, opciones),
21
+ escribir: (llave, valor) => secureStore.setItemAsync(llave, valor, opciones),
22
+ borrar: (llave) => secureStore.deleteItemAsync(llave, opciones),
23
+ };
24
+ };
25
+ export const crearAlmacenExpo = (secureStore, textos = TEXTOS_DEL_DESBLOQUEO) => crearAlmacenConDesbloqueo({
26
+ comun: almacenComun(secureStore),
27
+ protegido: almacenProtegido(secureStore, textos),
28
+ biometriaDisponible: () => Promise.resolve(secureStore.canUseBiometricAuthentication()),
29
+ });
30
+ //# sourceMappingURL=crear-almacen-expo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crear-almacen-expo.js","sourceRoot":"","sources":["../../src/expo/crear-almacen-expo.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,GAG1B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,qBAAqB,EAA4B,MAAM,0BAA0B,CAAC;AAE3F,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AAkBjD,MAAM,YAAY,GAAG,CAAC,WAA8B,EAAiB,EAAE;IACrE,MAAM,QAAQ,GAAG,EAAE,kBAAkB,EAAE,WAAW,CAAC,mCAAmC,EAAE,CAAC;IACzF,OAAO;QACL,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC;QAC7D,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC;QAC3E,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC;KAChE,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CACvB,WAA8B,EAC9B,MAA2B,EACT,EAAE;IACpB,MAAM,QAAQ,GAA0B;QACtC,eAAe,EAAE,kBAAkB;QACnC,qBAAqB,EAAE,IAAI;QAC3B,kBAAkB,EAAE,WAAW,CAAC,kCAAkC;QAClE,oBAAoB,EAAE,MAAM,CAAC,MAAM;KACpC,CAAC;IACF,OAAO;QACL,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC;QAC1D,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC;QAC5E,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC;KAChE,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,WAA8B,EAC9B,SAA8B,qBAAqB,EAC7B,EAAE,CACxB,yBAAyB,CAAC;IACxB,KAAK,EAAE,YAAY,CAAC,WAAW,CAAC;IAChC,SAAS,EAAE,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC;IAChD,mBAAmB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,6BAA6B,EAAE,CAAC;CACxF,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export { crearAlmacenExpo, type ModuloSecureStore, type OpcionesDeSecureStore, } from './crear-almacen-expo';
@@ -0,0 +1,2 @@
1
+ export { crearAlmacenExpo, } from './crear-almacen-expo';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/expo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,GAGjB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { crearAlmacenConDesbloqueo, type AlmacenConDesbloqueo, type AlmacenProtegido, type PiezasDelAlmacenConDesbloqueo, } from './almacen-con-desbloqueo';
2
+ export type { AlmacenSeguro } from './almacen-seguro';
3
+ export { crearClienteDeIdentidadNativa, type ClienteDeIdentidadNativa, type OpcionesDelCliente, } from './cliente-de-identidad-nativa';
4
+ export { criptografiaDelEntorno, criptografiaSinFirma, criptografiaWeb, type Criptografia, type LlavePublicaEc, type VerificadorEs256, } from './criptografia';
5
+ export { ErrorDeIdentidad, esErrorDeDesbloqueo, type CodigoDeErrorDeIdentidad, } from './error-de-identidad';
6
+ export type { LoginAbierto, OpcionesDeApertura } from './login-hospedado';
7
+ export { ORIGEN_DEL_CAPTCHA, type DecisionDeNavegacion, type NavegacionPedida, } from './navegacion-del-login';
8
+ export type { AtestacionDelDispositivo, PlataformaDeAtestacion, ProveedorDeAtestacion, } from './ticket-de-atestacion';
9
+ export { TEXTOS_DEL_DESBLOQUEO, type TextosDelDesbloqueo } from './textos-del-desbloqueo';
10
+ export { GRANT_TYPE_PASSKEY, type BiometriaDelDispositivo, type ProveedorDePasskey, } from './passkey-de-la-bienvenida';
11
+ export { enmascararTelefono, type UltimaCuenta } from './ultima-cuenta';
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { crearAlmacenConDesbloqueo, } from './almacen-con-desbloqueo';
2
+ export { crearClienteDeIdentidadNativa, } from './cliente-de-identidad-nativa';
3
+ export { criptografiaDelEntorno, criptografiaSinFirma, criptografiaWeb, } from './criptografia';
4
+ export { ErrorDeIdentidad, esErrorDeDesbloqueo, } from './error-de-identidad';
5
+ export { ORIGEN_DEL_CAPTCHA, } from './navegacion-del-login';
6
+ export { TEXTOS_DEL_DESBLOQUEO } from './textos-del-desbloqueo';
7
+ export { GRANT_TYPE_PASSKEY, } from './passkey-de-la-bienvenida';
8
+ export { enmascararTelefono } from './ultima-cuenta';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,GAI1B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,6BAA6B,GAG9B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,GAIhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GAEpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,kBAAkB,GAGnB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EAAE,qBAAqB,EAA4B,MAAM,yBAAyB,CAAC;AAC1F,OAAO,EACL,kBAAkB,GAGnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAqB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { type AlmacenConDesbloqueo } from '../almacen-con-desbloqueo';
2
+ import { type TextosDelDesbloqueo } from '../textos-del-desbloqueo';
3
+ export interface AvisoDeAutenticacion {
4
+ title?: string;
5
+ description?: string;
6
+ cancel?: string;
7
+ }
8
+ export interface OpcionesDeKeychain {
9
+ service?: string;
10
+ accessible?: string;
11
+ accessControl?: string;
12
+ storage?: string;
13
+ authenticationPrompt?: AvisoDeAutenticacion;
14
+ }
15
+ export interface CredencialDelLlavero {
16
+ password: string;
17
+ }
18
+ export interface ModuloKeychain {
19
+ readonly ACCESSIBLE: {
20
+ readonly AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY: string;
21
+ readonly WHEN_PASSCODE_SET_THIS_DEVICE_ONLY: string;
22
+ };
23
+ readonly ACCESS_CONTROL: {
24
+ readonly BIOMETRY_CURRENT_SET: string;
25
+ };
26
+ readonly STORAGE_TYPE: {
27
+ readonly RSA: string;
28
+ };
29
+ setGenericPassword(usuario: string, contrasena: string, opciones?: OpcionesDeKeychain): Promise<false | object>;
30
+ getGenericPassword(opciones?: OpcionesDeKeychain): Promise<false | CredencialDelLlavero>;
31
+ resetGenericPassword(opciones?: OpcionesDeKeychain): Promise<boolean>;
32
+ getSupportedBiometryType(): Promise<string | null>;
33
+ }
34
+ export declare const crearAlmacenKeychain: (keychain: ModuloKeychain, textos?: TextosDelDesbloqueo) => AlmacenConDesbloqueo;
@@ -0,0 +1,46 @@
1
+ import { crearAlmacenConDesbloqueo, } from '../almacen-con-desbloqueo';
2
+ import { TEXTOS_DEL_DESBLOQUEO } from '../textos-del-desbloqueo';
3
+ const USUARIO_DEL_LLAVERO = 'neodaten';
4
+ const SERVICIO_PROTEGIDO = 'neodaten.desbloqueo';
5
+ const contrasenaDe = (credencial) => credencial === false ? null : credencial.password;
6
+ async function guardarEnElLlavero(keychain, valor, opciones) {
7
+ const resultado = await keychain.setGenericPassword(USUARIO_DEL_LLAVERO, valor, opciones);
8
+ if (resultado === false)
9
+ throw new Error('El llavero no guardó el valor.');
10
+ }
11
+ async function borrarDelLlavero(keychain, servicio) {
12
+ await keychain.resetGenericPassword({ service: servicio });
13
+ }
14
+ const almacenComun = (keychain) => ({
15
+ obtener: async (llave) => contrasenaDe(await keychain.getGenericPassword({ service: llave })),
16
+ guardar: (llave, valor) => guardarEnElLlavero(keychain, valor, {
17
+ service: llave,
18
+ accessible: keychain.ACCESSIBLE.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY,
19
+ }),
20
+ borrar: (llave) => borrarDelLlavero(keychain, llave),
21
+ });
22
+ const almacenProtegido = (keychain, textos) => {
23
+ const servicioDe = (llave) => `${SERVICIO_PROTEGIDO}.${llave}`;
24
+ const opcionesDe = (llave) => ({
25
+ service: servicioDe(llave),
26
+ accessControl: keychain.ACCESS_CONTROL.BIOMETRY_CURRENT_SET,
27
+ accessible: keychain.ACCESSIBLE.WHEN_PASSCODE_SET_THIS_DEVICE_ONLY,
28
+ storage: keychain.STORAGE_TYPE.RSA,
29
+ authenticationPrompt: {
30
+ title: textos.titulo,
31
+ description: textos.motivo,
32
+ cancel: textos.entrarConCodigo,
33
+ },
34
+ });
35
+ return {
36
+ leer: async (llave) => contrasenaDe(await keychain.getGenericPassword(opcionesDe(llave))),
37
+ escribir: (llave, valor) => guardarEnElLlavero(keychain, valor, opcionesDe(llave)),
38
+ borrar: (llave) => borrarDelLlavero(keychain, servicioDe(llave)),
39
+ };
40
+ };
41
+ export const crearAlmacenKeychain = (keychain, textos = TEXTOS_DEL_DESBLOQUEO) => crearAlmacenConDesbloqueo({
42
+ comun: almacenComun(keychain),
43
+ protegido: almacenProtegido(keychain, textos),
44
+ biometriaDisponible: async () => (await keychain.getSupportedBiometryType()) !== null,
45
+ });
46
+ //# sourceMappingURL=crear-almacen-keychain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crear-almacen-keychain.js","sourceRoot":"","sources":["../../src/keychain/crear-almacen-keychain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { crearAlmacenKeychain, type AvisoDeAutenticacion, type CredencialDelLlavero, type ModuloKeychain, type OpcionesDeKeychain, } from './crear-almacen-keychain';
@@ -0,0 +1,2 @@
1
+ export { crearAlmacenKeychain, } from './crear-almacen-keychain';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/keychain/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,GAKrB,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { LlavesDelEmisor } from './validar-id-token';
2
+ type Pedir = (url: string) => Promise<Response>;
3
+ export declare const crearLlavesDelEmisor: (jwksUri: () => Promise<string>, pedir: Pedir) => LlavesDelEmisor;
4
+ export {};