{"_id":"@core-tecnologias-empresariales/core-auth","name":"@core-tecnologias-empresariales/core-auth","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@core-tecnologias-empresariales/core-auth","version":"0.1.0","description":"Políticas de identidad (rotación de refresh tokens, recuperación de contraseña) para el ecosistema Core Tecnología Empresarial. Agnóstico de base de datos.","license":"UNLICENSED","publishConfig":{"access":"public"},"type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":"./dist/index.js"},"dependencies":{"@core-tecnologias-empresariales/core-utils":"0.1.0"},"devDependencies":{"typescript":"^5.7.0","@types/node":"^20.14.0"},"scripts":{"build":"tsc -p tsconfig.json","test":"tsc -p tsconfig.json && node --test dist"},"_id":"@core-tecnologias-empresariales/core-auth@0.1.0","_integrity":"sha512-aDSQ0fMMtTDRPBpLITtxAObWKBc8HWiWlOv27q2nRwdsdu8Yqkw/QKPBCQ/R/6qmELV0sdDHDj2rxGCU086r4g==","_resolved":"C:\\Users\\Administrador\\AppData\\Local\\Temp\\bd9e8af56a9451c62e6c454d3cc8f3be\\core-tecnologias-empresariales-core-auth-0.1.0.tgz","_from":"file:core-tecnologias-empresariales-core-auth-0.1.0.tgz","_nodeVersion":"20.20.0","_npmVersion":"11.11.0","dist":{"integrity":"sha512-aDSQ0fMMtTDRPBpLITtxAObWKBc8HWiWlOv27q2nRwdsdu8Yqkw/QKPBCQ/R/6qmELV0sdDHDj2rxGCU086r4g==","shasum":"8ad92441815fc0b06dfe496a72ed70d9846bf703","tarball":"https://registry.npmjs.org/@core-tecnologias-empresariales/core-auth/-/core-auth-0.1.0.tgz","fileCount":17,"unpackedSize":22107,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC7UHRWhDQVQCWe1kq1EmWRXWZrT2MvmMX853ccXDlBywIgFwwuvUJK0MU0xEpfJ/0HUKx3+59sElHzf6wKhaPXl8w="}]},"_npmUser":{"name":"balamchac","email":"marcelosazop@gmail.com"},"directories":{},"maintainers":[{"name":"balamchac","email":"marcelosazop@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/core-auth_0.1.0_1788053543465_0.2648030399832848"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-30T01:32:23.318Z","0.1.0":"2026-08-30T01:32:23.604Z","modified":"2026-08-30T01:32:23.827Z"},"maintainers":[{"name":"balamchac","email":"marcelosazop@gmail.com"}],"description":"Políticas de identidad (rotación de refresh tokens, recuperación de contraseña) para el ecosistema Core Tecnología Empresarial. Agnóstico de base de datos.","license":"UNLICENSED","readme":"# @core-tecnologias-empresariales/core-auth\n\nPolíticas de identidad del ecosistema Core Tecnología Empresarial. **Agnóstico de base de datos** — no accede a ninguna DB (regla \"no core-database\" del `CLAUDE.md`); recibe estado, devuelve qué debe persistirse, y cada producto lo conecta a su propio storage.\n\n## v0.1 — qué incluye\n\nLas dos políticas más específicas y más detalladas en `CLAUDE.md`:\n\n### Rotación de refresh tokens (§55)\n\n```ts\nimport { rotateRefreshToken } from \"@core-tecnologias-empresariales/core-auth\";\nimport { generateSecureToken, hashToken } from \"@core-tecnologias-empresariales/core-security\";\n\nconst rawToken = generateSecureToken();\nconst result = rotateRefreshToken({\n  presentedToken,       // el RefreshToken leído desde tu DB\n  family,                // su RefreshTokenFamily\n  nextTokenHash: hashToken(rawToken),\n});\n\nif (result.outcome === \"reuse_detected\") {\n  // revocar toda la família + invalidar sesiones + registrar security event (core-audit)\n} else {\n  // persistir result.token, devolver rawToken (nunca el hash) al cliente\n}\n```\n\nUn token ya usado, revocado, o con su familia revocada dispara `reuse_detected` — la respuesta correcta según CLAUDE.md es revocar toda la `token_family` e invalidar las sesiones asociadas (fuera del scope de este paquete: es una operación de persistencia).\n\n### Recuperación de contraseña (§59)\n\n```ts\nimport { createPasswordResetRequest, validatePasswordResetCode } from \"@core-tecnologias-empresariales/core-auth\";\nimport { generateNumericCode, hashToken } from \"@core-tecnologias-empresariales/core-security\";\n\nconst code = generateNumericCode(6);              // se envía por Core Mail\nconst request = createPasswordResetRequest({ userId, codeHash: hashToken(code) });\n// ...persistir request...\n\nconst result = validatePasswordResetCode({ request, presentedCodeHash: hashToken(codeFromUser) });\n// \"valid\" | \"invalid\" (con attemptsRemaining) | \"expired\" | \"already_used\" | \"too_many_attempts\"\n```\n\nEl código nunca se compara en texto plano ni se almacena sin hashear. El placeholder de UI (`-----`) es responsabilidad de `core-ui`, no de este paquete.\n\n## Para qué NO sirve (todavía — `ponytail:` diferido)\n\nSin consumidor real hoy, así que quedan fuera de v0.1 hasta que un producto los necesite:\n\n- Login/verificación de contraseña — usar directamente `core-security` (`hashPassword`/`verifyPassword`).\n- Modelo completo de `sessions`, `users`, `mfa_methods`, `user_identities` (SSO).\n- Repositorios/adapters de persistencia concretos.\n\n## Instalación\n\n```bash\npnpm add @core-tecnologias-empresariales/core-auth\n```\n\n## Desarrollo\n\n```bash\npnpm build\npnpm test\n```\n","readmeFilename":"README.md","_rev":"1-9551499d9f9997b49687f220730f5157"}