{"_id":"@cas-system/nextjs-cas-client","_rev":"2-ac5e7938c7b9a59f249311874bb31ac6","name":"@cas-system/nextjs-cas-client","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@cas-system/nextjs-cas-client","version":"1.0.0","keywords":["nextjs","cas","sso","authentication","central-authentication","app-router","server-components","middleware"],"license":"MIT","_id":"@cas-system/nextjs-cas-client@1.0.0","maintainers":[{"name":"insol_user","email":"insoldev000@gmail.com"}],"homepage":"https://github.com/InSol-2021/one-system#readme","bugs":{"url":"https://github.com/InSol-2021/one-system/issues"},"dist":{"shasum":"7b0fb615306e6022ee56dd0c44cc6d08e43ce48d","tarball":"https://registry.npmjs.org/@cas-system/nextjs-cas-client/-/nextjs-cas-client-1.0.0.tgz","fileCount":63,"integrity":"sha512-2bbCAiPfeJYPUNyBhukaC5iVYd9QXxVhd0hxKzk7qSv3M/oYm8ECAAkjepzNCmhGSRDKqbd5Dj+PTE70tLSjfw==","signatures":[{"sig":"MEUCIQCu4GHr9XnZaXtq3QtG4X1AWuxBjFfMHlnc6JnLbjev4QIgZBo0I755RyvNeHJn0Gl/w04J2I8b+K16qGXx5tBlP6Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104757},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.js"},"./handlers":{"types":"./dist/handlers/index.d.ts","import":"./dist/handlers/index.mjs","require":"./dist/handlers/index.js"},"./middleware":{"types":"./dist/middleware.d.ts","import":"./dist/middleware.mjs","require":"./dist/middleware.js"}},"gitHead":"80ec5e5285cd1d810e8222df1dae82376d7da0dc","scripts":{"dev":"tsc --watch","lint":"tsc --noEmit","build":"tsc","clean":"rm -rf dist","prepublishOnly":"npm run build"},"_npmUser":{"name":"insol_user","email":"insoldev000@gmail.com"},"repository":{"url":"git+https://github.com/InSol-2021/one-system.git","type":"git","directory":"packages/nextjs-cas-client"},"_npmVersion":"10.2.4","description":"Next.js CAS (Central Authentication System) Client SDK — App Router, Server Components, Middleware, and Client Hooks","directories":{},"_nodeVersion":"18.19.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"next":"^14.0.0","react":"^18.0.0","react-dom":"^18.0.0","typescript":"^5.0.0","@types/node":"^22.0.0","@types/react":"^18.0.0"},"peerDependencies":{"next":">=14","react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/nextjs-cas-client_1.0.0_1783485306692_0.729124750424222","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@cas-system/nextjs-cas-client","version":"1.0.1","description":"Next.js CAS (Central Authentication System) Client SDK — App Router, Server Components, Middleware, and Client Hooks","main":"./dist/cjs/index.js","module":"./dist/esm/index.js","types":"./dist/cjs/index.d.ts","exports":{".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/cjs/index.d.ts","default":"./dist/cjs/index.js"}},"./server":{"import":{"types":"./dist/esm/server/index.d.ts","default":"./dist/esm/server/index.js"},"require":{"types":"./dist/cjs/server/index.d.ts","default":"./dist/cjs/server/index.js"}},"./middleware":{"import":{"types":"./dist/esm/middleware.d.ts","default":"./dist/esm/middleware.js"},"require":{"types":"./dist/cjs/middleware.d.ts","default":"./dist/cjs/middleware.js"}},"./handlers":{"import":{"types":"./dist/esm/handlers/index.d.ts","default":"./dist/esm/handlers/index.js"},"require":{"types":"./dist/cjs/handlers/index.d.ts","default":"./dist/cjs/handlers/index.js"}}},"scripts":{"build":"npm run clean && tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json && node scripts/finalize-dist.mjs","dev":"tsc -p tsconfig.esm.json --watch","lint":"tsc --noEmit","clean":"rm -rf dist tsconfig.tsbuildinfo","prepublishOnly":"npm run build"},"peerDependencies":{"next":">=14","react":">=18","react-dom":">=18"},"devDependencies":{"@types/node":"^22.0.0","@types/react":"^18.0.0","next":"^14.0.0","react":"^18.0.0","react-dom":"^18.0.0","typescript":"^5.0.0"},"keywords":["nextjs","cas","sso","authentication","central-authentication","app-router","server-components","middleware"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/InSol-2021/one-system.git","directory":"packages/nextjs-cas-client"},"publishConfig":{"access":"public"},"_id":"@cas-system/nextjs-cas-client@1.0.1","gitHead":"07e3dad5213c45b05c26fc44fb4ad84330d23142","bugs":{"url":"https://github.com/InSol-2021/one-system/issues"},"homepage":"https://github.com/InSol-2021/one-system#readme","_nodeVersion":"18.19.1","_npmVersion":"10.2.4","dist":{"integrity":"sha512-HM6x8wr8X/QzT6cGEUvNPYdxYKB5UcTxKgMeXnH50F13X0z3SOK68xL6TdBF+QR6SiY8rdbX7QW0BNXiAQVOdw==","shasum":"bc7c6bf94191ff4bd17f96f934173d553364926e","tarball":"https://registry.npmjs.org/@cas-system/nextjs-cas-client/-/nextjs-cas-client-1.0.1.tgz","fileCount":125,"unpackedSize":207805,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCsnSYKN8encyUVvGYYUZwT0GxOwNRaYUIq33i3B6dL2QIhAP18/N3Z/xbjs1mDjaLqyMYrTPK4BaqVJZi/aNOIT45D"}]},"_npmUser":{"name":"insol_user","email":"insoldev000@gmail.com"},"directories":{},"maintainers":[{"name":"insol_user","email":"insoldev000@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nextjs-cas-client_1.0.1_1783625810799_0.43266208042023324"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-08T04:35:06.469Z","modified":"2026-07-09T19:36:51.115Z","1.0.0":"2026-07-08T04:35:06.838Z","1.0.1":"2026-07-09T19:36:50.956Z"},"bugs":{"url":"https://github.com/InSol-2021/one-system/issues"},"license":"MIT","homepage":"https://github.com/InSol-2021/one-system#readme","keywords":["nextjs","cas","sso","authentication","central-authentication","app-router","server-components","middleware"],"repository":{"type":"git","url":"git+https://github.com/InSol-2021/one-system.git","directory":"packages/nextjs-cas-client"},"description":"Next.js CAS (Central Authentication System) Client SDK — App Router, Server Components, Middleware, and Client Hooks","maintainers":[{"name":"insol_user","email":"insoldev000@gmail.com"}],"readme":"# @cas-system/nextjs-cas-client\n\nNext.js CAS (Central Authentication System) Client SDK for the **One System** CAS server.\nSupports the App Router, Server Components, Route Handlers, Middleware, and client-side hooks.\n\n## Install\n\n```bash\nnpm install @cas-system/nextjs-cas-client\n# peer deps: next >= 14, react >= 18, react-dom >= 18\n# runtime: Node.js >= 18.17 (App Router). Verified on Node 22.\n```\n\n## How the SSO flow works\n\n1. The browser is redirected to `GET {CAS_SERVER_URL}/sso/login?client_id={CLIENT_ID}`.\n2. After authenticating, the CAS server 302-redirects to your registered callback URL\n   with the token appended: `{callbackUrl}?token={JWT}`.\n3. Your callback route handler reads the `token` query parameter and validates it\n   **server-to-server** via `POST {CAS_SERVER_URL}/api/validate-token`\n   (body: `{ token, client_id, client_secret }`). The token is **single-use**.\n4. On success the handler establishes an `HttpOnly`, signed session cookie.\n\n## Configuration\n\nServer-side configuration (`CasServerConfig`):\n\n| Field          | Env var (suggested)   | Description                                  |\n| -------------- | --------------------- | -------------------------------------------- |\n| `serverUrl`    | `CAS_SERVER_URL`      | Base URL of the CAS server (no trailing `/`) |\n| `clientId`     | `CAS_CLIENT_ID`       | Registered client identifier                 |\n| `clientSecret` | `CAS_CLIENT_SECRET`   | Secret for server-to-server token validation |\n| `callbackUrl`  | `CAS_CALLBACK_URL`    | Optional; defaults to `/api/cas/callback`    |\n\nThe session cookie is signed with `CAS_COOKIE_SECRET` (falls back to `CAS_CLIENT_SECRET`).\n\n## Route handlers (App Router)\n\n```ts\n// app/api/cas/callback/route.ts\nimport { createCallbackHandler } from '@cas-system/nextjs-cas-client/handlers';\n\nexport const GET = createCallbackHandler({\n  cas: {\n    serverUrl: process.env.CAS_SERVER_URL!,\n    clientId: process.env.CAS_CLIENT_ID!,\n    clientSecret: process.env.CAS_CLIENT_SECRET!,\n  },\n  afterLoginUrl: '/dashboard',\n});\n```\n\n```ts\n// app/api/cas/logout/route.ts\nimport { createLogoutHandler } from '@cas-system/nextjs-cas-client/handlers';\n\nexport const POST = createLogoutHandler({\n  cas: {\n    serverUrl: process.env.CAS_SERVER_URL!,\n    clientId: process.env.CAS_CLIENT_ID!,\n    clientSecret: process.env.CAS_CLIENT_SECRET!,\n  },\n  afterLogoutUrl: '/',\n});\n```\n\n```ts\n// app/api/cas/user/route.ts\nimport { createUserHandler } from '@cas-system/nextjs-cas-client/handlers';\n\nexport const GET = createUserHandler();\n```\n\n## Middleware\n\n```ts\n// middleware.ts\nimport { createCasMiddleware } from '@cas-system/nextjs-cas-client/middleware';\n\nexport default createCasMiddleware({\n  protectedPaths: ['/dashboard', '/admin'],\n  publicPaths: ['/api/health'],\n  loginPath: '/login', // optional\n});\n\nexport const config = {\n  matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],\n};\n```\n\nThe middleware reads `CAS_SERVER_URL`, `CAS_CLIENT_ID`, and `CAS_CALLBACK_URL`\nfrom the environment when `loginPath` is not configured.\n\n## Client provider + hooks\n\n```tsx\n// app/layout.tsx\nimport { CasProvider } from '@cas-system/nextjs-cas-client';\n\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n  return (\n    <html>\n      <body>\n        {/* casServerUrl / casClientId / casCallbackUrl let login() build the\n            CAS SSO redirect. They are NEXT_PUBLIC_* (no secret). */}\n        <CasProvider\n          casServerUrl={process.env.NEXT_PUBLIC_CAS_SERVER_URL}\n          casClientId={process.env.NEXT_PUBLIC_CAS_CLIENT_ID}\n          casCallbackUrl={process.env.NEXT_PUBLIC_CAS_CALLBACK_URL}\n        >\n          {children}\n        </CasProvider>\n      </body>\n    </html>\n  );\n}\n```\n\n```tsx\n'use client';\nimport { useCasAuth, useCasUser, CasLoginButton, CasProtectedRoute } from '@cas-system/nextjs-cas-client';\n\nexport function Navbar() {\n  const { user, isAuthenticated, login, logout } = useCasAuth();\n  return isAuthenticated\n    ? <button onClick={logout}>Sign out ({user?.username})</button>\n    : <CasLoginButton>Sign in with SSO</CasLoginButton>;\n}\n```\n\n## Server-side session helpers\n\n```ts\nimport { cookies } from 'next/headers';\nimport { getCasSession, withCasAuth, CasClient } from '@cas-system/nextjs-cas-client/server';\n\n// In a Server Component / Route Handler\nconst session = await getCasSession(await cookies());\n\n// Protect a route handler\nexport const GET = withCasAuth(async (req, ctx, user) => {\n  return Response.json({ message: `Hello ${user.username}` });\n});\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}