{"_id":"@ankushsehgal909/react-auth-core","_rev":"3-24cd6d667144c1d8dd0948d924f5ef0a","name":"@ankushsehgal909/react-auth-core","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@ankushsehgal909/react-auth-core","version":"1.0.0","keywords":["react","authentication","auth","rbac","access-token","refresh-token","security"],"author":"","license":"MIT","_id":"@ankushsehgal909/react-auth-core@1.0.0","maintainers":[{"name":"ankushsehgal909org","email":"ankushsahagal999@gmail.com"}],"dist":{"shasum":"93f99cafa6d3a11ae97a3574865634122eceb9f9","tarball":"https://registry.npmjs.org/@ankushsehgal909/react-auth-core/-/react-auth-core-1.0.0.tgz","fileCount":16,"integrity":"sha512-TmBbSZI4Ow3j2Q5j6yLppImj3N6RYbPn4dMer9xzRGOG2K6atSpER+Tm0UrdsNIKdH3pSR01mssncTf5yJnwxQ==","signatures":[{"sig":"MEUCIB+ZwdnInacYJD9I8wRHhwMj7i6CquwTB9nGkKeenOWuAiEAr2y3SuLxUc+pEVzziNVnpusSc2r3412QhFJrvFiEhaw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36968},"main":"dist/index.cjs.js","types":"dist/index.d.ts","module":"dist/index.esm.js","gitHead":"3a03ba66c1c50c075983a2e929b097a98b8cf3dc","scripts":{"build":"rollup -c","prepublishOnly":"npm run build"},"_npmUser":{"name":"ankushsehgal909org","email":"ankushsahagal999@gmail.com"},"_npmVersion":"10.9.2","description":"Production-ready React authentication library with RBAC, tokens, and auto-refresh","directories":{},"_nodeVersion":"23.11.0","_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.6.0","rollup":"^4.0.0","typescript":"^5.0.0","@types/react":"^19.1.0","@types/estree":"^1.0.5","@rollup/plugin-commonjs":"^25.0.0","@rollup/plugin-typescript":"^11.0.0","@rollup/plugin-node-resolve":"^15.0.0"},"peerDependencies":{"react":">=17","react-router-dom":">=6"},"_npmOperationalInternal":{"tmp":"tmp/react-auth-core_1.0.0_1772192034525_0.5080460511848739","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@ankushsehgal909/react-auth-core","version":"1.0.1","keywords":["react","react-auth","react authentication","auth library","protected route","rbac","jwt","refresh token","access token"],"author":"","license":"MIT","_id":"@ankushsehgal909/react-auth-core@1.0.1","maintainers":[{"name":"ankushsehgal909org","email":"ankushsahagal999@gmail.com"}],"dist":{"shasum":"1ba2cc194f3e2bfede4a87066e1336913f6878d7","tarball":"https://registry.npmjs.org/@ankushsehgal909/react-auth-core/-/react-auth-core-1.0.1.tgz","fileCount":16,"integrity":"sha512-1EyE30VOAzowGzbmDA1AGrWdegViUUN1Ylw1lIieSW4b9D9Oc05tafJwA5OapSK+ZPkafOAZCXjmC2uXNYEuFw==","signatures":[{"sig":"MEQCIBqBPJxnWUNVniR+GtjkC2BDqHmGAr4H/t2YYugqobE6AiBT0GUR0hh6W/YJNRetCi2d7niRQXcFvaJImvh4o9bmHA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37018},"main":"dist/index.cjs.js","types":"dist/index.d.ts","module":"dist/index.esm.js","gitHead":"867b3fa33fd68dd998dbeb479bd2d26af7ddd37c","scripts":{"build":"rollup -c","prepublishOnly":"npm run build"},"_npmUser":{"name":"ankushsehgal909org","email":"ankushsahagal999@gmail.com"},"_npmVersion":"10.9.2","description":"Production-ready React authentication library with RBAC, tokens, and auto-refresh","directories":{},"_nodeVersion":"23.11.0","_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.6.0","rollup":"^4.0.0","typescript":"^5.0.0","@types/react":"^19.1.0","@types/estree":"^1.0.5","@rollup/plugin-commonjs":"^25.0.0","@rollup/plugin-typescript":"^11.0.0","@rollup/plugin-node-resolve":"^15.0.0"},"peerDependencies":{"react":">=17","react-router-dom":">=6"},"_npmOperationalInternal":{"tmp":"tmp/react-auth-core_1.0.1_1772192537418_0.9991700490151483","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@ankushsehgal909/react-auth-core","version":"1.0.2","description":"Production-ready React authentication library with RBAC, tokens, and auto-refresh","main":"dist/index.cjs.js","module":"dist/index.esm.js","types":"dist/index.d.ts","scripts":{"build":"rollup -c","prepublishOnly":"npm run build"},"peerDependencies":{"react":">=17","react-router-dom":">=6"},"devDependencies":{"@rollup/plugin-commonjs":"^25.0.0","@rollup/plugin-node-resolve":"^15.0.0","@rollup/plugin-typescript":"^11.0.0","@types/estree":"^1.0.5","@types/react":"^19.1.0","rollup":"^4.0.0","tslib":"^2.6.0","typescript":"^5.0.0"},"keywords":["react","react-auth","react authentication","auth library","protected route","rbac","jwt","refresh token","access token"],"author":"","license":"MIT","_id":"@ankushsehgal909/react-auth-core@1.0.2","gitHead":"094bdee9b2c173dac9d20ea0662116dd1bc73b96","_nodeVersion":"20.19.6","_npmVersion":"10.8.2","dist":{"integrity":"sha512-35hMgSTKp/vYwSn4OXTuvxVQ2EbHxBMs+511vleRlHIJloruoZ9J+uBM4PawQDhJ1cw8fwe/L8l/wQy3Oli2xg==","shasum":"432663eaacc06bd10efdb634aa0e979cdcdbf6af","tarball":"https://registry.npmjs.org/@ankushsehgal909/react-auth-core/-/react-auth-core-1.0.2.tgz","fileCount":20,"unpackedSize":58855,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCnK9g1qAVaXiWACnBAkmPdUeTnzDyqpDBECk6pR79nugIgZq0FIfXeJ3r+7AcgGVe3XuipyEXF77SCvri6KkxlzVA="}]},"_npmUser":{"name":"ankushsehgal909org","email":"ankushsahagal999@gmail.com"},"directories":{},"maintainers":[{"name":"ankushsehgal909org","email":"ankushsahagal999@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react-auth-core_1.0.2_1785413783612_0.23302063498246928"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-27T11:33:54.419Z","modified":"2026-07-30T12:16:24.518Z","1.0.0":"2026-02-27T11:33:54.666Z","1.0.1":"2026-02-27T11:42:17.576Z","1.0.2":"2026-07-30T12:16:23.778Z"},"license":"MIT","keywords":["react","react-auth","react authentication","auth library","protected route","rbac","jwt","refresh token","access token"],"description":"Production-ready React authentication library with RBAC, tokens, and auto-refresh","maintainers":[{"name":"ankushsehgal909org","email":"ankushsahagal999@gmail.com"}],"readme":"# react-auth-core\n\nA production-ready React authentication library with enterprise-grade features.\n\n## Features\n\n✅ Access + refresh tokens  \n✅ Optional cookie-based secure architecture  \n✅ Storage-based fallback  \n✅ Auto refresh + refresh locking  \n✅ RBAC (roles & permissions)  \n✅ Protected routes  \n✅ UI-level access control  \n✅ Multi-Factor Authentication (MFA)\n✅ Dedicated permission hooks (`useRole`, `usePermissions`)\n✅ Route guard Higher-Order Components (withAuth, withRole)\n✅ TypeScript-first  \n✅ npm-publish ready\n\n## Installation\n\n```bash\nnpm install @ankushsehgal909/react-auth-core\n```\n\n## Peer Dependencies\n\n```bash\nnpm install react react-router-dom\n```\n\n## Usage\n\n### Cookie-Based (Secure)\n\n```tsx\nimport { AuthProvider } from \"@ankushsehgal909/react-auth-core\";\n\n<AuthProvider refreshEndpoint=\"/auth/refresh\" refreshStrategy=\"cookie\">\n  <App />\n</AuthProvider>;\n```\n\n### Storage-Based (Fallback)\n\n```tsx\nimport { AuthProvider, localStorageAdapter } from \"@ankushsehgal909/react-auth-core\";\n\n<AuthProvider\n  refreshEndpoint=\"/auth/refresh\"\n  refreshStrategy=\"storage\"\n  storage={localStorageAdapter()}\n>\n  <App />\n</AuthProvider>;\n```\n\n## API\n\n### AuthProvider\n\n| Prop              | Type                    | Required | Description                      |\n| ----------------- | ----------------------- | -------- | -------------------------------- |\n| `refreshEndpoint` | `string`                | Yes      | Endpoint to refresh access token |\n| `refreshStrategy` | `\"cookie\" \\| \"storage\"` | No       | Default: `\"storage\"`             |\n| `storage`         | `StorageAdapter`        | No       | Custom storage adapter           |\n| `fetcher`         | `typeof fetch`          | No       | Custom fetch function            |\n| `mfaEndpoint`     | `string`                | No       | Endpoint to verify MFA token     |\n\n### useAuth Hook\n\n```tsx\nconst {\n  isAuthenticated,\n  isMfaRequired,\n  mfaToken,\n  accessToken,\n  user,\n  login,\n  logout,\n  refreshAccessToken,\n  verifyMfa,\n  canAccess,\n} = useAuth();\n```\n\n### canAccess\n\n```tsx\nconst canAccess = useAuth().canAccess({\n  roles: [\"admin\"],\n  permissions: [\"read:data\", \"write:data\"],\n});\n```\n\n### ProtectedRoute\n\n```tsx\nimport { ProtectedRoute } from \"@ankushsehgal909/react-auth-core\";\n\n<ProtectedRoute\n  roles={[\"admin\"]}\n  permissions={[\"read:data\"]}\n  redirectTo=\"/login\"\n  forbiddenTo=\"/403\"\n>\n  <Dashboard />\n</ProtectedRoute>;\n```\n\n### Can Component\n\n```tsx\nimport { Can } from \"@ankushsehgal909/react-auth-core\";\n\n<Can roles={[\"admin\"]} permissions={[\"write:data\"]} fallback={<AccessDenied />}>\n  <DeleteButton />\n</Can>;\n```\n\n### useRole & usePermissions Hooks\n\n```tsx\nimport { useRole, usePermissions } from \"@ankushsehgal909/react-auth-core\";\n\nconst isAdmin = useRole(\"admin\");\nconst canWrite = usePermissions(\"write:data\");\n```\n\n### Higher-Order Components (HOCs)\n\n```tsx\nimport { withAuth, withRole } from \"@ankushsehgal909/react-auth-core\";\n\nconst ProtectedDashboard = withAuth(Dashboard, { redirectTo: \"/login\" });\nconst AdminPanel = withRole(Panel, { roles: [\"admin\"], redirectTo: \"/403\" });\n```\n\n### Multi-Factor Authentication (MFA)\n\nIf your login endpoint returns an MFA challenge (`{ mfaRequired: true, mfaToken: \"...\" }`), the context enters an intermediate state where `isMfaRequired` is `true`.\n\n```tsx\nconst { isMfaRequired, verifyMfa } = useAuth();\n\n// ... inside your component\nif (isMfaRequired) {\n  return (\n    <button onClick={() => verifyMfa(\"123456\")}>\n      Submit MFA Code\n    </button>\n  );\n}\n```\n\n## Types\n\n### User\n\n```ts\ninterface User {\n  id: string;\n  roles?: string[];\n  permissions?: string[];\n}\n```\n\n### LoginPayload\n\n```ts\n// With MFA Challenge\ntype LoginPayload = {\n  mfaRequired: true;\n  mfaToken: string;\n};\n\n// With refresh token (storage strategy)\ntype LoginPayload = {\n  mfaRequired?: false;\n  accessToken: string;\n  refreshToken: string;\n  expiresIn: number;\n  user: User;\n};\n\n// Without refresh token (cookie strategy)\ntype LoginPayload = {\n  mfaRequired?: false;\n  accessToken: string;\n  expiresIn: number;\n  user: User;\n};\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}