{"_id":"@adatechnology/nestjs-auth-keycloak","_rev":"8-59498b76d879042b452d652227817333","name":"@adatechnology/nestjs-auth-keycloak","dist-tags":{"latest":"0.1.25","rc":"0.1.25-rc.0"},"versions":{"0.1.18":{"name":"@adatechnology/nestjs-auth-keycloak","version":"0.1.18","_id":"@adatechnology/nestjs-auth-keycloak@0.1.18","maintainers":[{"name":"miyazaki","email":"andersonfrfilho@gmail.com"}],"dist":{"shasum":"0230d29281bcaf74f0f31f7b3f8bb60d4987a4fc","tarball":"https://registry.npmjs.org/@adatechnology/nestjs-auth-keycloak/-/nestjs-auth-keycloak-0.1.18.tgz","fileCount":4,"integrity":"sha512-ZhbbFCFoCaIVBg9ley8UH0Z52OO3tGWQhWi3Fh/dia6htMh2E+pyHeoLrG0e/vh5qhh2bxwd+0Q5pETLLQYClw==","signatures":[{"sig":"MEYCIQDv0Z2iYF22OJRvkwjerC4YJGZohkx+qRnV1H1aJZUM7QIhAL5MHJ+cVOi1uGOxFXAHBQxBQmumYpU6KYTfAn40Bq4D","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":459003},"main":"dist/index.js","_from":"file:adatechnology-nestjs-auth-keycloak-0.1.18.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","scripts":{"test":"echo \"no tests\"","build":"rm -rf dist && tsup","check":"tsc -p tsconfig.json --noEmit","build:watch":"tsup --watch"},"_npmUser":{"name":"miyazaki","email":"andersonfrfilho@gmail.com"},"_resolved":"/tmp/cfed06270973fecfe2ce1760efc7a795/adatechnology-nestjs-auth-keycloak-0.1.18.tgz","_integrity":"sha512-ZhbbFCFoCaIVBg9ley8UH0Z52OO3tGWQhWi3Fh/dia6htMh2E+pyHeoLrG0e/vh5qhh2bxwd+0Q5pETLLQYClw==","_npmVersion":"10.9.8","description":"Módulo Keycloak para autenticação de clients e usuários, seguindo o padrão do `HttpModule` do monorepo.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"@adatechnology/nestjs-cache":"0.0.20","@adatechnology/nestjs-logger":"0.0.20","@adatechnology/nestjs-http-client":"0.0.24"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","@swc/core":"^1.15.24","typescript":"^5.2.0","@adatechnology/shared":"0.0.2","@esbuild-plugins/tsconfig-paths":"^0.1.2"},"peerDependencies":{"@nestjs/core":"^11","@nestjs/common":"^11.0.16"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-auth-keycloak_0.1.18_1779736864170_0.303736230984335","host":"s3://npm-registry-packages-npm-production"}},"0.1.19":{"name":"@adatechnology/nestjs-auth-keycloak","version":"0.1.19","_id":"@adatechnology/nestjs-auth-keycloak@0.1.19","maintainers":[{"name":"miyazaki","email":"andersonfrfilho@gmail.com"}],"dist":{"shasum":"d20376c799f12c13a469069fe212f8ac45e6a1e1","tarball":"https://registry.npmjs.org/@adatechnology/nestjs-auth-keycloak/-/nestjs-auth-keycloak-0.1.19.tgz","fileCount":3,"integrity":"sha512-Gad/sn37MdHyk132r1TKZKrBF1EXAMz4zahRlmxuaJ6ENcK+DTkZxgNnyW67EzHXzDfnN/NZ96B/pl0bMafvdg==","signatures":[{"sig":"MEQCICjlKz8TYLYlhcA6ytfXA0EI0YItZBnFtJ5M/r6mFqZTAiB26lSstAOUkhHjow+Se7qm6yunHZoVETNieMndJDmrDQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":441202},"main":"dist/index.js","_from":"file:adatechnology-nestjs-auth-keycloak-0.1.19.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","scripts":{"test":"echo \"no tests\"","build":"rm -rf dist && tsup","check":"tsc -p tsconfig.json --noEmit","build:watch":"tsup --watch"},"_npmUser":{"name":"miyazaki","email":"andersonfrfilho@gmail.com"},"_resolved":"/tmp/782117c1a31ede3111795af3e81ea863/adatechnology-nestjs-auth-keycloak-0.1.19.tgz","_integrity":"sha512-Gad/sn37MdHyk132r1TKZKrBF1EXAMz4zahRlmxuaJ6ENcK+DTkZxgNnyW67EzHXzDfnN/NZ96B/pl0bMafvdg==","_npmVersion":"11.12.1","description":"Módulo Keycloak para autenticação de clients e usuários, seguindo o padrão do `HttpModule` do monorepo.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@adatechnology/nestjs-cache":"0.0.21","@adatechnology/nestjs-logger":"0.1.0","@adatechnology/nestjs-http-client":"0.0.25"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","@swc/core":"^1.15.24","typescript":"^5.2.0","@adatechnology/shared":"0.0.2","@esbuild-plugins/tsconfig-paths":"^0.1.2"},"peerDependencies":{"@nestjs/core":"^11","@nestjs/common":"^11.0.16"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-auth-keycloak_0.1.19_1779744898919_0.26615567430243603","host":"s3://npm-registry-packages-npm-production"}},"0.1.20":{"name":"@adatechnology/nestjs-auth-keycloak","version":"0.1.20","_id":"@adatechnology/nestjs-auth-keycloak@0.1.20","maintainers":[{"name":"miyazaki","email":"andersonfrfilho@gmail.com"}],"dist":{"shasum":"79cc8d9dcc3ae5a62c84d2bbcbfe818a4750faf5","tarball":"https://registry.npmjs.org/@adatechnology/nestjs-auth-keycloak/-/nestjs-auth-keycloak-0.1.20.tgz","fileCount":4,"integrity":"sha512-K0kRRg6VjTFNqahaS4Ji3c6+ey1CdmUCq5wJqUQ+kd1L2kj1uZ53hpL2Y5/0xRbO2z/J0B7hd7ERyQfPdS1HLA==","signatures":[{"sig":"MEYCIQD9yn8LDigCBMu3rKPk+YHfkXBkuYduBG5zxdLG5tWDvwIhALYvcAegXYv+7EJvBa6rCVxCWjAwW70CacvUHz0YpYAY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":459002},"main":"dist/index.js","_from":"file:adatechnology-nestjs-auth-keycloak-0.1.20.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","scripts":{"test":"echo \"no tests\"","build":"rm -rf dist && tsup","check":"tsc -p tsconfig.json --noEmit","build:watch":"tsup --watch"},"_npmUser":{"name":"miyazaki","email":"andersonfrfilho@gmail.com"},"_resolved":"/tmp/94d317d27c23214a188a25a5dd48220d/adatechnology-nestjs-auth-keycloak-0.1.20.tgz","_integrity":"sha512-K0kRRg6VjTFNqahaS4Ji3c6+ey1CdmUCq5wJqUQ+kd1L2kj1uZ53hpL2Y5/0xRbO2z/J0B7hd7ERyQfPdS1HLA==","_npmVersion":"10.9.8","description":"Módulo Keycloak para autenticação de clients e usuários, seguindo o padrão do `HttpModule` do monorepo.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"@adatechnology/nestjs-cache":"0.0.22","@adatechnology/nestjs-logger":"0.1.1","@adatechnology/nestjs-http-client":"0.0.26"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","@swc/core":"^1.15.24","typescript":"^5.2.0","@adatechnology/shared":"0.0.2","@esbuild-plugins/tsconfig-paths":"^0.1.2"},"peerDependencies":{"@nestjs/core":"^11","@nestjs/common":"^11.0.16"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-auth-keycloak_0.1.20_1779746697645_0.8639926604482122","host":"s3://npm-registry-packages-npm-production"}},"0.1.21":{"name":"@adatechnology/nestjs-auth-keycloak","version":"0.1.21","_id":"@adatechnology/nestjs-auth-keycloak@0.1.21","maintainers":[{"name":"miyazaki","email":"andersonfrfilho@gmail.com"}],"dist":{"shasum":"734f6b3670769e2bff196300c9753a9e3878a7b9","tarball":"https://registry.npmjs.org/@adatechnology/nestjs-auth-keycloak/-/nestjs-auth-keycloak-0.1.21.tgz","fileCount":4,"integrity":"sha512-eQeptTBdBmUcvmViBwhwW/zcXfZPNva/RjePdtCpyHTJjffiNplF8YSA6WFNAlEgusVoqwRNzY05XCcwaDq7qQ==","signatures":[{"sig":"MEYCIQCOg7mO28tcFSe1lgJidaCjzy/aT60civaC5YQa9UC0EgIhAK7+1IhNARR5/7qS1Xyj7asjODW3F3d+NtHsVuFy0okM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":459002},"main":"dist/index.js","_from":"file:adatechnology-nestjs-auth-keycloak-0.1.21.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","scripts":{"test":"echo \"no tests\"","build":"rm -rf dist && tsup","check":"tsc -p tsconfig.json --noEmit","build:watch":"tsup --watch"},"_npmUser":{"name":"miyazaki","email":"andersonfrfilho@gmail.com"},"_resolved":"/tmp/e0ae0c52c794453f4b2c596b3c3bbfb7/adatechnology-nestjs-auth-keycloak-0.1.21.tgz","_integrity":"sha512-eQeptTBdBmUcvmViBwhwW/zcXfZPNva/RjePdtCpyHTJjffiNplF8YSA6WFNAlEgusVoqwRNzY05XCcwaDq7qQ==","_npmVersion":"10.9.8","description":"Módulo Keycloak para autenticação de clients e usuários, seguindo o padrão do `HttpModule` do monorepo.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"@adatechnology/nestjs-cache":"0.0.23","@adatechnology/nestjs-logger":"0.2.1","@adatechnology/nestjs-http-client":"0.0.27"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","@swc/core":"^1.15.24","typescript":"^5.2.0","@adatechnology/shared":"0.0.2","@esbuild-plugins/tsconfig-paths":"^0.1.2"},"peerDependencies":{"@nestjs/core":"^11","@nestjs/common":"^11.0.16"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-auth-keycloak_0.1.21_1779756658461_0.5135528593908496","host":"s3://npm-registry-packages-npm-production"}},"0.1.23":{"name":"@adatechnology/nestjs-auth-keycloak","version":"0.1.23","_id":"@adatechnology/nestjs-auth-keycloak@0.1.23","maintainers":[{"name":"miyazaki","email":"andersonfrfilho@gmail.com"}],"dist":{"shasum":"c5b4d4fe53f62e44716f662628cc178b3328ab28","tarball":"https://registry.npmjs.org/@adatechnology/nestjs-auth-keycloak/-/nestjs-auth-keycloak-0.1.23.tgz","fileCount":4,"integrity":"sha512-+M7uVMayJ7cOAs5xPTImwLYLHfQdOWFet0GB5lazms5sDuOU/qVFvKRERQLJ4hjPxD3EwDH1gi6fbb/+IR+cMg==","signatures":[{"sig":"MEUCIH9m441fMhY/h2Gz67iBHAYd8SGQDZ5L3Kez8EVIInopAiEAwCMNuTf925DqYp2s5WPyv2v8+MQtfqmPBSJvhg7+Uzo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":459002},"main":"dist/index.js","_from":"file:adatechnology-nestjs-auth-keycloak-0.1.23.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","scripts":{"test":"echo \"no tests\"","build":"rm -rf dist && tsup","check":"tsc -p tsconfig.json --noEmit","build:watch":"tsup --watch"},"_npmUser":{"name":"miyazaki","email":"andersonfrfilho@gmail.com"},"_resolved":"/tmp/67a3734162c11b9ec95bd582fa1f3e91/adatechnology-nestjs-auth-keycloak-0.1.23.tgz","_integrity":"sha512-+M7uVMayJ7cOAs5xPTImwLYLHfQdOWFet0GB5lazms5sDuOU/qVFvKRERQLJ4hjPxD3EwDH1gi6fbb/+IR+cMg==","_npmVersion":"10.9.8","description":"Módulo Keycloak para autenticação de clients e usuários, seguindo o padrão do `HttpModule` do monorepo.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"@adatechnology/nestjs-cache":"0.0.25","@adatechnology/nestjs-logger":"0.2.4","@adatechnology/nestjs-http-client":"0.0.30"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","@swc/core":"^1.15.24","typescript":"^5.2.0","@adatechnology/shared":"0.0.2","@esbuild-plugins/tsconfig-paths":"^0.1.2"},"peerDependencies":{"@nestjs/core":"^11","@nestjs/common":"^11.0.16"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-auth-keycloak_0.1.23_1779881518113_0.892345711948964","host":"s3://npm-registry-packages-npm-production"}},"0.1.24":{"name":"@adatechnology/nestjs-auth-keycloak","version":"0.1.24","_id":"@adatechnology/nestjs-auth-keycloak@0.1.24","maintainers":[{"name":"miyazaki","email":"andersonfrfilho@gmail.com"}],"dist":{"shasum":"fa5fceb0f00760f53b1c8620e1f8ba5cfa00be69","tarball":"https://registry.npmjs.org/@adatechnology/nestjs-auth-keycloak/-/nestjs-auth-keycloak-0.1.24.tgz","fileCount":4,"integrity":"sha512-KhqBCb4CgE40eRRjALntm3tOU0OyDpK24G3DVN0I6RuzjnPjPuwLQGheDkBCSwOf3ih9wYywiOs32dpaff4nEg==","signatures":[{"sig":"MEQCIH/Q+J9cQooxphW5XdhsRpIuds4+maKMKr6WOBavDa/QAiBJnv30qCbdU9r3T6cOaCS/nIimjpKKEhtyGEtiy2mIFQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":459002},"main":"dist/index.js","_from":"file:adatechnology-nestjs-auth-keycloak-0.1.24.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","scripts":{"test":"echo \"no tests\"","build":"rm -rf dist && tsup","check":"tsc -p tsconfig.json --noEmit","build:watch":"tsup --watch"},"_npmUser":{"name":"miyazaki","email":"andersonfrfilho@gmail.com"},"_resolved":"/tmp/42aca2663eec776514e9329be83c210e/adatechnology-nestjs-auth-keycloak-0.1.24.tgz","_integrity":"sha512-KhqBCb4CgE40eRRjALntm3tOU0OyDpK24G3DVN0I6RuzjnPjPuwLQGheDkBCSwOf3ih9wYywiOs32dpaff4nEg==","_npmVersion":"10.9.8","description":"Módulo Keycloak para autenticação de clients e usuários, seguindo o padrão do `HttpModule` do monorepo.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"@adatechnology/nestjs-cache":"0.0.25","@adatechnology/nestjs-logger":"0.2.4","@adatechnology/nestjs-http-client":"0.0.31"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","@swc/core":"^1.15.24","typescript":"^5.2.0","@adatechnology/shared":"0.0.2","@esbuild-plugins/tsconfig-paths":"^0.1.2"},"peerDependencies":{"@nestjs/core":"^11","@nestjs/common":"^11.0.16"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-auth-keycloak_0.1.24_1780167359337_0.9499889797984913","host":"s3://npm-registry-packages-npm-production"}},"0.1.25-rc.0":{"name":"@adatechnology/nestjs-auth-keycloak","version":"0.1.25-rc.0","_id":"@adatechnology/nestjs-auth-keycloak@0.1.25-rc.0","maintainers":[{"name":"miyazaki","email":"andersonfrfilho@gmail.com"}],"dist":{"shasum":"cca1e0280eb072edb4ee1c17f1827177c3792fea","tarball":"https://registry.npmjs.org/@adatechnology/nestjs-auth-keycloak/-/nestjs-auth-keycloak-0.1.25-rc.0.tgz","fileCount":4,"integrity":"sha512-ZVjynbXTD7uDMCg5T7TD3McuBVKlkCcNXuRgh0AJ7Qfg4P+7/IIcuRQB12VEhb57HVvjup4r2YE4z9uCem9wHw==","signatures":[{"sig":"MEUCIQDN12w2n2bE5HDK2aKd/6SdrDhNmdEYOW005YnMj765lgIgAhfbIT7FRToYD7jyoNb5Aafs5+Gmvu8AqUe/tgLs9oQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":459195},"main":"dist/index.js","_from":"file:adatechnology-nestjs-auth-keycloak-0.1.25-rc.0.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","scripts":{"test":"echo \"no tests\"","build":"rm -rf dist && tsup","check":"tsc -p tsconfig.json --noEmit","build:watch":"tsup --watch"},"_npmUser":{"name":"miyazaki","email":"andersonfrfilho@gmail.com"},"_resolved":"/tmp/8d2a8368906051b4f4468a11ba8aef80/adatechnology-nestjs-auth-keycloak-0.1.25-rc.0.tgz","_integrity":"sha512-ZVjynbXTD7uDMCg5T7TD3McuBVKlkCcNXuRgh0AJ7Qfg4P+7/IIcuRQB12VEhb57HVvjup4r2YE4z9uCem9wHw==","_npmVersion":"10.9.8","description":"Módulo Keycloak para autenticação de clients e usuários, seguindo o padrão do `HttpModule` do monorepo.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"@adatechnology/nestjs-cache":"0.0.26-rc.0","@adatechnology/nestjs-logger":"0.2.5-rc.0","@adatechnology/nestjs-http-client":"0.0.32-rc.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsup":"^8.5.1","@swc/core":"^1.15.24","typescript":"^5.2.0","@adatechnology/shared":"0.0.3-rc.0","@esbuild-plugins/tsconfig-paths":"^0.1.2"},"peerDependencies":{"@nestjs/core":"^11","@nestjs/common":"^11.0.16"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-auth-keycloak_0.1.25-rc.0_1785076860111_0.3192854834492982","host":"s3://npm-registry-packages-npm-production"}},"0.1.25":{"name":"@adatechnology/nestjs-auth-keycloak","version":"0.1.25","publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","dependencies":{"@adatechnology/nestjs-cache":"0.0.26","@adatechnology/nestjs-http-client":"0.0.32","@adatechnology/nestjs-logger":"0.2.5"},"peerDependencies":{"@nestjs/common":"^11.0.16","@nestjs/core":"^11"},"devDependencies":{"@esbuild-plugins/tsconfig-paths":"^0.1.2","@swc/core":"^1.15.24","tsup":"^8.5.1","typescript":"^5.2.0","@adatechnology/shared":"0.0.3"},"scripts":{"build":"rm -rf dist && tsup","build:watch":"tsup --watch","check":"tsc -p tsconfig.json --noEmit","test":"echo \"no tests\""},"_id":"@adatechnology/nestjs-auth-keycloak@0.1.25","description":"Módulo Keycloak para autenticação de clients e usuários, seguindo o padrão do `HttpModule` do monorepo.","_integrity":"sha512-ojHC8toWK+0xRRDNh/H7wauJnglGQvnaoHDYWH8yvhVoyJ4+BSeblGqNgoaD3jrenQxN8wxRscow5iH2W5DEOQ==","_resolved":"/tmp/24bf36e5f4780ace41c24b6eee3c6799/adatechnology-nestjs-auth-keycloak-0.1.25.tgz","_from":"file:adatechnology-nestjs-auth-keycloak-0.1.25.tgz","_nodeVersion":"22.23.2","_npmVersion":"10.9.8","dist":{"integrity":"sha512-ojHC8toWK+0xRRDNh/H7wauJnglGQvnaoHDYWH8yvhVoyJ4+BSeblGqNgoaD3jrenQxN8wxRscow5iH2W5DEOQ==","shasum":"0831d127d83c6d81aa780fa331243502b9f62a53","tarball":"https://registry.npmjs.org/@adatechnology/nestjs-auth-keycloak/-/nestjs-auth-keycloak-0.1.25.tgz","fileCount":4,"unpackedSize":459170,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCNyvMuwEqziGizNIQR/wnVI/DDM9EgbyG4ZWklKB2yjQIhAJyGpfJJF3kjdOM6ABN0l/f1I9Oz0qIQjIDCHH/drXnP"}]},"_npmUser":{"name":"miyazaki","email":"andersonfrfilho@gmail.com"},"directories":{},"maintainers":[{"name":"miyazaki","email":"andersonfrfilho@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nestjs-auth-keycloak_0.1.25_1788318093820_0.06022385664683694"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-25T19:21:04.003Z","modified":"2026-09-02T03:01:34.100Z","0.1.18":"2026-05-25T19:21:04.296Z","0.1.19":"2026-05-25T21:34:59.051Z","0.1.20":"2026-05-25T22:04:57.784Z","0.1.21":"2026-05-26T00:50:58.609Z","0.1.23":"2026-05-27T11:31:58.312Z","0.1.24":"2026-05-30T18:55:59.463Z","0.1.25-rc.0":"2026-07-26T14:41:00.258Z","0.1.25":"2026-09-02T03:01:33.948Z"},"description":"Módulo Keycloak para autenticação de clients e usuários, seguindo o padrão do `HttpModule` do monorepo.","maintainers":[{"name":"miyazaki","email":"andersonfrfilho@gmail.com"}],"readme":"## @adatechnology/auth-keycloak\n\nMódulo Keycloak para autenticação de clients e usuários, seguindo o padrão do `HttpModule` do monorepo.\n\nEste pacote fornece um cliente leve para interagir com o Keycloak (obter/refresh de tokens, introspecção, userinfo)\ne um interceptor opcional. O módulo foi projetado para ser usado junto ao `@adatechnology/http-client`.\n\n### Principais exportações\n\n- `KeycloakModule` — módulo principal. Suporta `KeycloakModule.forRoot(config?)`.\n- `KEYCLOAK_CLIENT` — provider token para injetar o cliente Keycloak (`@Inject(KEYCLOAK_CLIENT)`).\n- `KEYCLOAK_HTTP_INTERCEPTOR` — provider token para injetar o interceptor (opcional).\n- `BearerTokenGuard` — guard que valida o token Bearer via introspecção no Keycloak (401 em falha).\n- `Roles` / `RolesGuard` — decorator e guard para autorização baseada em roles (403 em falha).\n- `KeycloakError` — classe de erro tipada com `statusCode` e `details`.\n\n### Instalação\n\n```bash\n# Este pacote já declara dependências de workspace para http-client, logger e cache.\n# Em um monorepo PNPM/Turbo os pacotes são resolvidos automaticamente.\n```\n\n### Uso básico\n\n```ts\nimport { Module } from \"@nestjs/common\";\nimport { KeycloakModule } from \"@adatechnology/auth-keycloak\";\n\n@Module({\n  imports: [\n    KeycloakModule.forRoot({\n      baseUrl: \"https://keycloak.example.com\",\n      realm: \"myrealm\",\n      credentials: {\n        clientId: \"my-client\",\n        clientSecret: \"my-secret\",\n        grantType: \"client_credentials\",\n      },\n    }),\n  ],\n})\nexport class AppModule {}\n```\n\n### Injeção do cliente\n\n```ts\nimport { Inject } from '@nestjs/common';\nimport { KEYCLOAK_CLIENT } from '@adatechnology/auth-keycloak';\nimport type { KeycloakClientInterface } from '@adatechnology/auth-keycloak';\n\nconstructor(\n  @Inject(KEYCLOAK_CLIENT) private readonly keycloakClient: KeycloakClientInterface,\n) {}\n```\n\n### API do cliente\n\n| Método | Descrição |\n|---|---|\n| `getAccessToken()` | Obtém token com cache automático e deduplicação de requisições |\n| `getTokenWithCredentials({ username, password })` | Login com credenciais (resource-owner password grant) |\n| `refreshToken(refreshToken)` | Renova token e atualiza o cache interno |\n| `validateToken(token)` | Introspecção via endpoint `/token/introspect` |\n| `getUserInfo(token)` | Retorna claims via endpoint `/userinfo` |\n| `clearTokenCache()` | Remove o token do cache (útil para forçar renovação) |\n\n### Cache de token\n\nO `KeycloakClient` usa `@adatechnology/cache` para armazenar o access token obtido via `client_credentials`.\nPor padrão é criado um `InMemoryCacheProvider` local. Você pode substituir por Redis ou qualquer implementação\nde `CacheProviderInterface` injetando o provider `CACHE_PROVIDER` no contexto do módulo:\n\n```ts\nimport { Module } from \"@nestjs/common\";\nimport { CacheModule } from \"@adatechnology/cache\";\nimport { KeycloakModule } from \"@adatechnology/auth-keycloak\";\n\n@Module({\n  imports: [\n    // Registra CACHE_PROVIDER como Redis — KeycloakClient o usará automaticamente\n    CacheModule.forRoot({\n      type: 'redis',\n      redis: { host: 'localhost', port: 6379 },\n    }),\n    KeycloakModule.forRoot({ ... }),\n  ],\n})\nexport class AppModule {}\n```\n\nSe `CACHE_PROVIDER` não for registrado no módulo, o `KeycloakClient` cria um `InMemoryCacheProvider`\ninterno sem necessidade de configuração adicional.\n\nO TTL do cache é derivado do campo `expires_in` do token (com 60 segundos de margem). Você pode\nsobrescrever com a opção `tokenCacheTtl` (em **milissegundos**):\n\n```ts\nKeycloakModule.forRoot({\n  ...\n  tokenCacheTtl: 60_000, // força TTL de 60 s independente do token\n})\n```\n\n### Propagação de contexto de log (cascade)\n\nO cliente lê o `logContext` do `AsyncLocalStorage` da lib `@adatechnology/logger`. Para que os logs\nde downstream (keycloak → cache) mostrem `className.methodName` da origem correta, use `runWithContext`\nno controller:\n\n```ts\nimport { getContext, runWithContext } from '@adatechnology/logger';\n\n// No controller\nprivate withCtx<T>(logContext: object, fn: () => Promise<T>): Promise<T> {\n  return runWithContext({ ...(getContext() ?? {}), logContext }, fn);\n}\n\nasync getToken() {\n  const logContext = { className: 'MyController', methodName: 'getToken' };\n  return this.withCtx(logContext, () => this.keycloakService.getAccessToken());\n}\n```\n\nResultado no log:\n```\n[MyController.getToken][KeycloakClient.getAccessToken] → cache miss → request token\n[MyController.getToken][InMemoryCacheProvider.set] → token cached\n```\n\n### Contrato de headers (Kong → API)\n\n```\nAuthorization: Bearer <service_token>   → identidade do chamador (B2B)\nX-Access-Token: <user_jwt>              → token original do usuário (B2C)\n```\n\nKong valida o JWT do usuário via JWKS (local, zero chamadas ao Keycloak por request) e injeta os dois headers antes de encaminhar a request ao API.\n\n---\n\n### Guards\n\n| Guard | Valida | Quando usar |\n|---|---|---|\n| `B2CGuard` | `X-Access-Token` presente | Rota exclusiva de usuários via Kong |\n| `B2BGuard` | `Authorization` via introspection | Rota exclusiva de serviços internos |\n| `ApiAuthGuard` | Detecta path e delega | Rota acessível pelos dois paths |\n| `RolesGuard` | Roles no JWT correto | Sempre junto a um guard acima |\n| `BearerTokenGuard` | `Authorization` via introspection | Nível baixo; prefira `B2BGuard` |\n\n**Guard order matters** — guards de autenticação devem vir antes de `RolesGuard`.\n\n---\n\n### Decorators\n\n#### `@AuthUser(param?)`\nExtrai claim do token em `X-Access-Token`. Padrão: claim configurado em `userId` (default `sub`). Decodificação local, sem I/O.\n\n```ts\n@AuthUser()                                           // sub (default)\n@AuthUser('email')                                    // claim único\n@AuthUser(['preferred_username', 'email', 'sub'])     // primeiro não-vazio\n@AuthUser({ claim: 'email', header: 'x-user-jwt' }) // header customizado por rota\n```\n\n#### `@CallerToken(param?)`\nExtrai claim do token em `Authorization`. Padrão: claim configurado em `callerId` (default `azp`).\n\n```ts\n@CallerToken()                                              // azp (default)\n@CallerToken('sub')                                         // claim único\n@CallerToken(['client_id', 'azp'])                          // primeiro não-vazio\n@CallerToken({ header: 'x-service-token', claim: 'azp' }) // header customizado\n```\n\n#### `@AccessToken(header?)`\nRetorna o JWT bruto do header B2C. Use quando precisar de claims não-string ou repassar o token.\n\n```ts\n@AccessToken()              // header B2C padrão\n@AccessToken('x-user-jwt')  // header customizado\n```\n\n#### `@Roles(...)`\nDeclara roles necessárias. Sempre usado com `RolesGuard`.\n\n```ts\n@Roles('user-manager')\n@Roles({ roles: ['admin', 'user-manager'], mode: 'any' })  // qualquer (default)\n@Roles({ roles: ['admin', 'user-manager'], mode: 'all' })  // todas\n```\n\n---\n\n### Exemplos de uso\n\n**B2C — usuário via Kong:**\n```ts\n@Get('me')\n@Roles('user-manager')\n@UseGuards(B2CGuard, RolesGuard)\nasync getMe(\n  @AuthUser() id: string,\n  @AuthUser('email') email: string,\n  @AuthUser(['preferred_username', 'email']) name: string,\n  @AccessToken() rawToken: string,\n) {\n  return { id, email, name };\n}\n```\n\n**B2B — serviço interno:**\n```ts\n@Post('internal/notify')\n@Roles('send-notifications')\n@UseGuards(B2BGuard, RolesGuard)\nasync notify(\n  @CallerToken() caller: string,  // 'domestic-backend-bff'\n) {\n  return { caller };\n}\n```\n\n**Ambos os paths:**\n```ts\n@Get(':id')\n@Roles('user-manager')\n@UseGuards(ApiAuthGuard, RolesGuard)\nasync findById(\n  @Param('id') id: string,\n  @AuthUser() userId: string,    // vazio no B2B-only path\n  @CallerToken() caller: string,\n) { ... }\n```\n\n---\n\n### Configuração de headers e claims\n\nConfigurável via env ou `forRoot()`. Prioridade: `forRoot()` > `process.env` > default.\n\n**Env vars:**\n```env\nKEYCLOAK_B2C_TOKEN_HEADER=x-access-token        # header do user JWT\nKEYCLOAK_B2B_TOKEN_HEADER=authorization         # header do service token\nKEYCLOAK_USER_ID_CLAIM=sub                      # claim(s) para user ID (comma-separated)\nKEYCLOAK_CALLER_ID_CLAIM=azp                    # claim(s) para caller ID (comma-separated)\n```\n\n**`forRoot()` (sobrescreve env):**\n```ts\nKeycloakModule.forRoot({\n  ...\n  headers: { b2cToken: 'x-access-token', b2bToken: 'authorization' },\n  claims: {\n    userId: ['preferred_username', 'email', 'sub'],  // string ou string[]\n    callerId: ['client_id', 'azp'],\n  },\n})\n```\n\n---\n\n### BearerTokenGuard — autenticação B2B via introspecção\n\nValida `Authorization: Bearer <token>` chamando `POST /token/introspect` no Keycloak.\n\n| Guard | Mecanismo | HTTP? | Falha |\n|---|---|---|---|\n| `BearerTokenGuard` | `POST /token/introspect` | Sim | 401 |\n| `RolesGuard` | Decode local do payload | Não | 403 |\n\nO `RolesGuard` sozinho **não é seguro** — ele decodifica sem verificar assinatura.\n\n---\n\n### Tratamento de erros\n\n```ts\nimport { KeycloakError } from \"@adatechnology/auth-keycloak\";\n\ntry {\n  await keycloakClient.getUserInfo(token);\n} catch (e) {\n  if (e instanceof KeycloakError) {\n    console.error(e.statusCode, e.details, e.keycloakError);\n  }\n  throw e;\n}\n```\n\n### Variáveis de ambiente (referência)\n\n| Variável | Padrão |\n|---|---|\n| `KEYCLOAK_BASE_URL` | `http://localhost:8081` |\n| `KEYCLOAK_REALM` | `BACKEND` |\n| `KEYCLOAK_CLIENT_ID` | `backend-api` |\n| `KEYCLOAK_CLIENT_SECRET` | `backend-api-secret` |\n| `KEYCLOAK_B2C_TOKEN_HEADER` | `x-access-token` |\n| `KEYCLOAK_B2B_TOKEN_HEADER` | `authorization` |\n| `KEYCLOAK_USER_ID_CLAIM` | `sub` |\n| `KEYCLOAK_CALLER_ID_CLAIM` | `azp` |\n\n### Notas\n\n- Este módulo depende de `@adatechnology/http-client` para chamadas HTTP ao Keycloak.\n- O interceptor `KeycloakHttpInterceptor` pode ser registrado como `APP_INTERCEPTOR` para integração global.\n- `clearTokenCache()` é assíncrono desde a versão `0.0.7` (retorna `Promise<void>`).\n\n### Contribuições\n\nRelate issues/PRs no repositório principal. Mantenha compatibilidade com o padrão usado pelo `HttpModule`.\n\n### Licença\n\nMIT\n","readmeFilename":"README.md"}