{"_id":"@bernierllc/auth-service","_rev":"16-1e344101c157155613e93f5936dc6abe","name":"@bernierllc/auth-service","dist-tags":{"latest":"1.5.1"},"versions":{"1.0.1":{"name":"@bernierllc/auth-service","version":"1.0.1","keywords":["authentication","authorization","jwt","oauth","session","security","rbac","mfa","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/auth-service@1.0.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"e2bcd3ee835f81cef4c7182a1be7b28964a53abb","tarball":"https://registry.npmjs.org/@bernierllc/auth-service/-/auth-service-1.0.1.tgz","fileCount":31,"integrity":"sha512-/+bpqp6v5eE2wNWSzW8iGfM0OCbFlfnmfj2wR98QkrVNC4iXsFA/qT9IGnB3UmyxfUDRDYUJKfAaPRS/bR9ptg==","signatures":[{"sig":"MEUCIAoC2r1kBM2IX2nTNeORzltFyxOJslRjpuBKvvi1tWoeAiEAwkwlgbGMtixC69xQFqU8LxmJHS+CZnifnSCwDmhJrb0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128330},"main":"dist/index.js","type":"commonjs","_from":"file:bernierllc-auth-service-1.0.1.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rimraf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/private/var/folders/r0/wspnzd1s18sfjy10ffyv2qxw0000gn/T/d36077b835c0ed6e9587c8b1b593dc8f/bernierllc-auth-service-1.0.1.tgz","_integrity":"sha512-/+bpqp6v5eE2wNWSzW8iGfM0OCbFlfnmfj2wR98QkrVNC4iXsFA/qT9IGnB3UmyxfUDRDYUJKfAaPRS/bR9ptg==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/service/auth-service"},"_npmVersion":"11.6.2","description":"Complete authentication and authorization service with multi-provider support and session management","directories":{"test":"tests"},"_nodeVersion":"25.1.0","dependencies":{"uuid":"^9.0.0","bcrypt":"^5.1.0","@bernierllc/logger":"^1.0.1","@bernierllc/crypto-utils":"^1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.50.0","rimraf":"^5.0.0","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@types/uuid":"^9.0.4","@types/bcrypt":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-service_1.0.1_1763159682531_0.11210873060479432","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bernierllc/auth-service","version":"1.0.2","keywords":["authentication","authorization","jwt","oauth","session","security","rbac","mfa","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/auth-service@1.0.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"91c7f7783add48ec1282089751475944e7165f61","tarball":"https://registry.npmjs.org/@bernierllc/auth-service/-/auth-service-1.0.2.tgz","fileCount":31,"integrity":"sha512-VtFPKU5W9T+hsby/TsSf69/eCrN5PeFAP+3UESawdGsjBYT5zd6QrPa2wDoRjvQet7SGMtr7rxZ0kKVeT9CwMg==","signatures":[{"sig":"MEUCIHKEf5CyBPaDP7ejxSEa/QpXCwmBYKqwKq7HRyUR0a+HAiEAym0hgpc73U0kiyBMyNcwBbg49X1Za/QbqkmhI0FpU3w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128424},"main":"dist/index.js","type":"commonjs","_from":"file:bernierllc-auth-service-1.0.2.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rimraf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/tmp/8506ff2f04819ba3795ba6316b8e667e/bernierllc-auth-service-1.0.2.tgz","_integrity":"sha512-VtFPKU5W9T+hsby/TsSf69/eCrN5PeFAP+3UESawdGsjBYT5zd6QrPa2wDoRjvQet7SGMtr7rxZ0kKVeT9CwMg==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/service/auth-service"},"_npmVersion":"11.7.0","description":"Complete authentication and authorization service with multi-provider support and session management","directories":{"test":"tests"},"_nodeVersion":"20.19.6","dependencies":{"uuid":"^9.0.0","bcrypt":"^5.1.0","@bernierllc/logger":"1.0.3","@bernierllc/crypto-utils":"1.0.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.50.0","rimraf":"^5.0.0","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@types/uuid":"^9.0.4","@types/bcrypt":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-service_1.0.2_1766276728033_0.9593966876391631","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@bernierllc/auth-service","version":"1.0.3","keywords":["authentication","authorization","jwt","oauth","session","security","rbac","mfa","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/auth-service@1.0.3","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"7bb4f89531cdf6850cf6a347c180934588090baf","tarball":"https://registry.npmjs.org/@bernierllc/auth-service/-/auth-service-1.0.3.tgz","fileCount":31,"integrity":"sha512-Eq8MSvIyA/cNA4tyfbWNY/LkAvbLNLaoDJXYFL8gTny/EapKOg0UNf3z6+1wG41LbeXrV2xrbVOyRpQMh2WBpg==","signatures":[{"sig":"MEUCIGne5xGvc0DbRKKrLU0gHg3CRLjrliziE6ZCjqkNlGTJAiEA1yWxpvPICZY4qf1jfMiYk98Qu1FJSnNBxbHmEugZ3oQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128424},"main":"dist/index.js","type":"commonjs","_from":"file:bernierllc-auth-service-1.0.3.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rimraf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/tmp/ddc8689c5aab8ec256f61ae7a3e4441b/bernierllc-auth-service-1.0.3.tgz","_integrity":"sha512-Eq8MSvIyA/cNA4tyfbWNY/LkAvbLNLaoDJXYFL8gTny/EapKOg0UNf3z6+1wG41LbeXrV2xrbVOyRpQMh2WBpg==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/service/auth-service"},"_npmVersion":"11.7.0","description":"Complete authentication and authorization service with multi-provider support and session management","directories":{"test":"tests"},"_nodeVersion":"20.19.6","dependencies":{"uuid":"^9.0.0","bcrypt":"^5.1.0","@bernierllc/logger":"1.0.3","@bernierllc/crypto-utils":"1.0.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.50.0","rimraf":"^5.0.0","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@types/uuid":"^9.0.4","@types/bcrypt":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-service_1.0.3_1766283504883_0.05698377732680915","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@bernierllc/auth-service","version":"1.0.4","keywords":["authentication","authorization","jwt","oauth","session","security","rbac","mfa","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/auth-service@1.0.4","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"2e87922bcd54ca74b48576c2a125eb08657b0abe","tarball":"https://registry.npmjs.org/@bernierllc/auth-service/-/auth-service-1.0.4.tgz","fileCount":31,"integrity":"sha512-G7Ws5Ji+9lrP1Mrt1+S2sYJkzolsMLxKOmfYlHhuIcMGoZKWnfeZY99Ls9eYdaK2gR/LZpEFNBeGEH8pC3kRGw==","signatures":[{"sig":"MEYCIQCn0T9L359fNcHxJRQxA29WBEVfmuS0Q3ndc2lVX6cd6AIhALSFfAKkPJBbwNExrE9bxZun2KfebuU0sMFT2UO4IdHw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128424},"main":"dist/index.js","type":"commonjs","_from":"file:bernierllc-auth-service-1.0.4.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rimraf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:69fc19a9-c8cf-4266-8b10-efccbfd1a0cc"}},"_resolved":"/tmp/0b1e8264bb359b998c6775aec809bd51/bernierllc-auth-service-1.0.4.tgz","_integrity":"sha512-G7Ws5Ji+9lrP1Mrt1+S2sYJkzolsMLxKOmfYlHhuIcMGoZKWnfeZY99Ls9eYdaK2gR/LZpEFNBeGEH8pC3kRGw==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/service/auth-service"},"_npmVersion":"11.7.0","description":"Complete authentication and authorization service with multi-provider support and session management","directories":{"test":"tests"},"_nodeVersion":"20.19.6","dependencies":{"uuid":"^9.0.0","bcrypt":"^5.1.0","@bernierllc/logger":"1.0.4","@bernierllc/crypto-utils":"1.0.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.50.0","rimraf":"^5.0.0","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@types/uuid":"^9.0.4","@types/bcrypt":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-service_1.0.4_1766437819999_0.1229341763005567","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@bernierllc/auth-service","version":"1.0.5","keywords":["authentication","authorization","jwt","oauth","session","security","rbac","mfa","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/auth-service@1.0.5","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"e6e8b701bb225bb9a1c6362c9e0b907525e94630","tarball":"https://registry.npmjs.org/@bernierllc/auth-service/-/auth-service-1.0.5.tgz","fileCount":31,"integrity":"sha512-JtWjx9M+FohP/1v/cncWUwG0x1OmP62Hy340OZyBdCUeeGOI08ok6tkoXaENNQxQglDFG0qu6leoASE0XyjSpw==","signatures":[{"sig":"MEUCIHXdDQR+qDhJQPRtHmomuG1jK73XhB22TnWNagfpBItxAiEA3gh99rOKuj8xULPwgqPxlR8XZx9snIZpE/XCo+khw/I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128424},"main":"dist/index.js","type":"commonjs","_from":"file:bernierllc-auth-service-1.0.5.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rimraf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:69fc19a9-c8cf-4266-8b10-efccbfd1a0cc"}},"_resolved":"/tmp/63c2e5dcc9bd9110dedfa1dcbc03ba24/bernierllc-auth-service-1.0.5.tgz","_integrity":"sha512-JtWjx9M+FohP/1v/cncWUwG0x1OmP62Hy340OZyBdCUeeGOI08ok6tkoXaENNQxQglDFG0qu6leoASE0XyjSpw==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/service/auth-service"},"_npmVersion":"11.7.0","description":"Complete authentication and authorization service with multi-provider support and session management","directories":{"test":"tests"},"_nodeVersion":"20.19.6","dependencies":{"uuid":"^9.0.0","bcrypt":"^5.1.0","@bernierllc/logger":"1.1.0","@bernierllc/crypto-utils":"1.0.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.50.0","rimraf":"^5.0.0","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@types/uuid":"^9.0.4","@types/bcrypt":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-service_1.0.5_1766454438437_0.06133652471676898","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@bernierllc/auth-service","version":"1.0.7","keywords":["authentication","authorization","jwt","oauth","session","security","rbac","mfa","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/auth-service@1.0.7","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"22dc2a224c6bc81645f30c28e768b33a65592399","tarball":"https://registry.npmjs.org/@bernierllc/auth-service/-/auth-service-1.0.7.tgz","fileCount":31,"integrity":"sha512-3NegTqarHofUfbiegBjP3Yyht4VgKk5YL5ZrAjjm4HAvz1Dnq4Os2ZnydZuBY3T+U7rONp+nhyHF+3E2XATwTg==","signatures":[{"sig":"MEUCIQCgGityguii2YdfvPAOuo9Bd0qXz3LS1BrgTs12bSc4VAIgEs6/Jc/OKfkYnph9lk9xFDC0BC9Y9BqRYJgjr0/+Lqc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128482},"main":"dist/index.js","type":"commonjs","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rimraf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:69fc19a9-c8cf-4266-8b10-efccbfd1a0cc"}},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/service/auth-service"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Complete authentication and authorization service with multi-provider support and session management","directories":{"test":"tests"},"_nodeVersion":"20.19.6","dependencies":{"uuid":"^9.0.0","bcrypt":"^5.1.0","@bernierllc/logger":"1.3.0","@bernierllc/crypto-utils":"1.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.50.0","rimraf":"^5.0.0","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@types/uuid":"^9.0.4","@types/bcrypt":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-service_1.0.7_1767642448409_0.9313976640135042","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"@bernierllc/auth-service","version":"1.0.9","keywords":["authentication","authorization","jwt","oauth","session","security","rbac","mfa","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/auth-service@1.0.9","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"5182bae1d0f8bf9e7a7d0171e286c8ddce1d348c","tarball":"https://registry.npmjs.org/@bernierllc/auth-service/-/auth-service-1.0.9.tgz","fileCount":31,"integrity":"sha512-ai8NeVovCEZ+eGSV2068f1VrhdfJPvAv0YhM88H6wcaSZj1QH1IbtitUJR/IEeB9pEPXDR40Ljld2IVy3DNXKA==","signatures":[{"sig":"MEUCIEXYisJVlYuCq4Kn8P4X4hou7ZG+BX8ESP29qjKKaH6tAiEAvQpibeGMbq/fFUMFMC8V3Ibva3UNA4gcw8GKcj2N0gY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128424},"main":"dist/index.js","type":"commonjs","_from":"file:bernierllc-auth-service-1.0.9.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rimraf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:69fc19a9-c8cf-4266-8b10-efccbfd1a0cc"}},"_resolved":"/home/runner/work/tools/tools/packages/service/auth-service/bernierllc-auth-service-1.0.9.tgz","_integrity":"sha512-ai8NeVovCEZ+eGSV2068f1VrhdfJPvAv0YhM88H6wcaSZj1QH1IbtitUJR/IEeB9pEPXDR40Ljld2IVy3DNXKA==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/service/auth-service"},"_npmVersion":"11.11.0","description":"Complete authentication and authorization service with multi-provider support and session management","directories":{"test":"tests"},"_nodeVersion":"20.20.0","dependencies":{"uuid":"^9.0.0","bcrypt":"^5.1.0","@bernierllc/logger":"1.3.2","@bernierllc/crypto-utils":"1.0.8"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.50.0","rimraf":"^5.0.0","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@types/uuid":"^9.0.4","@types/bcrypt":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-service_1.0.9_1773163461488_0.35367061120778787","host":"s3://npm-registry-packages-npm-production"}},"1.0.10":{"name":"@bernierllc/auth-service","version":"1.0.10","keywords":["authentication","authorization","jwt","oauth","session","security","rbac","mfa","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/auth-service@1.0.10","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"6e8254267cf81d1b94374ad10518c95d2bf522db","tarball":"https://registry.npmjs.org/@bernierllc/auth-service/-/auth-service-1.0.10.tgz","fileCount":31,"integrity":"sha512-CVcCvKjfYoIEx1aCG8BYf/P/I/WMIWc2QC3mrx5JdCfKMtxQ5LJgVHAgXpo5zGbGpRCUjdKpiD1CNIiABCqVrg==","signatures":[{"sig":"MEQCIDNJndaipAtz2RpV6XLTabB5UCxe9uK42/0jIxSwL84eAiBTwhDtOI8BKggQTwxzyMiRymd/iGpTaXFgWp7Wy8qhVA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128425},"main":"dist/index.js","type":"commonjs","_from":"file:bernierllc-auth-service-1.0.10.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rimraf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:69fc19a9-c8cf-4266-8b10-efccbfd1a0cc"}},"_resolved":"/home/runner/work/tools/tools/packages/service/auth-service/bernierllc-auth-service-1.0.10.tgz","_integrity":"sha512-CVcCvKjfYoIEx1aCG8BYf/P/I/WMIWc2QC3mrx5JdCfKMtxQ5LJgVHAgXpo5zGbGpRCUjdKpiD1CNIiABCqVrg==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/service/auth-service"},"_npmVersion":"11.14.1","description":"Complete authentication and authorization service with multi-provider support and session management","directories":{"test":"tests"},"_nodeVersion":"20.20.2","dependencies":{"uuid":"^9.0.0","bcrypt":"^5.1.0","@bernierllc/logger":"1.4.0","@bernierllc/crypto-utils":"1.0.8"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.50.0","rimraf":"^5.0.0","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@types/uuid":"^9.0.4","@types/bcrypt":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-service_1.0.10_1779133666521_0.4157696741400194","host":"s3://npm-registry-packages-npm-production"}},"1.0.11":{"name":"@bernierllc/auth-service","version":"1.0.11","keywords":["authentication","authorization","jwt","oauth","session","security","rbac","mfa","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/auth-service@1.0.11","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"f9ba13c2e741480f882e1b083e0bc30c2f77ce56","tarball":"https://registry.npmjs.org/@bernierllc/auth-service/-/auth-service-1.0.11.tgz","fileCount":31,"integrity":"sha512-ses6MlktT2sPZILdiGhnoBlg0zajpl57pW3PyvRXqJ6KHlAyKntT9nWemV2CcBXuF8USaEw+SM5FISG97lJuOg==","signatures":[{"sig":"MEQCID2/uIqIXqcW4YywEnTOeAIPIRrY+wnH+Pz/JfZorpsWAiBEBTYdYVK/NxRegcEQgunV/Jmvy7GrQy7RaIo023sP+w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128425},"main":"dist/index.js","type":"commonjs","_from":"file:bernierllc-auth-service-1.0.11.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rimraf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:69fc19a9-c8cf-4266-8b10-efccbfd1a0cc"}},"_resolved":"/home/runner/work/tools/tools/packages/service/auth-service/bernierllc-auth-service-1.0.11.tgz","_integrity":"sha512-ses6MlktT2sPZILdiGhnoBlg0zajpl57pW3PyvRXqJ6KHlAyKntT9nWemV2CcBXuF8USaEw+SM5FISG97lJuOg==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/service/auth-service"},"_npmVersion":"11.14.1","description":"Complete authentication and authorization service with multi-provider support and session management","directories":{"test":"tests"},"_nodeVersion":"20.20.2","dependencies":{"uuid":"^9.0.0","bcrypt":"^5.1.0","@bernierllc/logger":"1.4.2","@bernierllc/crypto-utils":"1.0.8"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.50.0","rimraf":"^5.0.0","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@types/uuid":"^9.0.4","@types/bcrypt":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-service_1.0.11_1779157363862_0.7082406800569512","host":"s3://npm-registry-packages-npm-production"}},"1.0.12":{"name":"@bernierllc/auth-service","version":"1.0.12","keywords":["authentication","authorization","jwt","oauth","session","security","rbac","mfa","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/auth-service@1.0.12","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"26e7dc301b50cc466e2a4beb951d0400e1c8f36b","tarball":"https://registry.npmjs.org/@bernierllc/auth-service/-/auth-service-1.0.12.tgz","fileCount":31,"integrity":"sha512-+bvdGPQh7/87Q+o+eHwNeOnDI/Rwtp4j3LsFKWJxyS7kSG01q7+5gZKBrBGGD/dHwX2+9tFqktQjGvsnsz6hfA==","signatures":[{"sig":"MEQCIHJgm/XXEXtkg5n6gFYBCQ1tSxwF2xstvGS6EVpBAkRkAiAKbOLAcRTjq5GosRoxVwNPMWdtnwrof0ZvTybEiWf7EA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128425},"main":"dist/index.js","type":"commonjs","_from":"file:bernierllc-auth-service-1.0.12.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rimraf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:69fc19a9-c8cf-4266-8b10-efccbfd1a0cc"}},"_resolved":"/home/runner/work/tools/tools/packages/service/auth-service/bernierllc-auth-service-1.0.12.tgz","_integrity":"sha512-+bvdGPQh7/87Q+o+eHwNeOnDI/Rwtp4j3LsFKWJxyS7kSG01q7+5gZKBrBGGD/dHwX2+9tFqktQjGvsnsz6hfA==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/service/auth-service"},"_npmVersion":"11.14.1","description":"Complete authentication and authorization service with multi-provider support and session management","directories":{"test":"tests"},"_nodeVersion":"20.20.2","dependencies":{"uuid":"^9.0.0","bcrypt":"^5.1.0","@bernierllc/logger":"1.4.3","@bernierllc/crypto-utils":"1.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.50.0","rimraf":"^5.0.0","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@types/uuid":"^9.0.4","@types/bcrypt":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-service_1.0.12_1779221506995_0.02125820802757783","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@bernierllc/auth-service","version":"1.1.0","keywords":["authentication","authorization","jwt","oauth","session","security","rbac","mfa","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/auth-service@1.1.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"31a9f8f8a7fcc5a5248c4082ccdcec6200c5723a","tarball":"https://registry.npmjs.org/@bernierllc/auth-service/-/auth-service-1.1.0.tgz","fileCount":31,"integrity":"sha512-k59JgNv3MZDnuEt78UWtuFRggsBabOAU35YNQ+rVLqeww0MRonNwCntXfxYJL2E+0+qfx10SYT8c1LoLEvhGOg==","signatures":[{"sig":"MEUCIGwufc7fI2/L9/Wd2MxRpksWxHh6wtkBji8Z84URR0hhAiEA07WwZN52fUAtcvAJiCWrA1Coo+aNOC6ftRZuwkv4ncg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128424},"main":"dist/index.js","type":"commonjs","_from":"file:bernierllc-auth-service-1.1.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rimraf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:69fc19a9-c8cf-4266-8b10-efccbfd1a0cc"}},"_resolved":"/home/runner/work/tools/tools/packages/service/auth-service/bernierllc-auth-service-1.1.0.tgz","_integrity":"sha512-k59JgNv3MZDnuEt78UWtuFRggsBabOAU35YNQ+rVLqeww0MRonNwCntXfxYJL2E+0+qfx10SYT8c1LoLEvhGOg==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/service/auth-service"},"_npmVersion":"11.14.1","description":"Complete authentication and authorization service with multi-provider support and session management","directories":{"test":"tests"},"_nodeVersion":"20.20.2","dependencies":{"uuid":"^9.0.0","bcrypt":"^5.1.0","@bernierllc/logger":"1.6.0","@bernierllc/crypto-utils":"1.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.50.0","rimraf":"^5.0.0","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@types/uuid":"^9.0.4","@types/bcrypt":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-service_1.1.0_1779241556868_0.8929464945300527","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bernierllc/auth-service","version":"1.2.0","keywords":["authentication","authorization","jwt","oauth","session","security","rbac","mfa","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/auth-service@1.2.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"bd5399f87ae85fdf3fcfd91f83b98c5b01e7fe3d","tarball":"https://registry.npmjs.org/@bernierllc/auth-service/-/auth-service-1.2.0.tgz","fileCount":35,"integrity":"sha512-ci4TWjYgHceXkJXXvvTSOxhcX02cGtOVmrlgNh2F7B1dHrPGpDo157/3rpR75Bie/FTFeJGVm4qcuo05iZKWew==","signatures":[{"sig":"MEUCIQCf/hGRlyKH11RlnmP7FRupt7H79IUQCbLyr79vp1NSqwIgGfnA4tC6GdDS1r9RJomTZTtNW6cU4Ix227IBOBJsItY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":131078},"main":"dist/index.js","type":"commonjs","_from":"file:bernierllc-auth-service-1.2.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rimraf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:69fc19a9-c8cf-4266-8b10-efccbfd1a0cc"}},"_resolved":"/home/runner/work/tools/tools/packages/service/auth-service/bernierllc-auth-service-1.2.0.tgz","_integrity":"sha512-ci4TWjYgHceXkJXXvvTSOxhcX02cGtOVmrlgNh2F7B1dHrPGpDo157/3rpR75Bie/FTFeJGVm4qcuo05iZKWew==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/service/auth-service"},"_npmVersion":"11.14.1","description":"Complete authentication and authorization service with multi-provider support and session management","directories":{"test":"tests"},"_nodeVersion":"20.20.2","dependencies":{"uuid":"^9.0.0","bcrypt":"^5.1.0","@bernierllc/logger":"1.6.0","@bernierllc/crypto-utils":"1.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.50.0","rimraf":"^5.0.0","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@types/uuid":"^9.0.4","@types/bcrypt":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-service_1.2.0_1779244777202_0.504765077807247","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@bernierllc/auth-service","version":"1.3.0","keywords":["authentication","authorization","jwt","oauth","session","security","rbac","mfa","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/auth-service@1.3.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"06659d1432e1ef61dccff5b119ccebeee75e0d45","tarball":"https://registry.npmjs.org/@bernierllc/auth-service/-/auth-service-1.3.0.tgz","fileCount":35,"integrity":"sha512-A3Itwovnar6qwXhFD3Ev74HKgsTUVb1TRPimdgWpuf2Iw2elngI29TcNaM+0xJYvnDh2c+nH266IK3dG+nclYQ==","signatures":[{"sig":"MEUCIFeoAiwXu7AzEKxBIFAuZjCMx1EKiC8zcBxDj1+XTLBjAiEArfUzirAKvwI1DGJ9e5RrYpHdho4dr92x106ix4Pp6Zw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":131078},"main":"dist/index.js","type":"commonjs","_from":"file:bernierllc-auth-service-1.3.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rimraf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:69fc19a9-c8cf-4266-8b10-efccbfd1a0cc"}},"_resolved":"/home/runner/work/tools/tools/packages/service/auth-service/bernierllc-auth-service-1.3.0.tgz","_integrity":"sha512-A3Itwovnar6qwXhFD3Ev74HKgsTUVb1TRPimdgWpuf2Iw2elngI29TcNaM+0xJYvnDh2c+nH266IK3dG+nclYQ==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/service/auth-service"},"_npmVersion":"11.14.1","description":"Complete authentication and authorization service with multi-provider support and session management","directories":{"test":"tests"},"_nodeVersion":"20.20.2","dependencies":{"uuid":"^9.0.0","bcrypt":"^5.1.0","@bernierllc/logger":"1.6.0","@bernierllc/crypto-utils":"1.3.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.50.0","rimraf":"^5.0.0","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@types/uuid":"^9.0.4","@types/bcrypt":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-service_1.3.0_1779245904487_0.10806860082970005","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@bernierllc/auth-service","version":"1.4.0","keywords":["authentication","authorization","jwt","oauth","session","security","rbac","mfa","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/auth-service@1.4.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"daed91d3dd48656e24b6bec5b3a3717b09db1247","tarball":"https://registry.npmjs.org/@bernierllc/auth-service/-/auth-service-1.4.0.tgz","fileCount":35,"integrity":"sha512-vi8iB/E+PN0xLN7PLAfrzsxywh+8lUy2pV/4l5qKu4iNsh6/2VXyGYdQKDddnialLEqJ+6f739N1f0A9RrEfsQ==","signatures":[{"sig":"MEUCIQDWNwajipKwfCj2bvc9A8GTj12UTTKqxeVo0eWrAtCnDwIgfkiBln7GwfiKKurymqYt594c0lGgXno3witdYk20YPM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":131078},"main":"dist/index.js","type":"commonjs","_from":"file:bernierllc-auth-service-1.4.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rimraf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:69fc19a9-c8cf-4266-8b10-efccbfd1a0cc"}},"_resolved":"/home/runner/work/tools/tools/packages/service/auth-service/bernierllc-auth-service-1.4.0.tgz","_integrity":"sha512-vi8iB/E+PN0xLN7PLAfrzsxywh+8lUy2pV/4l5qKu4iNsh6/2VXyGYdQKDddnialLEqJ+6f739N1f0A9RrEfsQ==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/service/auth-service"},"_npmVersion":"11.14.1","description":"Complete authentication and authorization service with multi-provider support and session management","directories":{"test":"tests"},"_nodeVersion":"20.20.2","dependencies":{"uuid":"^9.0.0","bcrypt":"^5.1.0","@bernierllc/logger":"1.7.0","@bernierllc/crypto-utils":"1.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.50.0","rimraf":"^5.0.0","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@types/uuid":"^9.0.4","@types/bcrypt":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-service_1.4.0_1779250303069_0.6839300295748503","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@bernierllc/auth-service","version":"1.5.0","keywords":["authentication","authorization","jwt","oauth","session","security","rbac","mfa","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/auth-service@1.5.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"bffe299370cd91efd64c4be09e0e8874c5f6baeb","tarball":"https://registry.npmjs.org/@bernierllc/auth-service/-/auth-service-1.5.0.tgz","fileCount":35,"integrity":"sha512-Sa3dQQNbRi751IIhlYZQ4A2SgMeAEn4XCUSLOBlAYJKmi0BX75eltbZGRFdsrpI7NtcCQmLgjqessisMIp+ddw==","signatures":[{"sig":"MEQCIFFtoGI1JoFHS98oXulwlaXB7D4y4XqyOaHVbpEKCjLKAiAzWyr5+UvS58PnKz1qmtl48lMXTgh1spnu2nAF7/0sZQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":131050},"main":"dist/index.js","type":"commonjs","_from":"file:bernierllc-auth-service-1.5.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rimraf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:69fc19a9-c8cf-4266-8b10-efccbfd1a0cc"}},"_resolved":"/home/runner/work/tools/tools/packages/service/auth-service/bernierllc-auth-service-1.5.0.tgz","_integrity":"sha512-Sa3dQQNbRi751IIhlYZQ4A2SgMeAEn4XCUSLOBlAYJKmi0BX75eltbZGRFdsrpI7NtcCQmLgjqessisMIp+ddw==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/service/auth-service"},"_npmVersion":"11.15.0","description":"Complete authentication and authorization service with multi-provider support and session management","directories":{"test":"tests"},"_nodeVersion":"20.20.2","dependencies":{"uuid":"^11.1.1","bcrypt":"^5.1.0","@bernierllc/logger":"1.7.0","@bernierllc/crypto-utils":"1.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.50.0","rimraf":"^5.0.0","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@types/bcrypt":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/auth-service_1.5.0_1779840735660_0.7711726685233598","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"@bernierllc/auth-service","version":"1.5.1","description":"Complete authentication and authorization service with multi-provider support and session management","main":"dist/index.js","types":"dist/index.d.ts","keywords":["authentication","authorization","jwt","oauth","session","security","rbac","mfa","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/bernier-llc/tools.git","directory":"packages/service/auth-service"},"dependencies":{"bcrypt":"^5.1.0","uuid":"^11.1.1","@bernierllc/logger":"1.7.1","@bernierllc/crypto-utils":"1.4.0"},"devDependencies":{"@types/bcrypt":"^5.0.0","@types/jest":"^29.5.5","@types/node":"^20.6.0","eslint":"^8.50.0","jest":"^29.6.4","rimraf":"^5.0.0","ts-jest":"^29.1.1","typescript":"^5.2.2"},"engines":{"node":">=18.0.0"},"directories":{"test":"tests"},"type":"commonjs","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"homepage":"https://github.com/bernier-llc/tools#readme","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"build":"tsc","dev":"tsc --watch","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","test:run":"jest --passWithNoTests","lint":"eslint src/**/*.ts","clean":"rimraf dist"},"_id":"@bernierllc/auth-service@1.5.1","_integrity":"sha512-yDBUwONyZ0fdEIEd/SwIaCNpKUoVVpwMr8GG8aUXfbUGuiTdyXP7XuEUvmtO/C7aPvUvKRkuDYwdPPM0+UU0hw==","_resolved":"/home/runner/work/tools/tools/packages/service/auth-service/bernierllc-auth-service-1.5.1.tgz","_from":"file:bernierllc-auth-service-1.5.1.tgz","_nodeVersion":"24.18.0","_npmVersion":"12.0.1","dist":{"integrity":"sha512-yDBUwONyZ0fdEIEd/SwIaCNpKUoVVpwMr8GG8aUXfbUGuiTdyXP7XuEUvmtO/C7aPvUvKRkuDYwdPPM0+UU0hw==","shasum":"54523d2600c744f9cef56f093fc625a3076a9ec0","tarball":"https://registry.npmjs.org/@bernierllc/auth-service/-/auth-service-1.5.1.tgz","fileCount":35,"unpackedSize":131050,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDUw1ohVsqIAurONTXJNIHICtWVKxoaw8QjIgMG8OEPoAIhALMjwOR97LBs0mjfyCQLY06bIE9uf7OMqp93ABKVWG8c"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:69fc19a9-c8cf-4266-8b10-efccbfd1a0cc"}},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/auth-service_1.5.1_1784015775025_0.9939555300302505"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-14T22:34:42.440Z","modified":"2026-07-14T07:56:15.291Z","1.0.1":"2025-11-14T22:34:42.734Z","1.0.2":"2025-12-21T00:25:28.185Z","1.0.3":"2025-12-21T02:18:25.033Z","1.0.4":"2025-12-22T21:10:20.152Z","1.0.5":"2025-12-23T01:47:18.573Z","1.0.7":"2026-01-05T19:47:28.581Z","1.0.9":"2026-03-10T17:24:21.633Z","1.0.10":"2026-05-18T19:47:46.689Z","1.0.11":"2026-05-19T02:22:44.008Z","1.0.12":"2026-05-19T20:11:47.209Z","1.1.0":"2026-05-20T01:45:57.028Z","1.2.0":"2026-05-20T02:39:37.375Z","1.3.0":"2026-05-20T02:58:24.654Z","1.4.0":"2026-05-20T04:11:43.262Z","1.5.0":"2026-05-27T00:12:15.796Z","1.5.1":"2026-07-14T07:56:15.165Z"},"bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"author":{"name":"Bernier LLC"},"license":"MIT","homepage":"https://github.com/bernier-llc/tools#readme","keywords":["authentication","authorization","jwt","oauth","session","security","rbac","mfa","bernierllc"],"repository":{"type":"git","url":"git+https://github.com/bernier-llc/tools.git","directory":"packages/service/auth-service"},"description":"Complete authentication and authorization service with multi-provider support and session management","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/auth-service\n\nComplete authentication and authorization service with multi-provider support and session management.\n\n## Features\n\n- **🔐 Multi-Provider Authentication** - OAuth2, SAML, LDAP, local authentication\n- **🎫 JWT Token Management** - Secure JWT generation and verification using crypto-utils\n- **🔄 Refresh Tokens** - Automatic token renewal\n- **🛡️ Security Features** - Rate limiting, account lockout, password policies\n- **📧 Password Reset** - Magic link based password reset using crypto-utils\n- **👥 User Management** - Registration, profile management\n- **📊 Audit Logging** - Comprehensive authentication event logging\n- **🔒 Role-Based Access** - RBAC with permissions (coming soon)\n\n## Installation\n\n```bash\nnpm install @bernierllc/auth-service\n```\n\n## Quick Start\n\n```typescript\nimport { AuthService } from '@bernierllc/auth-service';\n\n// Initialize auth service\nconst authService = new AuthService({\n  jwt: {\n    secret: process.env.JWT_SECRET || 'your-secret-key',\n    expiresIn: '15m',\n    refreshExpiresIn: '7d'\n  },\n  password: {\n    minLength: 8,\n    requireUppercase: true,\n    requireLowercase: true,\n    requireNumbers: true,\n    requireSymbols: true\n  },\n  security: {\n    maxLoginAttempts: 5,\n    lockoutDuration: 15 * 60 * 1000, // 15 minutes\n    requireEmailVerification: false\n  }\n});\n\n// Register a new user\nconst registerResult = await authService.register({\n  username: 'johndoe',\n  email: 'john@example.com',\n  password: 'SecurePass123!',\n  firstName: 'John',\n  lastName: 'Doe',\n  acceptTerms: true\n});\n\nif (registerResult.success) {\n  console.log('User registered:', registerResult.user);\n  console.log('Access token:', registerResult.token);\n}\n\n// Login user\nconst loginResult = await authService.login({\n  email: 'john@example.com',\n  password: 'SecurePass123!'\n});\n\nif (loginResult.success) {\n  console.log('User logged in:', loginResult.user);\n  console.log('Access token:', loginResult.token);\n  console.log('Refresh token:', loginResult.refreshToken);\n}\n\n// Verify token\nconst user = await authService.verifyToken(loginResult.token!);\nif (user) {\n  console.log('Token valid for user:', user.email);\n}\n\n// Refresh token\nconst refreshResult = await authService.refreshToken(loginResult.refreshToken!);\nif (refreshResult.success) {\n  console.log('New access token:', refreshResult.token);\n}\n```\n\n## Password Reset Flow\n\n```typescript\n// Generate password reset link\nconst resetResult = await authService.generatePasswordResetLink('john@example.com');\nif (resetResult.success) {\n  console.log('Password reset link sent');\n  // In production, this would send an email with the reset link\n}\n\n// Reset password using token from email link\nconst newPassword = 'NewSecurePass123!';\nconst resetPasswordResult = await authService.resetPassword(resetToken, newPassword);\n\nif (resetPasswordResult.success) {\n  console.log('Password reset successfully');\n}\n```\n\n## Configuration\n\n### JWT Configuration\n\n```typescript\n{\n  jwt: {\n    secret: string;                    // JWT signing secret\n    issuer?: string;                   // JWT issuer claim\n    audience?: string;                 // JWT audience claim\n    expiresIn?: string | number;       // Access token expiry (default: '15m')\n    refreshExpiresIn?: string | number; // Refresh token expiry (default: '7d')\n    algorithm?: 'HS256' | 'HS384' | 'HS512' | 'RS256' | 'RS384' | 'RS512';\n  }\n}\n```\n\n### Password Policy\n\n```typescript\n{\n  password: {\n    minLength: number;          // Minimum password length\n    requireUppercase: boolean;  // Require uppercase letters\n    requireLowercase: boolean;  // Require lowercase letters\n    requireNumbers: boolean;    // Require numbers\n    requireSymbols: boolean;    // Require special characters\n    preventReuse: number;       // Prevent reusing last N passwords\n    maxAge?: number;           // Password expiry in milliseconds\n  }\n}\n```\n\n### Security Settings\n\n```typescript\n{\n  security: {\n    maxLoginAttempts: number;        // Max failed attempts before lockout\n    lockoutDuration: number;         // Account lockout duration (ms)\n    sessionTimeout: number;          // Session timeout (ms)\n    requireEmailVerification: boolean; // Require email verification\n    allowMultipleSessions: boolean;  // Allow multiple concurrent sessions\n  }\n}\n```\n\n### MFA Configuration (Coming Soon)\n\n```typescript\n{\n  mfa: {\n    enabled: boolean;\n    issuer?: string;\n    window?: number;\n    backupCodes: {\n      enabled: boolean;\n      count: number;\n      length: number;\n    };\n  }\n}\n```\n\n## API Reference\n\n### Class: AuthService\n\n#### `register(credentials: RegisterCredentials): Promise<AuthResult>`\n\nRegister a new user account.\n\n**Parameters:**\n- `credentials.username` - Unique username\n- `credentials.email` - Email address\n- `credentials.password` - Password (must meet policy requirements)\n- `credentials.firstName` - Optional first name\n- `credentials.lastName` - Optional last name\n- `credentials.acceptTerms` - Must be true\n- `credentials.emailMarketing` - Optional marketing consent\n\n**Returns:** Promise resolving to AuthResult with user, token, and refreshToken\n\n#### `login(credentials: LoginCredentials): Promise<AuthResult>`\n\nAuthenticate user login.\n\n**Parameters:**\n- `credentials.email` or `credentials.username` - User identifier\n- `credentials.password` - Password\n- `credentials.rememberMe` - Optional remember me flag\n\n**Returns:** Promise resolving to AuthResult with user, token, and refreshToken\n\n#### `verifyToken(token: string): Promise<User | null>`\n\nVerify and decode JWT access token.\n\n**Returns:** Promise resolving to User object or null if invalid\n\n#### `refreshToken(refreshToken: string): Promise<AuthResult>`\n\nGenerate new access token using refresh token.\n\n**Returns:** Promise resolving to AuthResult with new tokens\n\n#### `generatePasswordResetLink(email: string): Promise<{success: boolean; error?: string}>`\n\nGenerate password reset link for user.\n\n#### `resetPassword(token: string, newPassword: string): Promise<AuthResult>`\n\nReset user password using magic link token.\n\n## Third-Party Authentication Adapters\n\nThe auth-service supports integration with third-party authentication providers through a flexible adapter pattern. This allows you to:\n\n- Use external authentication services (Clerk, Auth0, Firebase, etc.) for user authentication\n- Maintain internal authorization and permission management\n- Seamlessly integrate multiple authentication methods\n\n### Supported Adapters\n\n- ✅ **ClerkAdapter** - Clerk authentication service integration\n- 🔄 **Auth0Adapter** - Auth0 platform integration (coming soon)  \n- 🔄 **FirebaseAdapter** - Firebase Authentication (coming soon)\n- 🔄 **AzureADAdapter** - Microsoft Azure Active Directory (coming soon)\n\n## 🚀 Quick Start: Adding to Existing Authentication\n\n**Already have Clerk, Auth0, or another auth provider?** You can add auth-service for authorization and permission management without changing your existing authentication flow.\n\n### Scenario: You Already Have Clerk Authentication\n\nIf you already have Clerk set up in your application, you can add auth-service to handle permissions and role-based access control:\n\n#### Step 1: Install and Configure\n\n```typescript\n// your-auth.ts - Add alongside your existing Clerk setup\nimport { AuthService, ClerkAdapter } from '@bernierllc/auth-service';\n\nexport const authService = new AuthService({\n  jwt: {\n    secret: process.env.JWT_SECRET!, // Different from Clerk's secret\n    expiresIn: '1h'\n  },\n  \n  // Configure the Clerk adapter\n  adapters: [\n    new ClerkAdapter({\n      secretKey: process.env.CLERK_SECRET_KEY!, // Same as your existing Clerk setup\n      publishableKey: process.env.CLERK_PUBLISHABLE_KEY!, // Same as your existing Clerk setup\n      jwtKey: process.env.CLERK_JWT_KEY, // Optional - for better performance\n      \n      // Define your application's permissions\n      roleMapping: {\n        // Map Clerk roles/orgs to your app's permissions\n        'admin': ['*'], // Full access\n        'content-manager': [\n          'content:read', 'content:write', 'content:delete',\n          'workflow:approve', 'analytics:view'\n        ],\n        'editor': [\n          'content:read', 'content:write', 'workflow:approve'\n        ],\n        'author': [\n          'content:read', 'content:write'\n        ],\n        'viewer': [\n          'content:read'\n        ]\n      }\n    })\n  ],\n  \n  // Disable local authentication - using Clerk for that\n  providers: [],\n  \n  security: {\n    maxLoginAttempts: 10, // Clerk handles rate limiting\n    lockoutDuration: 30 * 60 * 1000,\n    requireEmailVerification: false // Clerk handles this\n  }\n});\n```\n\n#### Step 2: Update Your Middleware (Keep Existing Clerk Code)\n\n```typescript\n// middleware.ts - Your existing Clerk middleware with added permissions\nimport { auth } from '@clerk/nextjs/server';\nimport { authService } from './your-auth';\n\n// Your existing Clerk middleware (keep as-is)\nexport default auth((req) => {\n  // Your existing Clerk logic...\n});\n\n// Add permission checking helpers\nexport async function checkPermission(permission: string) {\n  const { userId, sessionClaims } = auth();\n  \n  if (!userId) return false;\n  \n  // Use auth-service for permission checking\n  return await authService.hasPermission(userId, permission);\n}\n\nexport async function requirePermission(permission: string) {\n  const hasPermission = await checkPermission(permission);\n  \n  if (!hasPermission) {\n    throw new Error(`Permission denied: ${permission}`);\n  }\n}\n```\n\n#### Step 3: Add Permission Checks to Your Routes\n\n```typescript\n// app/api/content/route.ts - Example API route\nimport { auth } from '@clerk/nextjs/server';\nimport { authService } from '@/lib/your-auth';\nimport { NextResponse } from 'next/server';\n\nexport async function GET() {\n  const { userId, getToken } = auth();\n  \n  if (!userId) {\n    return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });\n  }\n  \n  // Check permission using auth-service\n  const canRead = await authService.hasPermission(userId, 'content:read');\n  if (!canRead) {\n    return NextResponse.json({ error: 'Permission denied' }, { status: 403 });\n  }\n  \n  // Your existing content logic...\n  return NextResponse.json({ content: 'Your content here' });\n}\n\nexport async function POST(request: Request) {\n  const { userId } = auth();\n  \n  if (!userId) {\n    return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });\n  }\n  \n  // Check write permission\n  const canWrite = await authService.hasPermission(userId, 'content:write');\n  if (!canWrite) {\n    return NextResponse.json({ error: 'Permission denied' }, { status: 403 });\n  }\n  \n  // Your content creation logic...\n  return NextResponse.json({ success: true });\n}\n```\n\n#### Step 4: Frontend Permission Checks (React/Next.js)\n\n```typescript\n// hooks/usePermissions.ts - Custom hook for frontend permission checking\nimport { useAuth, useUser } from '@clerk/nextjs';\nimport { useState, useEffect } from 'react';\n\nexport function usePermission(permission: string) {\n  const { userId, getToken } = useAuth();\n  const [hasPermission, setHasPermission] = useState<boolean | null>(null);\n  \n  useEffect(() => {\n    async function checkPermission() {\n      if (!userId) {\n        setHasPermission(false);\n        return;\n      }\n      \n      try {\n        const token = await getToken();\n        \n        // Call your API to check permission\n        const response = await fetch('/api/auth/check-permission', {\n          method: 'POST',\n          headers: {\n            'Authorization': `Bearer ${token}`,\n            'Content-Type': 'application/json'\n          },\n          body: JSON.stringify({ permission })\n        });\n        \n        const result = await response.json();\n        setHasPermission(result.hasPermission);\n      } catch (error) {\n        console.error('Permission check failed:', error);\n        setHasPermission(false);\n      }\n    }\n    \n    checkPermission();\n  }, [userId, permission]);\n  \n  return hasPermission;\n}\n\n// API route: app/api/auth/check-permission/route.ts\nimport { auth } from '@clerk/nextjs/server';\nimport { authService } from '@/lib/your-auth';\nimport { NextResponse } from 'next/server';\n\nexport async function POST(request: Request) {\n  const { userId } = auth();\n  \n  if (!userId) {\n    return NextResponse.json({ hasPermission: false });\n  }\n  \n  const { permission } = await request.json();\n  const hasPermission = await authService.hasPermission(userId, permission);\n  \n  return NextResponse.json({ hasPermission });\n}\n```\n\n#### Step 5: Component-Level Permission Control\n\n```tsx\n// components/ProtectedContent.tsx - Conditional rendering based on permissions\nimport { usePermission } from '@/hooks/usePermissions';\nimport { useUser } from '@clerk/nextjs';\n\ninterface ProtectedContentProps {\n  permission: string;\n  children: React.ReactNode;\n  fallback?: React.ReactNode;\n}\n\nexport function ProtectedContent({ permission, children, fallback }: ProtectedContentProps) {\n  const { isLoaded, isSignedIn } = useUser();\n  const hasPermission = usePermission(permission);\n  \n  if (!isLoaded) {\n    return <div>Loading...</div>;\n  }\n  \n  if (!isSignedIn) {\n    return fallback || <div>Please sign in</div>;\n  }\n  \n  if (hasPermission === null) {\n    return <div>Checking permissions...</div>;\n  }\n  \n  if (!hasPermission) {\n    return fallback || <div>Access denied</div>;\n  }\n  \n  return <>{children}</>;\n}\n\n// Usage in your components\nexport function ContentManager() {\n  return (\n    <div>\n      <h1>Content Manager</h1>\n      \n      {/* Show create button only if user can write */}\n      <ProtectedContent permission=\"content:write\">\n        <button>Create New Content</button>\n      </ProtectedContent>\n      \n      {/* Show approve button only if user can approve */}\n      <ProtectedContent permission=\"workflow:approve\">\n        <button>Approve Content</button>\n      </ProtectedContent>\n      \n      {/* Show analytics only for managers */}\n      <ProtectedContent permission=\"analytics:view\">\n        <AnalyticsPanel />\n      </ProtectedContent>\n    </div>\n  );\n}\n```\n\n### Alternative: Token-Based Integration (Any Auth Provider)\n\nIf you're using a different auth provider or want a more generic approach:\n\n```typescript\n// auth-integration.ts - Generic token-based integration\nimport { AuthService } from '@bernierllc/auth-service';\n\nconst authService = new AuthService({\n  jwt: { secret: process.env.JWT_SECRET! },\n  \n  // No adapters needed for generic integration\n  adapters: [],\n  providers: [],\n  \n  security: {\n    maxLoginAttempts: 5,\n    lockoutDuration: 15 * 60 * 1000,\n    requireEmailVerification: false\n  }\n});\n\n// Custom permission checker that works with any auth provider\nexport async function checkUserPermission(userId: string, permission: string): Promise<boolean> {\n  // You can implement custom logic here:\n  \n  // Option 1: Check against a database\n  const user = await getUserFromDatabase(userId);\n  return user.permissions.includes(permission) || user.roles.some(role => \n    getRolePermissions(role).includes(permission)\n  );\n  \n  // Option 2: Use auth-service's built-in permission system\n  return await authService.hasPermission(userId, permission);\n}\n\n// Middleware for any framework\nexport function requirePermissionMiddleware(permission: string) {\n  return async (req: any, res: any, next: any) => {\n    const userId = req.user?.id; // However you get user ID from your auth provider\n    \n    if (!userId) {\n      return res.status(401).json({ error: 'Unauthorized' });\n    }\n    \n    const hasPermission = await checkUserPermission(userId, permission);\n    \n    if (!hasPermission) {\n      return res.status(403).json({ error: `Permission denied: ${permission}` });\n    }\n    \n    next();\n  };\n}\n```\n\n### Key Benefits of This Approach\n\n1. **🔄 No Migration Required** - Keep your existing authentication flow\n2. **🛡️ Enhanced Security** - Add fine-grained permissions without touching auth\n3. **📈 Scalable** - Easily add new permissions as your app grows  \n4. **🔗 Framework Agnostic** - Works with Next.js, Express, Fastify, etc.\n5. **⚡ Performance** - Efficient permission checking with caching support\n6. **🧪 Testable** - Easy to test permission logic independently\n\n### Migration Timeline\n\n**Week 1**: Install and configure auth-service\n**Week 2**: Add permission checks to critical routes  \n**Week 3**: Implement frontend permission components\n**Week 4**: Roll out to all features\n\nThis approach lets you gradually add authorization features without disrupting your existing authentication setup.\n\n### Basic Adapter Usage\n\n```typescript\nimport { AuthService, ClerkAdapter } from '@bernierllc/auth-service';\n\nconst authService = new AuthService({\n  // Standard configuration...\n  jwt: {\n    secret: process.env.JWT_SECRET!,\n    expiresIn: '15m'\n  },\n  \n  // Add third-party adapters\n  adapters: [\n    new ClerkAdapter({\n      secretKey: process.env.CLERK_SECRET_KEY!,\n      publishableKey: process.env.CLERK_PUBLISHABLE_KEY!,\n      jwtKey: process.env.CLERK_JWT_KEY, // Optional - for networkless verification\n      roleMapping: {\n        'admin': ['*'], // Admin role gets all permissions\n        'editor': ['content:read', 'content:write', 'workflow:approve'],\n        'viewer': ['content:read']\n      }\n    })\n  ],\n  \n  // RBAC configuration for internal authorization\n  security: {\n    maxLoginAttempts: 5,\n    lockoutDuration: 15 * 60 * 1000,\n    requireEmailVerification: false\n  }\n});\n\n// Verify third-party tokens seamlessly\nconst user = await authService.verifyToken(clerkJwtToken);\nif (user) {\n  // Check permissions managed internally\n  const canApprove = await authService.hasPermission(user.id, 'workflow:approve');\n  console.log('User can approve workflows:', canApprove);\n}\n```\n\n### Clerk Integration Example\n\n```typescript\nimport { AuthService, ClerkAdapter } from '@bernierllc/auth-service';\n\n// Configure Clerk adapter with role mapping\nconst clerkAdapter = new ClerkAdapter({\n  secretKey: process.env.CLERK_SECRET_KEY!,\n  publishableKey: process.env.CLERK_PUBLISHABLE_KEY!,\n  jwtKey: process.env.CLERK_JWT_KEY, // For networkless token verification\n  domain: 'your-domain.com', // Optional custom domain\n  \n  // Map Clerk roles to internal permissions\n  roleMapping: {\n    'admin': ['*'], // Admin gets all permissions\n    'content-manager': ['content:read', 'content:write', 'content:delete'],\n    'editor': ['content:read', 'content:write', 'workflow:approve'],\n    'author': ['content:read', 'content:write'],\n    'viewer': ['content:read']\n  }\n});\n\nconst authService = new AuthService({\n  jwt: {\n    secret: process.env.JWT_SECRET!,\n    expiresIn: '1h'\n  },\n  adapters: [clerkAdapter],\n  \n  // No local providers needed - using Clerk for authentication\n  providers: [],\n  \n  security: {\n    maxLoginAttempts: 10, // Clerk handles this, but kept for local fallback\n    lockoutDuration: 30 * 60 * 1000,\n    requireEmailVerification: false // Clerk handles email verification\n  }\n});\n\n// Usage in your application\nexport class ContentController {\n  constructor(private authService: AuthService) {}\n  \n  async approveContent(req: Request, res: Response) {\n    // Extract JWT from Authorization header\n    const token = req.headers.authorization?.replace('Bearer ', '');\n    if (!token) {\n      return res.status(401).json({ error: 'No token provided' });\n    }\n    \n    // Verify token (will use Clerk adapter automatically)\n    const user = await this.authService.verifyToken(token);\n    if (!user) {\n      return res.status(401).json({ error: 'Invalid token' });\n    }\n    \n    // Check permission (managed internally by auth-service)\n    const canApprove = await this.authService.hasPermission(user.id, 'workflow:approve');\n    if (!canApprove) {\n      return res.status(403).json({ error: 'Insufficient permissions' });\n    }\n    \n    // Proceed with content approval\n    // ... your business logic here\n    \n    res.json({ success: true, message: 'Content approved' });\n  }\n}\n```\n\n### Express Middleware Integration\n\n```typescript\nimport express from 'express';\nimport { AuthService, ClerkAdapter } from '@bernierllc/auth-service';\n\nconst app = express();\n\n// Initialize auth service with Clerk\nconst authService = new AuthService({\n  jwt: { secret: process.env.JWT_SECRET! },\n  adapters: [\n    new ClerkAdapter({\n      secretKey: process.env.CLERK_SECRET_KEY!,\n      publishableKey: process.env.CLERK_PUBLISHABLE_KEY!,\n      roleMapping: {\n        'admin': ['*'],\n        'editor': ['content:read', 'content:write', 'workflow:approve'],\n        'viewer': ['content:read']\n      }\n    })\n  ]\n});\n\n// Authentication middleware\nconst authenticate = async (req: any, res: any, next: any) => {\n  try {\n    const token = req.headers.authorization?.replace('Bearer ', '');\n    if (!token) {\n      return res.status(401).json({ error: 'No token provided' });\n    }\n    \n    const user = await authService.verifyToken(token);\n    if (!user) {\n      return res.status(401).json({ error: 'Invalid token' });\n    }\n    \n    req.user = user; // Attach user to request\n    next();\n  } catch (error) {\n    res.status(500).json({ error: 'Authentication error' });\n  }\n};\n\n// Permission middleware\nconst requirePermission = (permission: string) => {\n  return async (req: any, res: any, next: any) => {\n    try {\n      if (!req.user) {\n        return res.status(401).json({ error: 'No authenticated user' });\n      }\n      \n      const hasPermission = await authService.hasPermission(req.user.id, permission);\n      if (!hasPermission) {\n        return res.status(403).json({ error: `Permission denied: ${permission}` });\n      }\n      \n      next();\n    } catch (error) {\n      res.status(500).json({ error: 'Permission check failed' });\n    }\n  };\n};\n\n// Protected routes\napp.get('/api/content', authenticate, requirePermission('content:read'), (req, res) => {\n  res.json({ content: 'Your content here' });\n});\n\napp.post('/api/content', authenticate, requirePermission('content:write'), (req, res) => {\n  // Create content logic\n  res.json({ success: true });\n});\n\napp.post('/api/content/:id/approve', authenticate, requirePermission('workflow:approve'), (req, res) => {\n  // Approve content logic\n  res.json({ success: true, message: 'Content approved' });\n});\n```\n\n### Creating Custom Adapters\n\nYou can create custom adapters for any authentication provider by implementing the `AuthAdapter` interface:\n\n```typescript\nimport { AuthAdapter, User, BaseAuthAdapter } from '@bernierllc/auth-service';\n\nexport class CustomAuthAdapter extends BaseAuthAdapter {\n  name = 'custom-provider';\n  type = 'custom' as const;\n  \n  constructor(private config: CustomAdapterConfig) {\n    super();\n    this.validateConfig(config);\n  }\n  \n  async verifyToken(token: string): Promise<User | null> {\n    try {\n      // 1. Verify token with your auth provider\n      const tokenData = await this.provider.verifyJWT(token);\n      \n      // 2. Get user information from token or API call\n      const userData = await this.provider.getUser(tokenData.userId);\n      \n      // 3. Map to auth-service User format\n      return {\n        id: userData.id,\n        username: userData.username,\n        email: userData.email,\n        emailVerified: userData.emailVerified,\n        roles: this.mapRoles(userData.roles, this.config.roleMapping),\n        permissions: this.mapPermissions(userData.roles, this.config.roleMapping),\n        profile: userData.profile,\n        preferences: userData.preferences || {},\n        security: userData.security || {},\n        createdAt: new Date(userData.createdAt),\n        updatedAt: new Date(userData.updatedAt),\n        lastLoginAt: userData.lastLoginAt ? new Date(userData.lastLoginAt) : undefined\n      };\n    } catch (error) {\n      console.error('Token verification failed:', error);\n      return null;\n    }\n  }\n  \n  async getUserById(userId: string): Promise<User | null> {\n    // Implement user lookup by ID\n    return null;\n  }\n}\n\n// Use your custom adapter\nconst authService = new AuthService({\n  adapters: [\n    new CustomAuthAdapter({\n      apiKey: process.env.CUSTOM_AUTH_API_KEY!,\n      roleMapping: {\n        'superuser': ['*'],\n        'contributor': ['content:read', 'content:write']\n      }\n    })\n  ]\n});\n```\n\n### Best Practices\n\n1. **Security**: Always validate tokens server-side\n2. **Role Mapping**: Define clear role-to-permission mappings\n3. **Error Handling**: Handle adapter failures gracefully\n4. **Logging**: Monitor authentication and authorization events\n5. **Testing**: Test with real tokens from your auth provider\n\n## Integration with Crypto-Utils\n\nThis service leverages `@bernierllc/crypto-utils` for:\n\n- **JWT Generation & Verification** - Secure token handling\n- **Magic Links** - Password reset functionality\n- **API Key Generation** - Secure random key generation\n- **Password Hashing** - Using bcrypt for secure password storage\n\n## Dependencies\n\n- `@bernierllc/crypto-utils` - Cryptographic utilities\n- `@bernierllc/logger` - Structured logging\n- `bcrypt` - Password hashing\n- `uuid` - Unique ID generation\n\n## Integration Status\n\n- **Logger**: integrated - Uses @bernierllc/logger for authentication event logging and security monitoring\n- **NeverHub**: not-applicable - Auth service operates independently without service discovery requirements\n- **Docs-Suite**: ready - Complete documentation with TypeScript examples, API reference, and integration guides\n\n## License\n\nCopyright (c) 2025 Bernier LLC. All rights reserved.","readmeFilename":"README.md"}