{"_id":"@autonomous2026/auth-sdk","_rev":"8-7446f580c51f7965a5bf9482e6a41442","name":"@autonomous2026/auth-sdk","dist-tags":{"latest":"1.0.6"},"versions":{"1.0.0":{"name":"@autonomous2026/auth-sdk","version":"1.0.0","keywords":["auth","sso","oauth2","pkce","react","authentication"],"author":{"name":"Autonomous"},"license":"MIT","_id":"@autonomous2026/auth-sdk@1.0.0","maintainers":[{"name":"autonomous2026","email":"dev@autonomous.ai"}],"homepage":"https://gitlab.com/autonomous-ecm/backend/auth-service/tree/main/example/web/sdk#readme","bugs":{"url":"https://gitlab.com/autonomous-ecm/backend/auth-service/issues"},"dist":{"shasum":"07e34b25e431f59f60116bf797142974a7a11368","tarball":"https://registry.npmjs.org/@autonomous2026/auth-sdk/-/auth-sdk-1.0.0.tgz","fileCount":42,"integrity":"sha512-fkAoFU/D0aRd5NQKAzZsMBmbw5q0mZfeMUofKerSXJQTn8RwFYj/puzmKxJGWjlwSkRTz1OnEonQA8bDsP8hiA==","signatures":[{"sig":"MEQCIFgtcUostSh0r5jhHyoJcUWYdghYgViEXax6gsbkEmZDAiAXR6ZUJpABLjx3lw1b8doDchi4Mv+CnOBZOpsE+1UlBw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63293},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"}},"gitHead":"666a987f338da1eec4fa25cd48fa62ac9f7c5061","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"autonomous2026","email":"dev@autonomous.ai"},"repository":{"url":"git+https://gitlab.com/autonomous-ecm/backend/auth-service.git","type":"git","directory":"example/web/sdk"},"_npmVersion":"10.8.2","description":"Client SDK for auth-service SSO flow with OAuth2 PKCE","directories":{},"_nodeVersion":"20.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","typescript":"^5.0.0","@types/react":"^19.0.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/auth-sdk_1.0.0_1767675707146_0.346821487018669","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Renamed: this package has moved to @autonomous-ai/auth-sdk. Install that instead."},"1.0.1":{"name":"@autonomous2026/auth-sdk","version":"1.0.1","keywords":["auth","sso","oauth2","pkce","react","authentication"],"author":{"name":"Autonomous"},"license":"MIT","_id":"@autonomous2026/auth-sdk@1.0.1","maintainers":[{"name":"autonomous2026","email":"dev@autonomous.ai"}],"homepage":"https://gitlab.com/autonomous-ecm/backend/auth-service/tree/main/example/web/sdk#readme","bugs":{"url":"https://gitlab.com/autonomous-ecm/backend/auth-service/issues"},"dist":{"shasum":"ebec38383af8a47e64ba8b8b3bd28d63cbb058aa","tarball":"https://registry.npmjs.org/@autonomous2026/auth-sdk/-/auth-sdk-1.0.1.tgz","fileCount":42,"integrity":"sha512-mfRKfaUPfScEqyyiP/bZvTOyZ6i5ROBzD/6YXHJFtzihjQDQJM709QEBT7kuDdEVScN5hCGIKI889HtRM4Cwxg==","signatures":[{"sig":"MEMCICtqPEoos2r63IbuFQiob3OfCTuVyKAjBK51p9OPKNjLAh9I3pqeLFMn5Ej7wfS6XiSuDsakWbNRaKEH+m5ZVccs","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64181},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"}},"gitHead":"666a987f338da1eec4fa25cd48fa62ac9f7c5061","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"autonomous2026","email":"dev@autonomous.ai"},"repository":{"url":"git+https://gitlab.com/autonomous-ecm/backend/auth-service.git","type":"git","directory":"example/web/sdk"},"_npmVersion":"10.8.2","description":"Client SDK for auth-service SSO flow with OAuth2 PKCE","directories":{},"_nodeVersion":"20.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","typescript":"^5.0.0","@types/react":"^19.0.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/auth-sdk_1.0.1_1767681959060_0.17396865664325678","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Renamed: this package has moved to @autonomous-ai/auth-sdk. Install that instead."},"1.0.2":{"name":"@autonomous2026/auth-sdk","version":"1.0.2","keywords":["auth","sso","oauth2","pkce","react","authentication"],"author":{"name":"Autonomous"},"license":"MIT","_id":"@autonomous2026/auth-sdk@1.0.2","maintainers":[{"name":"autonomous2026","email":"dev@autonomous.ai"}],"homepage":"https://gitlab.com/autonomous-ecm/backend/auth-service/tree/main/example/web/sdk#readme","bugs":{"url":"https://gitlab.com/autonomous-ecm/backend/auth-service/issues"},"dist":{"shasum":"70b6b9bf28ab44892e0ee81ef20d47b9f8234b1e","tarball":"https://registry.npmjs.org/@autonomous2026/auth-sdk/-/auth-sdk-1.0.2.tgz","fileCount":42,"integrity":"sha512-8H0ojxTgQUFjWZXAhUG10D1suy9lRO2Yj0fezTbauxCJJrnDTozMWjf5sNsJN8C/8ax4Bptm73mu64NhRPovZQ==","signatures":[{"sig":"MEUCIQCNgYG5RE8Apd6PTPcYTuBleY9PznOB6HCBsW51p5YzxAIgWg1D/3FSKrt8Kxjj1t1nbJp4HPu5O2Q9cDy5gOpx0Bk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64813},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"}},"gitHead":"cd8615001384d9be94fba5ce04f80219c101f022","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"autonomous2026","email":"dev@autonomous.ai"},"repository":{"url":"git+https://gitlab.com/autonomous-ecm/backend/auth-service.git","type":"git","directory":"example/web/sdk"},"_npmVersion":"10.8.2","description":"Client SDK for auth-service SSO flow with OAuth2 PKCE","directories":{},"_nodeVersion":"20.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","typescript":"^5.0.0","@types/react":"^19.0.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/auth-sdk_1.0.2_1767770537433_0.955228560203931","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Renamed: this package has moved to @autonomous-ai/auth-sdk. Install that instead."},"1.0.3":{"name":"@autonomous2026/auth-sdk","version":"1.0.3","keywords":["auth","sso","oauth2","pkce","react","authentication"],"author":{"name":"Autonomous"},"license":"MIT","_id":"@autonomous2026/auth-sdk@1.0.3","maintainers":[{"name":"autonomous2026","email":"dev@autonomous.ai"}],"homepage":"https://gitlab.com/autonomous-ecm/backend/auth-service/tree/main/example/web/sdk#readme","bugs":{"url":"https://gitlab.com/autonomous-ecm/backend/auth-service/issues"},"dist":{"shasum":"7e896e63c1f1445dcdea479ef84123cedeaf8e6c","tarball":"https://registry.npmjs.org/@autonomous2026/auth-sdk/-/auth-sdk-1.0.3.tgz","fileCount":46,"integrity":"sha512-CT7Q/Ak/3Da9F4iHH9xfk5uJ9EaKIPBq7oWHyY7UF8sPSbJTPfLq4p+QyNPv5G5N2RsUmk6slvb4Sp0IsM4mrQ==","signatures":[{"sig":"MEUCIGfKsGn2fmVSkt4wwyfCjFx69in5pwqC+ebmjVDveNPeAiEAodvCEaQj08l47mb84xYY9W2WPFZdX+3ymDk7/NDXe0g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65295},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"}},"gitHead":"14df762680699e34b6a9724256e1b67e0944127c","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"autonomous2026","email":"dev@autonomous.ai"},"repository":{"url":"git+https://gitlab.com/autonomous-ecm/backend/auth-service.git","type":"git","directory":"example/web/sdk"},"_npmVersion":"11.6.2","description":"Client SDK for auth-service SSO flow with OAuth2 PKCE","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","typescript":"^5.0.0","@types/react":"^19.0.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/auth-sdk_1.0.3_1770177642879_0.9372705877057712","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Renamed: this package has moved to @autonomous-ai/auth-sdk. Install that instead."},"1.0.4":{"name":"@autonomous2026/auth-sdk","version":"1.0.4","keywords":["auth","sso","oauth2","pkce","react","authentication"],"author":{"name":"Autonomous"},"license":"MIT","_id":"@autonomous2026/auth-sdk@1.0.4","maintainers":[{"name":"autonomous2026","email":"dev@autonomous.ai"}],"homepage":"https://gitlab.com/autonomous-ecm/backend/auth-service/tree/main/example/web/sdk#readme","bugs":{"url":"https://gitlab.com/autonomous-ecm/backend/auth-service/issues"},"dist":{"shasum":"d352786fa02ea4a4b46e25dbbe27a81cca067e38","tarball":"https://registry.npmjs.org/@autonomous2026/auth-sdk/-/auth-sdk-1.0.4.tgz","fileCount":46,"integrity":"sha512-fcGL+iwaF9GMF4c/6AiudaGbv6Uq0MV1Zt0YmnISTx2wKBlqVzF10MkyuYrEVeJCijmvRrM30/sfpAifig0auw==","signatures":[{"sig":"MEQCIFVl4WocY+B+niMSz/T6UN50eNLoB7NK9EHb0IWVxJ09AiBtOo7/cY0fwJ/Qp3eBB9utOExu+FnBFvXvBB6KGAO1Jw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65444},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"}},"gitHead":"92a307d9eaf687e3b22bac36b1c5071e44ea5dd7","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"autonomous2026","email":"dev@autonomous.ai"},"repository":{"url":"git+https://gitlab.com/autonomous-ecm/backend/auth-service.git","type":"git","directory":"example/web/sdk"},"_npmVersion":"11.6.2","description":"Client SDK for auth-service SSO flow with OAuth2 PKCE","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","typescript":"^5.0.0","@types/react":"^19.0.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/auth-sdk_1.0.4_1770178224388_0.9918118401133604","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Renamed: this package has moved to @autonomous-ai/auth-sdk. Install that instead."},"1.0.5":{"name":"@autonomous2026/auth-sdk","version":"1.0.5","keywords":["auth","sso","oauth2","pkce","react","authentication"],"author":{"name":"Autonomous"},"license":"MIT","_id":"@autonomous2026/auth-sdk@1.0.5","maintainers":[{"name":"autonomous2026","email":"dev@autonomous.ai"}],"homepage":"https://gitlab.com/autonomous-ecm/backend/auth-service/tree/main/example/web/sdk#readme","bugs":{"url":"https://gitlab.com/autonomous-ecm/backend/auth-service/issues"},"dist":{"shasum":"466d82d92151e2af9c578bcbc2ec64b32fd030b2","tarball":"https://registry.npmjs.org/@autonomous2026/auth-sdk/-/auth-sdk-1.0.5.tgz","fileCount":46,"integrity":"sha512-cBqnU/FEv2sKjEevNqIqa+PcBZ7ywhTPiSWvOdEdoEK9wUe5mtnfAmdwhLhRuQfCwEPR3rB4ecaI853mIZCI/A==","signatures":[{"sig":"MEUCIEHSX8p7TzLRRgnP96PI2gXohSLSx8yTU9yAprC+wS+XAiEA9upemxNHt+QzSxBkHtyTQA+nEBVDO7uuTtg7c6xl94Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68953},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"}},"gitHead":"1ba20ccb02713dab2311a5a5232ba2b3fbe8132e","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"autonomous2026","email":"dev@autonomous.ai"},"repository":{"url":"git+https://gitlab.com/autonomous-ecm/backend/auth-service.git","type":"git","directory":"example/web/sdk"},"_npmVersion":"11.6.2","description":"Client SDK for auth-service SSO flow with OAuth2 PKCE","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","typescript":"^5.0.0","@types/react":"^19.0.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/auth-sdk_1.0.5_1773371212010_0.8768635312123934","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Renamed: this package has moved to @autonomous-ai/auth-sdk. Install that instead."},"1.0.6":{"name":"@autonomous2026/auth-sdk","version":"1.0.6","keywords":["auth","sso","oauth2","pkce","react","authentication"],"author":{"name":"Autonomous"},"license":"MIT","_id":"@autonomous2026/auth-sdk@1.0.6","maintainers":[{"name":"autonomous2026","email":"dev@autonomous.ai"}],"homepage":"https://github.com/autonomousdotai/auth-sdk#readme","bugs":{"url":"https://github.com/autonomousdotai/auth-sdk/issues"},"dist":{"shasum":"051dbcc5b332293c5ab44722465b2a3ddb380372","tarball":"https://registry.npmjs.org/@autonomous2026/auth-sdk/-/auth-sdk-1.0.6.tgz","fileCount":46,"integrity":"sha512-G9R1r2/L30mbxs1xFFzhZuX6j5pu4+j6JkO1sdzxmfwkKOxW7BrsRObP4Va2d1PEmSoOCbOl5Q+Vmk+SOV/3pQ==","signatures":[{"sig":"MEYCIQCkLGq7oCa8fbKFY3oJdwF4fMe310Rf7eJP/n2MZs1YuQIhAM49Prl8JpPaV0mMgKMTPr/NWZR/4WOcxoVl70+hpCL4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68950},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"}},"gitHead":"36eab7840368e96ba2b581fbe3af401a5b32563f","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"autonomous2026","email":"dev@autonomous.ai"},"repository":{"url":"git+https://github.com/autonomousdotai/auth-sdk.git","type":"git"},"_npmVersion":"11.6.2","description":"Client SDK for auth-service SSO flow with OAuth2 PKCE","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","typescript":"^5.0.0","@types/react":"^19.0.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/auth-sdk_1.0.6_1778491807039_0.898361778662581","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Renamed: this package has moved to @autonomous-ai/auth-sdk. Install that instead."}},"time":{"created":"2026-01-06T05:01:47.005Z","modified":"2026-08-13T08:39:33.463Z","1.0.0":"2026-01-06T05:01:47.289Z","1.0.1":"2026-01-06T06:45:59.198Z","1.0.2":"2026-01-07T07:22:17.573Z","1.0.3":"2026-02-04T04:00:43.022Z","1.0.4":"2026-02-04T04:10:24.536Z","1.0.5":"2026-03-13T03:06:52.170Z","1.0.6":"2026-05-11T09:30:07.177Z"},"bugs":{"url":"https://github.com/autonomousdotai/auth-sdk/issues"},"author":{"name":"Autonomous"},"license":"MIT","homepage":"https://github.com/autonomousdotai/auth-sdk#readme","keywords":["auth","sso","oauth2","pkce","react","authentication"],"repository":{"url":"git+https://github.com/autonomousdotai/auth-sdk.git","type":"git"},"description":"Client SDK for auth-service SSO flow with OAuth2 PKCE","maintainers":[{"name":"autonomous2026","email":"dev@autonomous.ai"}],"readme":"# @autonomous2026/auth-sdk\n\nClient SDK for auth-service SSO OAuth2 flow with PKCE support.\n\n## Installation\n\n```bash\nnpm install @autonomous2026/auth-sdk\n```\n\nOr link locally:\n\n```bash\ncd sdk && npm install && npm run build\ncd .. && npm link ./sdk\n```\n\n## Quick Start (React)\n\n### 1. Wrap your app with AuthProvider\n\n```tsx\nimport { AuthProvider } from \"@autonomous2026/auth-sdk/react\";\n\nconst authConfig = {\n  ssoUrl: \"https://sso.example.com\",\n  clientId: \"my-app\",\n  redirectUri: \"https://app.example.com/callback\",\n  scope: \"openid profile email\",\n};\n\nfunction App() {\n  return (\n    <AuthProvider config={authConfig}>\n      <YourApp />\n    </AuthProvider>\n  );\n}\n```\n\n### 2. Use the hooks\n\n```tsx\nimport { useAuth, useUser } from \"@autonomous2026/auth-sdk/react\";\n\nfunction LoginButton() {\n  const { isAuthenticated, login, logout, isLoading } = useAuth();\n\n  if (isLoading) return <div>Loading...</div>;\n\n  if (isAuthenticated) {\n    return <button onClick={() => logout()}>Logout</button>;\n  }\n\n  return <button onClick={() => login()}>Login with SSO</button>;\n}\n\nfunction UserProfile() {\n  const user = useUser();\n\n  if (!user) return null;\n\n  return (\n    <div>\n      <p>Welcome, {user.fullName || user.email}!</p>\n    </div>\n  );\n}\n```\n\n### 3. Handle OAuth2 callback\n\n```tsx\nimport { useAuthCallback } from \"@autonomous2026/auth-sdk/react\";\nimport { useNavigate } from \"react-router-dom\";\n\nfunction CallbackPage() {\n  const navigate = useNavigate();\n  const { isLoading, error, success, nextUrl } = useAuthCallback(authConfig);\n\n  useEffect(() => {\n    if (success) {\n      // Redirect to nextUrl if provided, otherwise go to home\n      navigate(nextUrl || \"/\");\n    }\n  }, [success, navigate, nextUrl]);\n\n  if (isLoading) return <div>Processing login...</div>;\n  if (error) return <div>Login failed: {error}</div>;\n\n  return null;\n}\n```\n\n### 4. Post-login redirect (nextUrl)\n\nUse `nextUrl` to redirect users back to the page they were on before login. This is useful for protected pages that require authentication.\n\n```tsx\nimport { useAuth } from \"@autonomous2026/auth-sdk/react\";\nimport { useLocation } from \"react-router-dom\";\n\nfunction ProtectedPage() {\n  const location = useLocation();\n  const { isAuthenticated, isLoading, login } = useAuth();\n\n  useEffect(() => {\n    if (!isLoading && !isAuthenticated) {\n      // Save current URL and redirect to SSO\n      login({\n        nextUrl: `${location.pathname}${location.search}${location.hash}`,\n      });\n    }\n  }, [isAuthenticated, isLoading, login, location]);\n\n  if (isLoading || !isAuthenticated) {\n    return <div>Redirecting to login...</div>;\n  }\n\n  return <div>Protected content</div>;\n}\n```\n\nThe `nextUrl` is stored in `sessionStorage` before redirecting to SSO, and is returned via `useAuthCallback` after successful authentication. No server-side changes are needed.\n\n## Vanilla JavaScript Usage\n\n```typescript\nimport { AuthClient } from \"@autonomous2026/auth-sdk\";\n\nconst client = new AuthClient({\n  ssoUrl: \"https://sso.example.com\",\n  clientId: \"my-app\",\n  redirectUri: \"https://app.example.com/callback\",\n  scope: \"openid profile email\",\n});\n\n// Start login (with optional nextUrl for post-login redirect)\nawait client.authorize({ nextUrl: \"/dashboard\" });\n\n// Handle callback (on callback page)\nconst result = await client.handleCallback(code, state);\nif (result.success) {\n  console.log(\"Logged in!\", result.tokens);\n  // Redirect to nextUrl if provided\n  if (result.nextUrl) {\n    window.location.href = result.nextUrl;\n  }\n}\n\n// Check auth status\nif (client.isAuthenticated()) {\n  const user = client.getUser();\n  console.log(\"User:\", user);\n}\n\n// Get access token (auto-refreshes if expired)\nconst token = await client.getValidAccessToken();\n\n// Logout\nclient.logout();\n```\n\n## API Reference\n\n### AuthClient\n\n| Method                        | Description                     |\n| ----------------------------- | ------------------------------- |\n| `authorize(options?)`         | Start OAuth2 login flow         |\n| `handleCallback(code, state)` | Exchange code for tokens        |\n| `refreshToken()`              | Refresh access token            |\n| `logout(redirectUri?)`        | Logout and redirect to SSO      |\n| `isAuthenticated()`           | Check if user is logged in      |\n| `getAccessToken()`            | Get current access token        |\n| `getUser()`                   | Get decoded user from JWT       |\n| `getValidAccessToken()`       | Get token, refresh if expired   |\n| `clearTokens()`               | Clear tokens without SSO logout |\n\n### AuthorizeOptions\n\n| Option      | Type                                    | Description                                    |\n| ----------- | --------------------------------------- | ---------------------------------------------- |\n| `prompt`    | `'select_account' \\| 'none' \\| 'login'` | Force account selection or silent auth         |\n| `loginHint` | `string`                                | Pre-fill email for login                       |\n| `nextUrl`   | `string`                                | URL to redirect to after successful login      |\n\n### User Object\n\n| Field           | Type        | Description     |\n| --------------- | ----------- | --------------- |\n| `id`            | `string`    | User ID         |\n| `email`         | `string`    | User email      |\n| `fullName`      | `string?`   | Full name       |\n| `roles`         | `string[]?` | User roles      |\n| `companyDomain` | `string?`   | Company domain  |\n| `isEppUser`     | `boolean?`  | EPP user status |\n\n### React Hooks\n\n| Hook                      | Returns            | Description            |\n| ------------------------- | ------------------ | ---------------------- |\n| `useAuth()`               | `AuthContextValue` | Auth state and actions |\n| `useUser()`               | `User \\| null`     | Current user info      |\n| `useAuthCallback(config)` | Callback state     | Handle OAuth2 callback |\n\n### AuthProvider Props\n\n| Prop            | Type         | Default  | Description                      |\n| --------------- | ------------ | -------- | -------------------------------- |\n| `config`        | `AuthConfig` | required | Auth configuration               |\n| `autoRefresh`   | `boolean`    | `true`   | Auto-refresh tokens              |\n| `refreshBuffer` | `number`     | `60`     | Seconds before expiry to refresh |\n| `onAuthChange`  | `function`   | -        | Callback on auth state change    |\n\n## Custom Storage\n\nBy default, tokens are stored in `localStorage`. You can provide a custom storage:\n\n```typescript\nconst client = new AuthClient({\n  ...config,\n  storage: {\n    getItem: (key) => sessionStorage.getItem(key),\n    setItem: (key, value) => sessionStorage.setItem(key, value),\n    removeItem: (key) => sessionStorage.removeItem(key),\n  },\n});\n```\n\n## Security\n\n- Uses PKCE (S256) to prevent authorization code interception\n- State parameter for CSRF protection\n- PKCE verifier stored in sessionStorage (not localStorage)\n- Automatic token refresh before expiry\n","readmeFilename":"README.md"}