{"_id":"@autolabz/oauth-sdk","_rev":"13-4f2a7c13c913743fa30e30cd515c088a","name":"@autolabz/oauth-sdk","dist-tags":{"latest":"1.1.12"},"versions":{"1.0.0":{"name":"@autolabz/oauth-sdk","version":"1.0.0","keywords":["react","oauth2","pkce","authentication","sdk"],"author":{"name":"AutoLab Team"},"license":"MIT","_id":"@autolabz/oauth-sdk@1.0.0","maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"dist":{"shasum":"82d23fa1451ffbadab8ff9daba5b087a1f82a0bc","tarball":"https://registry.npmjs.org/@autolabz/oauth-sdk/-/oauth-sdk-1.0.0.tgz","fileCount":8,"integrity":"sha512-GG7CqNv1Ndga4QSGG4nY+26B65Fug4TE/i/Eye0Qy9LGvASNNCPEJXFgBNNFvkh/CWCpVBzQjLsnBuRWVYgtdA==","signatures":[{"sig":"MEUCIAQbITew2GFnRTMuIHY+VawOs74CZJB/uNcTmcs4jssAAiEAwrG49Cl+blbjhDo6DhmrddgTC3pRkfq9nFqijnCuNmo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":309103},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"4293308e7e812a7b3fdd7b1e9c75c8ea30f85dde","scripts":{"dev":"vite build --watch","lint":"eslint . --ext ts,tsx","test":"vitest run --passWithNoTests","build":"tsc && vite build","lint:fix":"eslint . --ext ts,tsx --fix","prepublishOnly":"npm run build && npm test -if-present"},"_npmUser":{"name":"autolabz","email":"mzhh@mzhh.xyz"},"_npmVersion":"10.8.2","description":"AutoLab OAuth SDK - React 组件库（授权码 + PKCE）","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.6.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.11","react":"^18.2.0","eslint":"^8.56.0","vitest":"^1.1.1","react-dom":"^18.2.0","typescript":"^5.3.3","@types/react":"^18.2.47","vite-plugin-dts":"^3.7.0","@types/react-dom":"^18.2.18","@vitejs/plugin-react":"^4.2.1","@typescript-eslint/parser":"^6.16.0","@typescript-eslint/eslint-plugin":"^6.16.0"},"peerDependencies":{"react":"^18.0.0","react-dom":"^18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oauth-sdk_1.0.0_1760693217874_0.017705277486134374","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@autolabz/oauth-sdk","version":"1.1.1","keywords":["react","oauth2","pkce","authentication","sdk"],"author":{"name":"AutoLab Team"},"license":"MIT","_id":"@autolabz/oauth-sdk@1.1.1","maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"dist":{"shasum":"6b91e4ca52af43c4ecf6dd48a381ef78885305b3","tarball":"https://registry.npmjs.org/@autolabz/oauth-sdk/-/oauth-sdk-1.1.1.tgz","fileCount":8,"integrity":"sha512-TpZyxEENcBfj6QDktsWeNUfqI/ocDAOdVfHXzDgYDbF0HbLO3fEDvYY9mYFk2sZqf7DgHA00XoYnE32915xGqQ==","signatures":[{"sig":"MEUCIQCa6hSkvHKpgsKWF8CFagVW+QA00zsxa80CvQdy0np79AIgcumEUmYRsbfzZdjgQA8q8kJ37R6kQxmbV4eXulr+tVY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":309354},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"4293308e7e812a7b3fdd7b1e9c75c8ea30f85dde","scripts":{"dev":"vite build --watch","lint":"eslint . --ext ts,tsx","test":"vitest run --passWithNoTests","build":"tsc && vite build","lint:fix":"eslint . --ext ts,tsx --fix","prepublishOnly":"npm run build && npm test -if-present"},"_npmUser":{"name":"autolabz","email":"mzhh@mzhh.xyz"},"_npmVersion":"10.8.2","description":"AutoLab OAuth SDK - React 组件库（授权码 + PKCE）","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.6.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.11","react":"^18.2.0","eslint":"^8.56.0","vitest":"^1.1.1","react-dom":"^18.2.0","typescript":"^5.3.3","@types/react":"^18.2.47","vite-plugin-dts":"^3.7.0","@types/react-dom":"^18.2.18","@vitejs/plugin-react":"^4.2.1","@typescript-eslint/parser":"^6.16.0","@typescript-eslint/eslint-plugin":"^6.16.0"},"peerDependencies":{"react":"^18.0.0","react-dom":"^18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oauth-sdk_1.1.1_1760698943960_0.4013709979169209","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@autolabz/oauth-sdk","version":"1.1.2","keywords":["react","oauth2","pkce","authentication","sdk"],"author":{"name":"AutoLab Team"},"license":"MIT","_id":"@autolabz/oauth-sdk@1.1.2","maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"dist":{"shasum":"6b4c5155905d5e7249b7e09d0a7c1d2f6e7710f8","tarball":"https://registry.npmjs.org/@autolabz/oauth-sdk/-/oauth-sdk-1.1.2.tgz","fileCount":8,"integrity":"sha512-ROK0wcjgmQGwfU8bwCvNXcpyx20vogjqePXnkaMbQMLdFFctEmNLNaSEqRAkl/aQ6mCVadvFwycCxsY3OfooEA==","signatures":[{"sig":"MEUCIQCfkTbONr0eAbwCZRg8mUKhPpFSi1EB+H66isFN8K9pOQIgG340enQXRYdA2QncrreMGGtun4IhAwQW9+5Jrwfy8is=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":310075},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"4293308e7e812a7b3fdd7b1e9c75c8ea30f85dde","scripts":{"dev":"vite build --watch","lint":"eslint . --ext ts,tsx","test":"vitest run --passWithNoTests","build":"tsc && vite build","lint:fix":"eslint . --ext ts,tsx --fix","prepublishOnly":"npm run build && npm test -if-present"},"_npmUser":{"name":"autolabz","email":"mzhh@mzhh.xyz"},"_npmVersion":"10.8.2","description":"AutoLab OAuth SDK - React 组件库（授权码 + PKCE）","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.6.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.11","react":"^18.2.0","eslint":"^8.56.0","vitest":"^1.1.1","react-dom":"^18.2.0","typescript":"^5.3.3","@types/react":"^18.2.47","vite-plugin-dts":"^3.7.0","@types/react-dom":"^18.2.18","@vitejs/plugin-react":"^4.2.1","@typescript-eslint/parser":"^6.16.0","@typescript-eslint/eslint-plugin":"^6.16.0"},"peerDependencies":{"react":"^18.0.0","react-dom":"^18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oauth-sdk_1.1.2_1760700694717_0.7850981231400276","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@autolabz/oauth-sdk","version":"1.1.3","keywords":["react","oauth2","pkce","authentication","sdk"],"author":{"name":"AutoLab Team"},"license":"MIT","_id":"@autolabz/oauth-sdk@1.1.3","maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"dist":{"shasum":"999821daf8ffc22b5b453dc966b849851ea56303","tarball":"https://registry.npmjs.org/@autolabz/oauth-sdk/-/oauth-sdk-1.1.3.tgz","fileCount":8,"integrity":"sha512-28GBMaxmOBvAd5pwyHj5pTucUCOjA1Ym0MvRonMA/83070XkkhSBouC/oCwX0YokKLCbqB0TsLGNOd97OW86wA==","signatures":[{"sig":"MEUCIQDmx8KzAUgh9rQ2ei9ANbnG/yx3Djra8/LuF2IiCumN/AIgBSZYf5OZnUku1VEGyT907holTMzFXg6kd9TClw4TUrw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":147570},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"5bce87ba3e45534289b0bdf8c2165f9c84f58b25","scripts":{"dev":"vite build --watch","lint":"eslint . --ext ts,tsx","test":"vitest run --passWithNoTests","build":"tsc && vite build","lint:fix":"eslint . --ext ts,tsx --fix","prepublishOnly":"npm run build && npm test -if-present"},"_npmUser":{"name":"autolabz","email":"mzhh@mzhh.xyz"},"_npmVersion":"10.8.2","description":"AutoLab OAuth SDK - React 组件库（授权码 + PKCE）","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.6.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.11","react":"^18.2.0","eslint":"^8.56.0","vitest":"^1.1.1","react-dom":"^18.2.0","typescript":"^5.3.3","@types/react":"^18.2.47","vite-plugin-dts":"^3.7.0","@types/react-dom":"^18.2.18","@vitejs/plugin-react":"^4.2.1","@typescript-eslint/parser":"^6.16.0","@typescript-eslint/eslint-plugin":"^6.16.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oauth-sdk_1.1.3_1761188435937_0.7582353253554259","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"@autolabz/oauth-sdk","version":"1.1.4","keywords":["react","oauth2","pkce","authentication","sdk"],"author":{"name":"AutoLab Team"},"license":"MIT","_id":"@autolabz/oauth-sdk@1.1.4","maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"dist":{"shasum":"48dd45f758ade8212c892bb8708f9b0f5caba004","tarball":"https://registry.npmjs.org/@autolabz/oauth-sdk/-/oauth-sdk-1.1.4.tgz","fileCount":8,"integrity":"sha512-dJMcz3mTC0CNEnjXa1UoldTT6sTGPFEwYkjPE0LPvgT9HFDpgZLum2RPhPdSSUcoNCrCdDqmPIQ5qBhZSGFyQw==","signatures":[{"sig":"MEQCIGI8jP3ZrY2QjFe0LOkeI8Z6TMd1wAYla/RGkisM/ubaAiBRfxvc5gWIlq+LCRA+9ZWZ2GldW7/4SybdMD9YBZmXkA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":150396},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"93935a6d544bf8cc249d07c95a7f15c6c9c8ed88","scripts":{"dev":"vite build --watch","lint":"eslint . --ext ts,tsx","test":"vitest run --passWithNoTests","build":"tsc && vite build","lint:fix":"eslint . --ext ts,tsx --fix","prepublishOnly":"npm run build && npm test -if-present"},"_npmUser":{"name":"autolabz","email":"mzhh@mzhh.xyz"},"_npmVersion":"10.8.2","description":"AutoLab OAuth SDK - React 组件库（授权码 + PKCE）","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.6.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.11","react":"^18.2.0","eslint":"^8.56.0","vitest":"^1.1.1","react-dom":"^18.2.0","typescript":"^5.3.3","@types/react":"^18.2.47","vite-plugin-dts":"^3.7.0","@types/react-dom":"^18.2.18","@vitejs/plugin-react":"^4.2.1","@typescript-eslint/parser":"^6.16.0","@typescript-eslint/eslint-plugin":"^6.16.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oauth-sdk_1.1.4_1761299872874_0.4841610111799124","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"@autolabz/oauth-sdk","version":"1.1.5","keywords":["react","oauth2","pkce","authentication","sdk"],"author":{"name":"AutoLab Team"},"license":"MIT","_id":"@autolabz/oauth-sdk@1.1.5","maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"dist":{"shasum":"804ff9a64657f9706c95ee82c9796651c6be8049","tarball":"https://registry.npmjs.org/@autolabz/oauth-sdk/-/oauth-sdk-1.1.5.tgz","fileCount":8,"integrity":"sha512-v8+LeyfHJkDJOKD10TroV/amy5c9O3Jh4qxIC+xFeEk3mlSYN8aiiYAouQls+TQvUCTRvhz7Rl3mLbUT+fDJPw==","signatures":[{"sig":"MEUCIQDqOaxwRfR1iCa8TGbrIpMKxmTyot7xlSJMXisDY/FccwIgC5hKMrhUKj3lU1xcAdef4UE+s+uC0aX/cEeX1FtZ+CE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":151756},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"bfcfe7a297b323491fa99ddbbcd7ef8da141cdd7","scripts":{"dev":"vite build --watch","lint":"eslint . --ext ts,tsx","test":"vitest run --passWithNoTests","build":"tsc && vite build","lint:fix":"eslint . --ext ts,tsx --fix","prepublishOnly":"npm run build && npm test -if-present"},"_npmUser":{"name":"autolabz","email":"mzhh@mzhh.xyz"},"_npmVersion":"10.8.2","description":"AutoLab OAuth SDK - React 组件库（授权码 + PKCE）","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.6.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.11","react":"^18.2.0","eslint":"^8.56.0","vitest":"^1.1.1","react-dom":"^18.2.0","typescript":"^5.3.3","@types/react":"^18.2.47","vite-plugin-dts":"^3.7.0","@types/react-dom":"^18.2.18","@vitejs/plugin-react":"^4.2.1","@typescript-eslint/parser":"^6.16.0","@typescript-eslint/eslint-plugin":"^6.16.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oauth-sdk_1.1.5_1761392802746_0.12478939693017588","host":"s3://npm-registry-packages-npm-production"}},"1.1.6":{"name":"@autolabz/oauth-sdk","version":"1.1.6","keywords":["react","oauth2","pkce","authentication","sdk"],"author":{"name":"AutoLab Team"},"license":"MIT","_id":"@autolabz/oauth-sdk@1.1.6","maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"dist":{"shasum":"591839a90c56e96aef32be4f8f3faecc17ae2353","tarball":"https://registry.npmjs.org/@autolabz/oauth-sdk/-/oauth-sdk-1.1.6.tgz","fileCount":8,"integrity":"sha512-dXUhxLa1JOekrImWHLcx59BLGFP7qF+0sG0UVsMcQamhgE05ZaYqjUGloKmZuK0H8ub4zNm/s4+RkGY5hCBqNw==","signatures":[{"sig":"MEUCIF+4fj7lXAK8k62NC67yqqgrX30P11Is78pB98oYHY/IAiEAmekNpA9OCtfcMytc3wJ92BvHmVCFdQsMHuRdaLfRDh4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":161678},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"77eba31449e2d94064dd6c9c6d84e79864a3a8c1","scripts":{"dev":"vite build --watch","lint":"eslint . --ext ts,tsx","test":"vitest run --passWithNoTests","build":"tsc && vite build","lint:fix":"eslint . --ext ts,tsx --fix","prepublishOnly":"npm run build && npm test -if-present"},"_npmUser":{"name":"autolabz","email":"mzhh@mzhh.xyz"},"_npmVersion":"10.8.2","description":"AutoLab OAuth SDK - React 组件库（授权码 + PKCE）","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.6.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.11","react":"^18.2.0","eslint":"^8.56.0","vitest":"^1.1.1","react-dom":"^18.2.0","typescript":"^5.3.3","@types/react":"^18.2.47","vite-plugin-dts":"^3.7.0","@types/react-dom":"^18.2.18","@vitejs/plugin-react":"^4.2.1","@typescript-eslint/parser":"^6.16.0","@typescript-eslint/eslint-plugin":"^6.16.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oauth-sdk_1.1.6_1762588011408_0.2903059551597136","host":"s3://npm-registry-packages-npm-production"}},"1.1.7":{"name":"@autolabz/oauth-sdk","version":"1.1.7","keywords":["react","oauth2","pkce","authentication","sdk"],"author":{"name":"AutoLab Team"},"license":"MIT","_id":"@autolabz/oauth-sdk@1.1.7","maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"dist":{"shasum":"2ebe2f75646d056169077168cf8ed7e9d2477cff","tarball":"https://registry.npmjs.org/@autolabz/oauth-sdk/-/oauth-sdk-1.1.7.tgz","fileCount":8,"integrity":"sha512-9/5VKpKLaKS3HW3DnONp1wSKXyeuJWUynORyO/SWC3vY7LWR+QaxDpvGtSSIwj6Oujevd+cqNwr5SLxMhgKOEQ==","signatures":[{"sig":"MEUCIHsDqYzl/Uyo7ZrmYu07ozXTFWV7fo4SR9gPgSfBRJKpAiEApeU3l99S1Joo8Xp4fhBGf7YFsAnSWJpRghhWbq3MUfw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175731},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"7aaed46abb7b0c16716e887d0501aadcd4b00fa6","scripts":{"dev":"vite build --watch","lint":"eslint . --ext ts,tsx","test":"vitest run --passWithNoTests","build":"tsc && vite build","lint:fix":"eslint . --ext ts,tsx --fix","prepublishOnly":"npm run build && npm test -if-present"},"_npmUser":{"name":"autolabz","email":"mzhh@mzhh.xyz"},"_npmVersion":"10.8.2","description":"AutoLab OAuth SDK - React 组件库（授权码 + PKCE）","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.6.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.11","react":"^18.2.0","eslint":"^8.56.0","vitest":"^1.1.1","react-dom":"^18.2.0","typescript":"^5.3.3","@types/react":"^18.2.47","vite-plugin-dts":"^3.7.0","@types/react-dom":"^18.2.18","@vitejs/plugin-react":"^4.2.1","@typescript-eslint/parser":"^6.16.0","@typescript-eslint/eslint-plugin":"^6.16.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oauth-sdk_1.1.7_1763040781898_0.11530282130553071","host":"s3://npm-registry-packages-npm-production"}},"1.1.8":{"name":"@autolabz/oauth-sdk","version":"1.1.8","keywords":["react","oauth2","pkce","authentication","sdk"],"author":{"name":"AutoLab Team"},"license":"MIT","_id":"@autolabz/oauth-sdk@1.1.8","maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"dist":{"shasum":"07fdcdd58a6cee6d09c15daae56e7c0c99398753","tarball":"https://registry.npmjs.org/@autolabz/oauth-sdk/-/oauth-sdk-1.1.8.tgz","fileCount":8,"integrity":"sha512-YliB+ZZ6p5dncPsYQQKdfvYlnaz0A4V7KE0N/ZeEFEXxNhNX2Y4qA8RXH23st2AtEEJGPMv7FloGH5PALik0Lg==","signatures":[{"sig":"MEUCIAlHp0qh/1ISZZ5h08nhapNA8FUj1Ffg/rE3q2ptAtvZAiEAu3K47ycJ9rxciAol4YdCyWt4qVBR71LQnM08F8Pe9Hk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":206148},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"2100f007a4759a2b8c9aeb2c2591efcf93d5346f","scripts":{"dev":"vite build --watch","lint":"eslint . --ext ts,tsx","test":"vitest run --passWithNoTests","build":"tsc && vite build","lint:fix":"eslint . --ext ts,tsx --fix","prepublishOnly":"npm run build && npm test -if-present"},"_npmUser":{"name":"autolabz","email":"mzhh@mzhh.xyz"},"_npmVersion":"10.8.2","description":"AutoLab OAuth SDK - React 组件库（授权码 + PKCE）","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.6.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.11","react":"^18.2.0","eslint":"^8.56.0","vitest":"^1.1.1","react-dom":"^18.2.0","typescript":"^5.3.3","@types/react":"^18.2.47","vite-plugin-dts":"^3.7.0","@types/react-dom":"^18.2.18","@vitejs/plugin-react":"^4.2.1","@typescript-eslint/parser":"^6.16.0","@typescript-eslint/eslint-plugin":"^6.16.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oauth-sdk_1.1.8_1763212271461_0.9694984355714698","host":"s3://npm-registry-packages-npm-production"}},"1.1.9":{"name":"@autolabz/oauth-sdk","version":"1.1.9","keywords":["react","oauth2","pkce","authentication","sdk"],"author":{"name":"AutoLab Team"},"license":"MIT","_id":"@autolabz/oauth-sdk@1.1.9","maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"dist":{"shasum":"feb8a3f412661efb3bf42aa18f79159a3001f85b","tarball":"https://registry.npmjs.org/@autolabz/oauth-sdk/-/oauth-sdk-1.1.9.tgz","fileCount":8,"integrity":"sha512-xOZE07hc5dc7EaZrJTNtV5cP1rJPcRbnowT6stnRQHrJeJglq1EDnI0G2hfhsucgAnRHgYQhecXp9cskJJKH2w==","signatures":[{"sig":"MEQCIDbWROrNY5Y0J2HNvbb587O86HUsVfkrquDe5VFHAqVeAiBnvOiDIjKiOa/3H8UuEp7yzfP935ab4Bhhw31fHqP8IQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192557},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"2100f007a4759a2b8c9aeb2c2591efcf93d5346f","scripts":{"dev":"vite build --watch","lint":"eslint . --ext ts,tsx","test":"vitest run --passWithNoTests","build":"tsc && vite build","lint:fix":"eslint . --ext ts,tsx --fix","prepublishOnly":"npm run build && npm test -if-present"},"_npmUser":{"name":"autolabz","email":"mzhh@mzhh.xyz"},"_npmVersion":"10.8.2","description":"AutoLab OAuth SDK - React 组件库（授权码 + PKCE）","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.6.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.11","react":"^18.2.0","eslint":"^8.56.0","vitest":"^1.1.1","react-dom":"^18.2.0","typescript":"^5.3.3","@types/react":"^18.2.47","vite-plugin-dts":"^3.7.0","@types/react-dom":"^18.2.18","@vitejs/plugin-react":"^4.2.1","@typescript-eslint/parser":"^6.16.0","@typescript-eslint/eslint-plugin":"^6.16.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oauth-sdk_1.1.9_1763212927143_0.22449115360144778","host":"s3://npm-registry-packages-npm-production"}},"1.1.10":{"name":"@autolabz/oauth-sdk","version":"1.1.10","keywords":["react","oauth2","pkce","authentication","sdk"],"author":{"name":"AutoLab Team"},"license":"MIT","_id":"@autolabz/oauth-sdk@1.1.10","maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"dist":{"shasum":"f8eee9acf3c43a0da7e51d6103f649d56acb0097","tarball":"https://registry.npmjs.org/@autolabz/oauth-sdk/-/oauth-sdk-1.1.10.tgz","fileCount":8,"integrity":"sha512-OLP3APdBxE6dpCQegmDXixpNFvwTdwKewJnXedrH2LMgCIT3BD/UDJb39IJ/bgJVPjB8nR2l0Jcov3yl3U2wEQ==","signatures":[{"sig":"MEUCIFtyes2i/hM1IvDLZ9QiPY0P4nbb9vaUYcubd3wy0eDOAiEAxbHq882VYquoh9l0jzRyZbOl9JdnPA/oXU+bOC8/EBA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199709},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"2100f007a4759a2b8c9aeb2c2591efcf93d5346f","scripts":{"dev":"vite build --watch","lint":"eslint . --ext ts,tsx","test":"vitest run --passWithNoTests","build":"tsc && vite build","lint:fix":"eslint . --ext ts,tsx --fix","prepublishOnly":"npm run build && npm test -if-present"},"_npmUser":{"name":"autolabz","email":"mzhh@mzhh.xyz"},"_npmVersion":"10.8.2","description":"AutoLab OAuth SDK - React 组件库（授权码 + PKCE）","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.6.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.11","react":"^18.2.0","eslint":"^8.56.0","vitest":"^1.1.1","react-dom":"^18.2.0","typescript":"^5.3.3","@types/react":"^18.2.47","vite-plugin-dts":"^3.7.0","@types/react-dom":"^18.2.18","@vitejs/plugin-react":"^4.2.1","@typescript-eslint/parser":"^6.16.0","@typescript-eslint/eslint-plugin":"^6.16.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oauth-sdk_1.1.10_1763213588472_0.04336994009122774","host":"s3://npm-registry-packages-npm-production"}},"1.1.11":{"name":"@autolabz/oauth-sdk","version":"1.1.11","keywords":["react","oauth2","pkce","authentication","sdk"],"author":{"name":"AutoLab Team"},"license":"MIT","_id":"@autolabz/oauth-sdk@1.1.11","maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"dist":{"shasum":"eb8da4d8a2644272e4ae75812ee922fbb060a736","tarball":"https://registry.npmjs.org/@autolabz/oauth-sdk/-/oauth-sdk-1.1.11.tgz","fileCount":8,"integrity":"sha512-bV1BWNKwt83Yoy1Z6dOHVXr5dIzkDAa2+sKGe6FVE6m8t2JPS4I1jtXa5PCgzTT9r/FMjVC/9Xf6Yd73gc3xiA==","signatures":[{"sig":"MEQCIDw4kqNEikB2IiAEaseodYEy7eJXcfzecFZgOpDRa4tuAiAitilJUKnur3DaGXOQQXohcLyRthjcNh1DmT7bABbGjw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208349},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"7b1ade33c4a017d49213b47af937459f8f8ce935","scripts":{"dev":"vite build --watch","lint":"eslint . --ext ts,tsx","test":"vitest run --passWithNoTests","build":"tsc && vite build","lint:fix":"eslint . --ext ts,tsx --fix","prepublishOnly":"npm run build && npm test -if-present"},"_npmUser":{"name":"autolabz","email":"mzhh@mzhh.xyz"},"_npmVersion":"10.8.2","description":"AutoLab OAuth SDK - React 组件库（授权码 + PKCE）","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.6.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.11","react":"^18.2.0","eslint":"^8.56.0","vitest":"^1.1.1","react-dom":"^18.2.0","typescript":"^5.3.3","@types/react":"^18.2.47","vite-plugin-dts":"^3.7.0","@types/react-dom":"^18.2.18","@vitejs/plugin-react":"^4.2.1","@typescript-eslint/parser":"^6.16.0","@typescript-eslint/eslint-plugin":"^6.16.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oauth-sdk_1.1.11_1764589675659_0.5021787633340713","host":"s3://npm-registry-packages-npm-production"}},"1.1.12":{"name":"@autolabz/oauth-sdk","version":"1.1.12","description":"AutoLab OAuth SDK - React 组件库（授权码 + PKCE）","main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","publishConfig":{"access":"public"},"sideEffects":false,"scripts":{"dev":"vite build --watch","build":"tsc && vite build","prepublishOnly":"npm run build && npm test -if-present","lint":"eslint . --ext ts,tsx","lint:fix":"eslint . --ext ts,tsx --fix","test":"vitest run --passWithNoTests"},"keywords":["react","oauth2","pkce","authentication","sdk"],"author":{"name":"AutoLab Team"},"license":"MIT","peerDependencies":{"react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"dependencies":{"axios":"^1.6.5"},"devDependencies":{"@types/react":"^18.2.47","@types/react-dom":"^18.2.18","@typescript-eslint/eslint-plugin":"^6.16.0","@typescript-eslint/parser":"^6.16.0","@vitejs/plugin-react":"^4.2.1","eslint":"^8.56.0","react":"^18.2.0","react-dom":"^18.2.0","typescript":"^5.3.3","vite":"^5.0.11","vite-plugin-dts":"^3.7.0","vitest":"^1.1.1"},"_id":"@autolabz/oauth-sdk@1.1.12","gitHead":"f1597a752ed7afb3db7156f0eb56f3c72f191283","_nodeVersion":"20.19.5","_npmVersion":"10.8.2","dist":{"integrity":"sha512-U/uzG+BjDoZkUzNNmQWozQx2afJDEqgS/VBMToYS2RI2ysiIQGGZ6nXppsnmGnQM4QE/0c7KyCHOlz/JGmurKQ==","shasum":"bb52d3a297a9afd481c24540a13f48cc45126dce","tarball":"https://registry.npmjs.org/@autolabz/oauth-sdk/-/oauth-sdk-1.1.12.tgz","fileCount":8,"unpackedSize":210572,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCiqy38T09+3kWjDts7Lgcoju1zS3uRSMQwKwyvUG3EAAIhAI5ub+gqq/9cmByeXZGDZb42t90iWGZDAPk/R/ZeoPeg"}]},"_npmUser":{"name":"autolabz","email":"mzhh@mzhh.xyz"},"directories":{},"maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/oauth-sdk_1.1.12_1768279643939_0.4074121341661996"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-17T09:26:57.811Z","modified":"2026-01-13T04:47:24.264Z","1.0.0":"2025-10-17T09:26:58.134Z","1.1.1":"2025-10-17T11:02:24.142Z","1.1.2":"2025-10-17T11:31:34.924Z","1.1.3":"2025-10-23T03:00:36.147Z","1.1.4":"2025-10-24T09:57:53.131Z","1.1.5":"2025-10-25T11:46:43.064Z","1.1.6":"2025-11-08T07:46:51.613Z","1.1.7":"2025-11-13T13:33:02.108Z","1.1.8":"2025-11-15T13:11:11.681Z","1.1.9":"2025-11-15T13:22:07.341Z","1.1.10":"2025-11-15T13:33:08.676Z","1.1.11":"2025-12-01T11:47:55.889Z","1.1.12":"2026-01-13T04:47:24.092Z"},"author":{"name":"AutoLab Team"},"license":"MIT","keywords":["react","oauth2","pkce","authentication","sdk"],"description":"AutoLab OAuth SDK - React 组件库（授权码 + PKCE）","maintainers":[{"name":"autolabz","email":"mzhh@mzhh.xyz"}],"readme":"@autolabz/oauth-sdk\n\nAutoLab OAuth SDK（基于 PKCE 的前端登录与回调处理）。与 `@autolabz/auth-sdk` 风格一致，适用于需要通过 OAuth 授权码（PKCE）登录并获取 Access/Refresh Token 的 SPA 应用。\n\n重要说明：本 SDK 为 OAuth-only 实现，不包含任何“门户（portal）模式”的逻辑。所有登录均通过标准 OAuth 2.0 授权码（含 PKCE）流程完成。\n\n### 📦 安装\n\n```bash\nnpm install @autolabz/oauth-sdk\n```\n\n### 🚀 快速开始\n\n#### 1) 在根组件挂载 Provider\n\n```tsx\nimport { OAuthProvider } from '@autolabz/oauth-sdk';\n\nfunction App() {\n  const authServiceUrl = import.meta.env.VITE_AUTH_API_BASE_URL; // 例: http://114.132.91.247/api\n  const clientId = import.meta.env.VITE_OAUTH_CLIENT_ID;\n\n  return (\n    <OAuthProvider authServiceUrl={authServiceUrl} clientId={clientId}>\n      <YourApp />\n    </OAuthProvider>\n  );\n}\n```\n\n必须通过 `clientId` 提供固定的客户端 ID（不再支持动态解析、URL 参数或 sessionStorage 回退）。\n\n#### 2) 发起登录（授权码 + PKCE）\n\n```tsx\nimport { useOAuth } from '@autolabz/oauth-sdk';\n\nfunction LoginButton() {\n  const { startLogin } = useOAuth();\n\n  const handleLogin = async () => {\n    await startLogin({\n      redirectUri: import.meta.env.VITE_OAUTH_REDIRECT_URI,\n      scope: 'openid profile email',\n      // state: 可选，不传则由 SDK 自动生成\n      usePkce: true,\n      additionalParams: { prompt: 'consent', login_hint: 'user@example.com' },\n    });\n  };\n\n  return <button onClick={handleLogin}>登录</button>;\n}\n```\n\n#### 3) 处理回调并建立会话\n\n```tsx\nimport { useEffect } from 'react';\nimport { useOAuth } from '@autolabz/oauth-sdk';\n\nfunction CallbackPage() {\n  const { handleRedirect, isAuthenticated, user } = useOAuth();\n\n  useEffect(() => {\n    handleRedirect({ fetchUserinfo: true, redirectUri: import.meta.env.VITE_OAUTH_REDIRECT_URI })\n      .catch((e) => console.error('OAuth 回调失败:', e));\n  }, [handleRedirect]);\n\n  if (!isAuthenticated) return <div>正在登录...</div>;\n  return <div>欢迎回来，{user?.nickname || user?.email}</div>;\n}\n```\n\n成功后，SDK 会将 `access_token`/`refresh_token` 持久化到 `localStorage`，并通过 `OAuthProvider` 提供全局状态；同时暴露 `apiClient`，自动注入 `Authorization` 头并在 401 时刷新重试。登出时会尝试撤销当前 Access/Refresh Token。\n\n### 🔄 实现重定向（returnTo）\n\nSDK 支持在 OAuth 登录流程中保存当前页面 URL，并在登录成功后自动重定向回原页面。\n\n#### 自动生成 returnTo\n\n当使用 `AuthAvatar` 或 `OAuthLoginButton` 组件时，如果不提供 `state` 参数，SDK 会自动生成包含当前页面 URL 的 state：\n\n```tsx\nimport { AuthAvatar } from '@autolabz/oauth-sdk';\n\n// 自动使用当前页面 URL 作为 returnTo\n<AuthAvatar\n  redirectUri={import.meta.env.VITE_OAUTH_REDIRECT_URI}\n  scope=\"openid profile email\"\n/>\n```\n\n#### 自定义 returnTo\n\n可以通过 `returnTo` prop 指定登录成功后要重定向到的 URL：\n\n```tsx\n<AuthAvatar\n  redirectUri={import.meta.env.VITE_OAUTH_REDIRECT_URI}\n  scope=\"openid profile email\"\n  returnTo=\"/dashboard\"  // 自定义重定向目标\n/>\n```\n\n#### 在回调页面中提取 returnTo\n\n在回调页面中，使用 `getReturnToFromState` 工具函数从 state 中提取 returnTo URL：\n\n```tsx\nimport { useOAuth, getReturnToFromState } from '@autolabz/oauth-sdk';\nimport { useEffect } from 'react';\n\nfunction CallbackPage() {\n  const { handleRedirect, isAuthenticated } = useOAuth();\n\n  useEffect(() => {\n    handleRedirect({ \n      fetchUserinfo: true, \n      redirectUri: import.meta.env.VITE_OAUTH_REDIRECT_URI \n    })\n      .then((result) => {\n        // 从 state 中提取 returnTo URL\n        const returnTo = getReturnToFromState(result.state) || '/';\n        // 重定向到原页面\n        window.location.replace(returnTo);\n      })\n      .catch((e) => console.error('OAuth 回调失败:', e));\n  }, [handleRedirect]);\n\n  if (!isAuthenticated) return <div>正在登录...</div>;\n  return <div>正在跳转...</div>;\n}\n```\n\n#### 手动创建包含 returnTo 的 state\n\n如果需要手动创建 state，可以使用 `createStateWithReturnTo` 工具函数：\n\n```tsx\nimport { useOAuth, createStateWithReturnTo } from '@autolabz/oauth-sdk';\n\nfunction LoginButton() {\n  const { startLogin } = useOAuth();\n\n  const handleLogin = async () => {\n    const returnTo = window.location.pathname + window.location.search;\n    const state = createStateWithReturnTo(returnTo);\n    \n    await startLogin({\n      redirectUri: import.meta.env.VITE_OAUTH_REDIRECT_URI,\n      scope: 'openid profile email',\n      state: state,\n      usePkce: true,\n    });\n  };\n\n  return <button onClick={handleLogin}>登录</button>;\n}\n```\n\n#### State 工具函数\n\nSDK 提供了以下工具函数用于处理 state：\n\n```ts\nimport { \n  createStateWithReturnTo,  // 创建包含 returnTo 的编码 state\n  decodeState,               // 解码 state 字符串\n  getReturnToFromState,      // 从 state 中提取 returnTo URL\n  StatePayload               // State 载荷类型定义\n} from '@autolabz/oauth-sdk';\n```\n\n**注意事项：**\n- 如果提供了自定义 `state`，SDK 不会自动添加 returnTo，需要手动使用 `createStateWithReturnTo` 创建\n- `returnTo` URL 应该是相对于应用根路径的路径（如 `/dashboard`），而不是完整的 URL\n- 如果 state 中不包含 returnTo 或解析失败，`getReturnToFromState` 会返回 `null`\n\n### 🔍 客户端 ID\n\n`client_id` 需要由应用在挂载 `<OAuthProvider />` 时以固定值显式传入：不支持动态 provider、URL 参数或任何存储中的自动解析。\n\n### 🧭 API 概览\n\n```ts\nexport { OAuthProvider, useOAuth } from '@autolabz/oauth-sdk';\nexport { OAuthLoginButton } from '@autolabz/oauth-sdk';\nexport { AuthAvatar } from '@autolabz/oauth-sdk';\nexport { OAuthAPIClient } from '@autolabz/oauth-sdk';\nexport { startAuthorization, handleRedirectCallback, getAuthorizeUrl, buildAuthorizeUrl } from '@autolabz/oauth-sdk';\nexport { createStateWithReturnTo, decodeState, getReturnToFromState, StatePayload } from '@autolabz/oauth-sdk';\n```\n\n#### OAuthProvider Props\n\n```ts\ninterface OAuthProviderProps {\n  children: React.ReactNode;\n  authServiceUrl: string;                 // 认证服务基础地址，如 'http://114.132.91.247/api'\n  clientId: string;                       // 必填：固定 client_id\n}\n```\n\n#### useOAuth 返回值（完整）\n\n```ts\ninterface AuthContextValue {\n  // 状态\n  isAuthenticated: boolean;\n  user: User | null;                           // User = { id: string; email: string; nickname: string | null; avatarUrl: string | null }\n  accessToken: string | null;\n  isInitialized: boolean;\n\n  // 会话与令牌\n  login(user: User, accessToken: string, refreshToken: string): void;\n  logout(): Promise<void>;\n  logoutSession(): Promise<void>;          // 仅销毁服务端会话并本地清理\n  refreshAuth(): void;                     // 从 localStorage 重新加载\n  getAccessToken(): string | null;\n  updateAccessToken(newAccessToken: string): void;\n  getClientId(): string | null;\n\n  // HTTP 客户端（Axios）\n  apiClient: OAuthAPIClient;\n\n  // 登录/回调\n  startLogin(opts: {\n    redirectUri: string;\n    scope?: string;\n    state?: string;\n    usePkce?: boolean;\n    additionalParams?: Record<string, string | number | boolean>;\n  }): Promise<void>;\n\n  handleRedirect(opts?: {\n    redirectUri?: string;                  // 默认：当前地址（不含 query）\n    fetchUserinfo?: boolean;               // 默认：true\n  }): Promise<{ accessToken: string; refreshToken?: string; userinfo?: any; state: string; }>;\n}\n```\n\n#### 组件：OAuthLoginButton\n\n```ts\ninterface OAuthLoginButtonProps {\n  redirectUri: string;\n  scope?: string;\n  usePkce?: boolean; // 默认 true\n  additionalParams?: Record<string, string | number | boolean>;\n  label?: string;\n  className?: string;\n  onError?: (error: Error) => void;\n  returnTo?: string; // 登录成功后重定向到的 URL，不传则使用当前页面 URL\n  state?: string | (() => string); // 可选：自定义/延迟生成 state（如果提供，returnTo 将被忽略）\n}\n```\n\n示例：\n\n```tsx\n<OAuthLoginButton\n  label=\"登录（OAuth/PKCE）\"\n  redirectUri={import.meta.env.VITE_OAUTH_REDIRECT_URI}\n  scope=\"openid profile email\"\n  additionalParams={{ prompt: 'consent' }}\n  className=\"btn-primary\"\n/>\n```\n\n#### 组件：AuthAvatar（OAuth-only）\n\n未登录时点击触发 OAuth 登录；已登录时显示头像菜单（可选\"个人中心\"入口）。\n\n```ts\ninterface AuthAvatarProps {\n  redirectUri: string;\n  scope?: string;\n  usePkce?: boolean; // 默认 true\n  additionalParams?: Record<string, string | number | boolean>;\n  profileUrl?: string; // 个人中心地址，默认 `${window.location.origin}/auth/profile`\n  returnTo?: string; // 登录成功后重定向到的 URL，不传则使用当前页面 URL\n  state?: string | (() => string); // 可选：自定义/延迟生成 state（如果提供，returnTo 将被忽略）\n}\n```\n\n```tsx\n<AuthAvatar\n  redirectUri={import.meta.env.VITE_OAUTH_REDIRECT_URI}\n  scope=\"openid profile email\"\n  additionalParams={{ prompt: 'consent' }}\n  profileUrl={import.meta.env.VITE_OAUTH_PROFILE_URL}\n/>\n```\n\n#### 客户端：OAuthAPIClient（Axios）\n\n内置拦截器：\n- 请求阶段自动注入 `Authorization: Bearer <access_token>`。\n- 响应阶段遇到 401 时，使用 `refresh_token` 刷新并重试（跳过 `/oauth/token`、`/oauth/revoke`、`/oauth/logout-session`）。\n\n```ts\nimport { useOAuth } from '@autolabz/oauth-sdk';\n\nconst { apiClient } = useOAuth();\nconst http = apiClient.getClient(); // AxiosInstance\n\nconst res = await http.get('/data/projects');\n```\n\n### 🔄 端到端流程（授权码 + PKCE）\n\n1) 触发登录：调用 `startLogin` 或使用 `OAuthLoginButton`/`AuthAvatar`。SDK 生成 `state`（包含 returnTo URL 和随机 nonce）与 `code_verifier`，派生 `code_challenge(S256)`，并以 `state` 为键保存到 `sessionStorage`。\n2) 跳转授权端点：浏览器前往 `GET /api/oauth/authorize?...`（state 参数包含编码后的 returnTo 信息）。\n3) 用户同意后重定向回 `redirect_uri?code=...&state=...`。\n4) 回调页 `handleRedirect`：取回 `verifier` 与 `state`，向 `/api/oauth/token` 交换令牌，可选拉取 `/api/oauth/userinfo`。\n5) 持久化会话：保存令牌，填充 `user`，后续请求自动携带 `Authorization` 并在 401 时刷新。\n6) 提取 returnTo：使用 `getReturnToFromState(result.state)` 从 state 中提取原始页面 URL，并重定向回该页面。\n\n注：本 SDK 不包含或跳转任何\"门户登录页\"。请在管理端为 OAuthClient 配置 `redirectUris` 与 `allowed_scopes`，并从前端传入 `redirectUri`/`scope`。\n\n### 🧱 低层方法（可选）\n\n```ts\nimport { startAuthorization, getAuthorizeUrl, handleRedirectCallback, buildAuthorizeUrl } from '@autolabz/oauth-sdk';\n\nawait startAuthorization({\n  authServiceUrl: import.meta.env.VITE_AUTH_API_BASE_URL,\n  clientId: 'example-client',\n  redirectUri: import.meta.env.VITE_OAUTH_REDIRECT_URI,\n  scope: 'openid profile email',\n  usePkce: true,\n  additionalParams: { prompt: 'consent', login_hint: 'user@example.com' },\n});\n```\n\n### 🔐 PKCE 说明\n\n- 每次授权生成 `code_verifier` 与 `code_challenge(S256)`，并以 `state` 作为关联键存入 `sessionStorage`。\n- 回调页通过 `state` 取回对应 `verifier`，完成令牌交换后清理。\n- 若回调缺失或 `state` 不匹配，将抛出错误（常见于用户刷新/更换标签页）。\n\n### 🌐 环境与网关要求\n\n- 通过统一入口（如 Nginx）将前端与认证服务置于同源或同一主域路径下：\n  - Web: `https://yourdomain.com/app/`\n  - Auth API: `https://yourdomain.com/api/`\n- 认证服务环境变量：\n  - `CORS_ORIGINS`：允许的来源（根域），需包含前端访问源。\n  - `FRONTEND_URL`：后台拼接链接用基准（与门户无关）。\n\n### 🔁 与数据 SDK 集成\n\n```ts\nimport { createAuthBridgeFromContext } from '@autolabz/oauth-sdk';\nimport { createDataClient } from '@autolabz/data-sdk';\n\nconst bridge = createAuthBridgeFromContext(useOAuth());\nconst data = createDataClient({ baseURL: import.meta.env.VITE_DATA_BASE_URL, auth: bridge });\nawait data.health();\n```\n\n### 🌐 调用自定义后端\n\n当前端需要调用自己的 Next.js/Express 后端时，可使用 `createAuthenticatedClient` 创建已认证的 HTTP 客户端：\n\n```tsx\nimport { useOAuth, createAuthenticatedClient } from '@autolabz/oauth-sdk';\nimport { useMemo } from 'react';\n\nfunction MyComponent() {\n  const auth = useOAuth();\n\n  // 创建指向自己后端的客户端\n  const backendClient = useMemo(\n    () => createAuthenticatedClient({\n      baseURL: 'http://my-backend.com/api',\n      auth: {\n        getAccessToken: auth.getAccessToken,\n        refreshAccessToken: () => auth.apiClient.refreshAccessToken(),\n        onRefreshFailed: auth.logout,\n      },\n    }),\n    [auth]\n  );\n\n  const fetchData = async () => {\n    // 自动携带 Bearer token，401 时自动刷新并重试\n    const res = await backendClient.get('/user/profile');\n    return res.data;\n  };\n}\n```\n\n**客户端特性：**\n\n- ✅ 自动添加 `Authorization: Bearer <token>` 头\n- ✅ 401 时自动刷新令牌并重试请求\n- ✅ 刷新失败时调用 `onRefreshFailed` 回调\n- ✅ 支持自定义额外请求头\n\n**后端验证令牌：**\n\n后端使用 `@autolabz/service-auth-nextjs` 验证前端传来的令牌：\n\n```typescript\nimport { verifyRequest } from '@autolabz/service-auth-nextjs';\n\nexport async function GET(request: Request) {\n  const result = await verifyRequest(request, authConfig);\n  if (!result.success) {\n    return Response.json({ error: 'Unauthorized' }, { status: 401 });\n  }\n  const { userId } = result.auth;\n  // 使用 userId 进行业务逻辑\n  return Response.json({ userId, data: '...' });\n}\n```\n\n详见：\n- [LLM_APP_BEST_PRACTICES.md](../docs/LLM_APP_BEST_PRACTICES.md#2a-前端调用自定义后端createauthenticatedclient) - 前端集成指南\n- [SERVICE_AUTH_NEXTJS_GUIDE.md](../docs/SERVICE_AUTH_NEXTJS_GUIDE.md#frontend-integration) - Next.js 后端集成\n\n### 🧪 开发与构建\n\n```bash\nnpm run dev\nnpm run build\n```\n\n\n### 📄 License\n\nMIT\n","readmeFilename":"README.md"}