[{"data":1,"prerenderedAt":2805},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fauth-h3client":64,"navigation":217,"navLinks_footer":829,"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession_page":842,"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession_surround":1971,"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession":1974},{"id":4,"extension":5,"links":6,"meta":61,"stem":62,"__hash__":63},"navigationMenu\u002Fnavigation.json","json",[7,52,57],{"nested":8,"label":9,"icon":10,"to":11,"children":12},true,"Docs","i-lucide-book-open","\u002Fdocs\u002Fgetting-started",[13,19,26,32,39,45],{"label":14,"icon":15,"to":11,"description":16,"github":17,"badge":18},"Getting Started","i-lucide-rocket","An introduction to help you understand the core components.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fdocshub","Start Here",{"label":20,"icon":21,"to":22,"description":23,"github":24,"badge":25},"Auth H3 Client","i-lucide-key-round","\u002Fdocs\u002Fauth-h3client","Seamlessly enforce OAuth 2.0 authentication and session management integrated directly as the client of the IAM module.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fauth-h3client","Core",{"label":27,"icon":28,"to":29,"description":30,"github":31,"badge":25},"IAM","i-lucide-shield-check","\u002Fdocs\u002Fiam","Identity and Access Management featuring granular roles, permissions, and security policies.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fauth",{"label":33,"icon":34,"to":35,"description":36,"github":37,"badge":38},"Bot Detection","i-lucide-cpu","\u002Fdocs\u002Fbot-detection","Advanced behavioral analysis and request fingerprinting to stop malicious automated traffic.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fbot-detector","Security",{"label":40,"icon":41,"to":42,"description":43,"github":44,"badge":38},"Shield Base","i-lucide-database-zap","\u002Fdocs\u002Fshield-base","CLI and programmatic toolkit for compiling offline-ready IP intelligence databases from BGP, GeoIP, Tor, FireHOL, and other public threat feeds.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fshield-base-cli",{"label":46,"icon":47,"to":48,"description":49,"github":50,"badge":51},"Utils","i-lucide-wrench","\u002Fdocs\u002Futils","A standard library of highly optimized helpers for formatting, validation, and core logic.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Futils","Library",{"nested":53,"label":54,"icon":55,"to":56},false,"Blog","i-lucide-pen-line","\u002Fblog",{"nested":53,"label":58,"icon":59,"to":60},"Website","lucide:app-window-mac","https:\u002F\u002Friavzon.com",{},"navigation","gkaQ0xRGxSLrLyM3kttLe0oBwkrR1EBjlepF8LSbwF8",[65],{"title":9,"path":66,"stem":67,"children":68,"page":53},"\u002Fdocs","docs",[69],{"title":20,"path":22,"stem":70,"children":71},"docs\u002Fauth-h3client\u002Findex",[72,73,82,119,145,167,170,191,195],{"title":20,"path":22,"stem":70},{"title":14,"path":74,"stem":75,"children":76},"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started","docs\u002Fauth-h3client\u002F00.getting-started\u002Findex",[77,78],{"title":14,"path":74,"stem":75},{"title":79,"path":80,"stem":81},"Nuxt Module","\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt","docs\u002Fauth-h3client\u002F00.getting-started\u002F00.nuxt",{"title":83,"path":84,"stem":85,"children":86},"Essentials","\u002Fdocs\u002Fauth-h3client\u002Fessentials","docs\u002Fauth-h3client\u002F01.essentials\u002Findex",[87,88,92,96,100,104,108,111,115],{"title":83,"path":84,"stem":85},{"title":89,"path":90,"stem":91},"Session Management","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession","docs\u002Fauth-h3client\u002F01.essentials\u002F00.session",{"title":93,"path":94,"stem":95},"Route Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection","docs\u002Fauth-h3client\u002F01.essentials\u002F01.route-protection",{"title":97,"path":98,"stem":99},"CSRF Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf","docs\u002Fauth-h3client\u002F01.essentials\u002F02.csrf",{"title":101,"path":102,"stem":103},"Auth Flows","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fauth-flows","docs\u002Fauth-h3client\u002F01.essentials\u002F03.auth-flows",{"title":105,"path":106,"stem":107},"OAuth and OIDC","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Foauth","docs\u002Fauth-h3client\u002F01.essentials\u002F04.oauth",{"title":33,"path":109,"stem":110},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fbot-detection","docs\u002Fauth-h3client\u002F01.essentials\u002F05.bot-detection",{"title":112,"path":113,"stem":114},"Cookies","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcookies","docs\u002Fauth-h3client\u002F01.essentials\u002F06.cookies",{"title":116,"path":117,"stem":118},"Logging","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging","docs\u002Fauth-h3client\u002F01.essentials\u002F07.logging",{"title":120,"path":121,"stem":122,"children":123},"MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa","docs\u002Fauth-h3client\u002F02.mfa\u002Findex",[124,125,129,133,137,141],{"title":120,"path":121,"stem":122},{"title":126,"path":127,"stem":128},"Built-in MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fbuilt-in-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F01.built-in-flow",{"title":130,"path":131,"stem":132},"Password Reset","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset","docs\u002Fauth-h3client\u002F02.mfa\u002F02.password-reset",{"title":134,"path":135,"stem":136},"Email Change","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Femail-change","docs\u002Fauth-h3client\u002F02.mfa\u002F03.email-change",{"title":138,"path":139,"stem":140},"Custom MFA Flow","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fcustom-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F04.custom-flow",{"title":142,"path":143,"stem":144},"Client-Side MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side","docs\u002Fauth-h3client\u002F02.mfa\u002F05.client-side",{"title":146,"path":147,"stem":148,"children":149},"Client-side","\u002Fdocs\u002Fauth-h3client\u002Fclient","docs\u002Fauth-h3client\u002F03.client\u002Findex",[150,151,155,159,163],{"title":146,"path":147,"stem":148},{"title":152,"path":153,"stem":154},"useAuthData","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-auth-data","docs\u002Fauth-h3client\u002F03.client\u002F00.use-auth-data",{"title":156,"path":157,"stem":158},"useMagicLink","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-magic-link","docs\u002Fauth-h3client\u002F03.client\u002F01.use-magic-link",{"title":160,"path":161,"stem":162},"executeRequest","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fexecute-request","docs\u002Fauth-h3client\u002F03.client\u002F02.execute-request",{"title":164,"path":165,"stem":166},"getCsrfToken","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fget-csrf-token","docs\u002Fauth-h3client\u002F03.client\u002F03.get-csrf-token",{"title":38,"path":168,"stem":169},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity","docs\u002Fauth-h3client\u002F04.security",{"title":171,"path":172,"stem":173,"children":174,"page":53},"Guides","\u002Fdocs\u002Fauth-h3client\u002Fguides","docs\u002Fauth-h3client\u002F05.guides",[175,179,183,187],{"title":176,"path":177,"stem":178},"H3 and Nitro Setup","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro","docs\u002Fauth-h3client\u002F05.guides\u002F00.h3-nitro",{"title":180,"path":181,"stem":182},"HMAC Inter-service Auth","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac","docs\u002Fauth-h3client\u002F05.guides\u002Fhmac",{"title":184,"path":185,"stem":186},"Image Upload","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fimage-upload","docs\u002Fauth-h3client\u002F05.guides\u002Fimage-upload",{"title":188,"path":189,"stem":190},"mTLS Configuration","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls","docs\u002Fauth-h3client\u002F05.guides\u002Fmtls",{"title":192,"path":193,"stem":194},"Configuration","\u002Fdocs\u002Fauth-h3client\u002Fconfiguration","docs\u002Fauth-h3client\u002F06.configuration",{"title":196,"path":197,"stem":198,"children":199},"API Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi","docs\u002Fauth-h3client\u002F07.api\u002Findex",[200,201,205,209,213],{"title":196,"path":197,"stem":198},{"title":202,"path":203,"stem":204},"Routes Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers","docs\u002Fauth-h3client\u002F07.api\u002F00.controllers",{"title":206,"path":207,"stem":208},"Middleware Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware","docs\u002Fauth-h3client\u002F07.api\u002F01.middleware",{"title":210,"path":211,"stem":212},"Client-side Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcomposables","docs\u002Fauth-h3client\u002F07.api\u002F02.composables",{"title":214,"path":215,"stem":216},"Utilities","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Futilities","docs\u002Fauth-h3client\u002F07.api\u002F03.utilities",[218],{"title":9,"path":66,"stem":67,"children":219,"page":53},[220,268,386,391,569,636],{"title":20,"path":22,"stem":70,"children":221},[222,223,227,238,246,253,254,260,261],{"title":20,"path":22,"stem":70},{"title":14,"path":74,"stem":75,"children":224},[225,226],{"title":14,"path":74,"stem":75},{"title":79,"path":80,"stem":81},{"title":83,"path":84,"stem":85,"children":228},[229,230,231,232,233,234,235,236,237],{"title":83,"path":84,"stem":85},{"title":89,"path":90,"stem":91},{"title":93,"path":94,"stem":95},{"title":97,"path":98,"stem":99},{"title":101,"path":102,"stem":103},{"title":105,"path":106,"stem":107},{"title":33,"path":109,"stem":110},{"title":112,"path":113,"stem":114},{"title":116,"path":117,"stem":118},{"title":120,"path":121,"stem":122,"children":239},[240,241,242,243,244,245],{"title":120,"path":121,"stem":122},{"title":126,"path":127,"stem":128},{"title":130,"path":131,"stem":132},{"title":134,"path":135,"stem":136},{"title":138,"path":139,"stem":140},{"title":142,"path":143,"stem":144},{"title":146,"path":147,"stem":148,"children":247},[248,249,250,251,252],{"title":146,"path":147,"stem":148},{"title":152,"path":153,"stem":154},{"title":156,"path":157,"stem":158},{"title":160,"path":161,"stem":162},{"title":164,"path":165,"stem":166},{"title":38,"path":168,"stem":169},{"title":171,"path":172,"stem":173,"children":255,"page":53},[256,257,258,259],{"title":176,"path":177,"stem":178},{"title":180,"path":181,"stem":182},{"title":184,"path":185,"stem":186},{"title":188,"path":189,"stem":190},{"title":192,"path":193,"stem":194},{"title":196,"path":197,"stem":198,"children":262},[263,264,265,266,267],{"title":196,"path":197,"stem":198},{"title":202,"path":203,"stem":204},{"title":206,"path":207,"stem":208},{"title":210,"path":211,"stem":212},{"title":214,"path":215,"stem":216},{"title":269,"path":35,"stem":270,"children":271},"Bot Detector","docs\u002Fbot-detection\u002Findex",[272,273,276,280,284,303,377,380,383],{"title":269,"path":35,"stem":270},{"title":14,"path":274,"stem":275},"\u002Fdocs\u002Fbot-detection\u002Fgetting-started","docs\u002Fbot-detection\u002F00.getting-started",{"title":277,"path":278,"stem":279},"CLI","\u002Fdocs\u002Fbot-detection\u002Fcli","docs\u002Fbot-detection\u002F01.cli",{"title":281,"path":282,"stem":283},"Data Sources","\u002Fdocs\u002Fbot-detection\u002Fdata-sources","docs\u002Fbot-detection\u002F02.data-sources",{"title":171,"path":285,"stem":286,"children":287,"page":53},"\u002Fdocs\u002Fbot-detection\u002Fguides","docs\u002Fbot-detection\u002F03.guides",[288,292,296,299],{"title":289,"path":290,"stem":291},"Custom Checkers","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fcustom","docs\u002Fbot-detection\u002F03.guides\u002FCUSTOM",{"title":293,"path":294,"stem":295},"Scheduling Database Generation","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fgenerate","docs\u002Fbot-detection\u002F03.guides\u002FGENERATE",{"title":116,"path":297,"stem":298},"\u002Fdocs\u002Fbot-detection\u002Fguides\u002Flogging","docs\u002Fbot-detection\u002F03.guides\u002FLOGGING",{"title":300,"path":301,"stem":302},"Score Modes and Reputation Healing","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore","docs\u002Fbot-detection\u002F03.guides\u002FSCORE",{"title":304,"path":305,"stem":306,"children":307},"Checkers","\u002Fdocs\u002Fbot-detection\u002Fcheckers","docs\u002Fbot-detection\u002F04.checkers\u002Findex",[308,309,313,317,321,325,329,333,337,341,345,349,353,357,361,365,369,373],{"title":304,"path":305,"stem":306},{"title":310,"path":311,"stem":312},"IP Validation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fip-validation","docs\u002Fbot-detection\u002F04.checkers\u002F01.ip-validation",{"title":314,"path":315,"stem":316},"Good \u002F Bad Bot Verification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgood-bots","docs\u002Fbot-detection\u002F04.checkers\u002F02.good-bots",{"title":318,"path":319,"stem":320},"Browser & Device Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device","docs\u002Fbot-detection\u002F04.checkers\u002F03.browser-device",{"title":322,"path":323,"stem":324},"Locale Map","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Flocale-map","docs\u002Fbot-detection\u002F04.checkers\u002F04.locale-map",{"title":326,"path":327,"stem":328},"Known Threats","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-threats","docs\u002Fbot-detection\u002F04.checkers\u002F05.known-threats",{"title":330,"path":331,"stem":332},"ASN Classification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fasn-classification","docs\u002Fbot-detection\u002F04.checkers\u002F06.asn-classification",{"title":334,"path":335,"stem":336},"Tor Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftor-analysis","docs\u002Fbot-detection\u002F04.checkers\u002F07.tor-analysis",{"title":338,"path":339,"stem":340},"Timezone Consistency","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftimezone-consistency","docs\u002Fbot-detection\u002F04.checkers\u002F08.timezone-consistency",{"title":342,"path":343,"stem":344},"Honeypot","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fhoneypot","docs\u002Fbot-detection\u002F04.checkers\u002F09.honeypot",{"title":346,"path":347,"stem":348},"Known Bad IPs","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ips","docs\u002Fbot-detection\u002F04.checkers\u002F10.known-bad-ips",{"title":350,"path":351,"stem":352},"Behavior Rate","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbehavior-rate","docs\u002Fbot-detection\u002F04.checkers\u002F11.behavior-rate",{"title":354,"path":355,"stem":356},"Proxy \u002F ISP \u002F Cookie","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies","docs\u002Fbot-detection\u002F04.checkers\u002F12.proxy-isp-cookies",{"title":358,"path":359,"stem":360},"Session Coherence","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fsession-coherence","docs\u002Fbot-detection\u002F04.checkers\u002F13.session-coherence",{"title":362,"path":363,"stem":364},"Velocity Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fvelocity-fingerprint","docs\u002Fbot-detection\u002F04.checkers\u002F14.velocity-fingerprint",{"title":366,"path":367,"stem":368},"UA & Header Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header","docs\u002Fbot-detection\u002F04.checkers\u002F15.ua-header",{"title":370,"path":371,"stem":372},"Geolocation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgeolocation","docs\u002Fbot-detection\u002F04.checkers\u002F16.geolocation",{"title":374,"path":375,"stem":376},"Known Bad User-Agents","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ua","docs\u002Fbot-detection\u002F04.checkers\u002F17.known-bad-ua",{"title":38,"path":378,"stem":379},"\u002Fdocs\u002Fbot-detection\u002Fsecurity","docs\u002Fbot-detection\u002F04.security",{"title":196,"path":381,"stem":382},"\u002Fdocs\u002Fbot-detection\u002Fapi","docs\u002Fbot-detection\u002F05.api",{"title":192,"path":384,"stem":385},"\u002Fdocs\u002Fbot-detection\u002Fconfiguration","docs\u002Fbot-detection\u002F06.configuration",{"title":387,"path":11,"stem":388,"children":389},"Introduction","docs\u002Fgetting-started\u002Findex",[390],{"title":387,"path":11,"stem":388},{"title":27,"path":29,"stem":392,"children":393},"docs\u002Fiam\u002Findex",[394,395,398,533,536,552,555],{"title":27,"path":29,"stem":392},{"title":14,"path":396,"stem":397},"\u002Fdocs\u002Fiam\u002Fgetting-started","docs\u002Fiam\u002F00.getting-started",{"title":83,"path":399,"stem":400,"children":401},"\u002Fdocs\u002Fiam\u002Fessentials","docs\u002Fiam\u002F01.essentials\u002Findex",[402,403,407,411,415,419,423,427,431,435,439,443,446,450,454,458,462,465,469,473,476,480,483],{"title":83,"path":399,"stem":400},{"title":404,"path":405,"stem":406},"Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens","docs\u002Fiam\u002F01.essentials\u002F00.tokens",{"title":408,"path":409,"stem":410},"Access Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens","docs\u002Fiam\u002F01.essentials\u002F01.access-tokens",{"title":412,"path":413,"stem":414},"Refresh Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens","docs\u002Fiam\u002F01.essentials\u002F02.refresh-tokens",{"title":416,"path":417,"stem":418},"Anomaly Detection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies","docs\u002Fiam\u002F01.essentials\u002F03.anomalies",{"title":420,"path":421,"stem":422},"Signup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fsignup","docs\u002Fiam\u002F01.essentials\u002F04.signup",{"title":424,"path":425,"stem":426},"Login","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogin","docs\u002Fiam\u002F01.essentials\u002F05.login",{"title":428,"path":429,"stem":430},"Logout","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogout","docs\u002Fiam\u002F01.essentials\u002F06.logout",{"title":432,"path":433,"stem":434},"OAuth","\u002Fdocs\u002Fiam\u002Fessentials\u002Foauth","docs\u002Fiam\u002F01.essentials\u002F07.oauth",{"title":436,"path":437,"stem":438},"Magic Links","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmagic-links","docs\u002Fiam\u002F01.essentials\u002F08.magic-links",{"title":440,"path":441,"stem":442},"Emails","\u002Fdocs\u002Fiam\u002Fessentials\u002Femails","docs\u002Fiam\u002F01.essentials\u002F09.emails",{"title":120,"path":444,"stem":445},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa","docs\u002Fiam\u002F01.essentials\u002F10.mfa",{"title":447,"path":448,"stem":449},"Fingerprinting","\u002Fdocs\u002Fiam\u002Fessentials\u002Ffingerprinting","docs\u002Fiam\u002F01.essentials\u002F11.fingerprinting",{"title":451,"path":452,"stem":453},"Backend for Frontend","\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff","docs\u002Fiam\u002F01.essentials\u002F12.bff",{"title":455,"path":456,"stem":457},"HMAC Authentication","\u002Fdocs\u002Fiam\u002Fessentials\u002Fhmac","docs\u002Fiam\u002F01.essentials\u002F13.hmac",{"title":459,"path":460,"stem":461},"XSS Protection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fxss","docs\u002Fiam\u002F01.essentials\u002F14.xss",{"title":116,"path":463,"stem":464},"\u002Fdocs\u002Fiam\u002Fessentials\u002Flogging","docs\u002Fiam\u002F01.essentials\u002F15.logging",{"title":466,"path":467,"stem":468},"Rate Limiting","\u002Fdocs\u002Fiam\u002Fessentials\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F16.rate-limiting",{"title":470,"path":471,"stem":472},"Database","\u002Fdocs\u002Fiam\u002Fessentials\u002Fdatabase","docs\u002Fiam\u002F01.essentials\u002F17.database",{"title":112,"path":474,"stem":475},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fcookies","docs\u002Fiam\u002F01.essentials\u002F18.cookies",{"title":477,"path":478,"stem":479},"Service Startup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fservice","docs\u002Fiam\u002F01.essentials\u002F19.service",{"title":130,"path":481,"stem":482},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset","docs\u002Fiam\u002F01.essentials\u002F20.password-reset",{"title":484,"path":485,"stem":486,"children":487},"API Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi","docs\u002Fiam\u002F01.essentials\u002F21.api\u002Findex",[488,489,493,497,527,530],{"title":484,"path":485,"stem":486},{"title":490,"path":491,"stem":492},"Creating Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F00.creation",{"title":494,"path":495,"stem":496},"Verifying Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F01.verification",{"title":498,"path":499,"stem":500,"children":501},"Manage Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002Findex",[502,503,507,511,515,519,523],{"title":498,"path":499,"stem":500},{"title":504,"path":505,"stem":506},"Privileges","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F00.privilege",{"title":508,"path":509,"stem":510},"Revocation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F01.revocation",{"title":512,"path":513,"stem":514},"Rotation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F02.rotation",{"title":516,"path":517,"stem":518},"IP Restriction","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F03.ip-updates",{"title":520,"path":521,"stem":522},"Metadata","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F04.metadata",{"title":524,"path":525,"stem":526},"Token Listing","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F05.list",{"title":466,"path":528,"stem":529},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F03.rate-limiting",{"title":38,"path":531,"stem":532},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fsecurity","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F04.security",{"title":38,"path":534,"stem":535},"\u002Fdocs\u002Fiam\u002Fsecurity","docs\u002Fiam\u002F02.security",{"title":171,"path":537,"stem":538,"children":539,"page":53},"\u002Fdocs\u002Fiam\u002Fguides","docs\u002Fiam\u002F03.guides",[540,544,548],{"title":541,"path":542,"stem":543},"Deployment","\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment","docs\u002Fiam\u002F03.guides\u002Fdeployment",{"title":545,"path":546,"stem":547},"Operation Scripts","\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts","docs\u002Fiam\u002F03.guides\u002Foperation-scripts",{"title":549,"path":550,"stem":551},"Role-Based Access Control","\u002Fdocs\u002Fiam\u002Fguides\u002Frbac","docs\u002Fiam\u002F03.guides\u002Frbac",{"title":192,"path":553,"stem":554},"\u002Fdocs\u002Fiam\u002Fconfiguration","docs\u002Fiam\u002F04.configuration",{"title":556,"path":557,"stem":558,"children":559,"page":53},"Api","\u002Fdocs\u002Fiam\u002Fapi","docs\u002Fiam\u002F05.API",[560,563,566],{"title":196,"path":561,"stem":562},"\u002Fdocs\u002Fiam\u002Fapi\u002Fapi","docs\u002Fiam\u002F05.API\u002F00.api",{"title":206,"path":564,"stem":565},"\u002Fdocs\u002Fiam\u002Fapi\u002Fmiddlewares","docs\u002Fiam\u002F05.API\u002F02.middlewares",{"title":202,"path":567,"stem":568},"\u002Fdocs\u002Fiam\u002Fapi\u002Froutes","docs\u002Fiam\u002F05.API\u002F03.routes",{"title":40,"path":42,"stem":570,"children":571},"docs\u002Fshield-base\u002Findex",[572,573,576,580,621,625,629,633],{"title":40,"path":42,"stem":570},{"title":14,"path":574,"stem":575},"\u002Fdocs\u002Fshield-base\u002Fgetting-started","docs\u002Fshield-base\u002F00.getting-started",{"title":577,"path":578,"stem":579},"CLI Reference","\u002Fdocs\u002Fshield-base\u002Fcli","docs\u002Fshield-base\u002F01.cli",{"title":281,"path":581,"stem":582,"children":583},"\u002Fdocs\u002Fshield-base\u002Fdata-sources","docs\u002Fshield-base\u002F02.data-sources\u002Findex",[584,585,589,593,597,601,605,609,613,617],{"title":281,"path":581,"stem":582},{"title":586,"path":587,"stem":588},"BGP \u002F ASN","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fbgp","docs\u002Fshield-base\u002F02.data-sources\u002Fbgp",{"title":590,"path":591,"stem":592},"City Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcity","docs\u002Fshield-base\u002F02.data-sources\u002Fcity",{"title":594,"path":595,"stem":596},"Country Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcountry","docs\u002Fshield-base\u002F02.data-sources\u002Fcountry",{"title":598,"path":599,"stem":600},"Verified Crawlers","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcrawlers","docs\u002Fshield-base\u002F02.data-sources\u002Fcrawlers",{"title":602,"path":603,"stem":604},"Disposable Emails","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Femail","docs\u002Fshield-base\u002F02.data-sources\u002Femail",{"title":606,"path":607,"stem":608},"FireHOL Threat Intelligence","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ffirehol","docs\u002Fshield-base\u002F02.data-sources\u002Ffirehol",{"title":610,"path":611,"stem":612},"Proxy Detection","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fproxy","docs\u002Fshield-base\u002F02.data-sources\u002Fproxy",{"title":614,"path":615,"stem":616},"Tor Nodes","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor","docs\u002Fshield-base\u002F02.data-sources\u002Ftor",{"title":618,"path":619,"stem":620},"Suspicious User-Agents","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fuseragent","docs\u002Fshield-base\u002F02.data-sources\u002Fuseragent",{"title":622,"path":623,"stem":624},"Programmatic Usage","\u002Fdocs\u002Fshield-base\u002Fusage","docs\u002Fshield-base\u002F03.usage",{"title":626,"path":627,"stem":628},"Custom Data Sources","\u002Fdocs\u002Fshield-base\u002Fcustom-data-sources","docs\u002Fshield-base\u002F04.custom-data-sources",{"title":630,"path":631,"stem":632},"TypeScript Types","\u002Fdocs\u002Fshield-base\u002Ftypes","docs\u002Fshield-base\u002F05.types",{"title":196,"path":634,"stem":635},"\u002Fdocs\u002Fshield-base\u002Fapi","docs\u002Fshield-base\u002F06.api",{"title":214,"path":48,"stem":637,"children":638},"docs\u002Futils\u002Findex",[639,640,657,690,787],{"title":214,"path":48,"stem":637},{"title":641,"path":642,"stem":643,"children":644,"page":53},"Eslint","\u002Fdocs\u002Futils\u002Feslint","docs\u002Futils\u002Feslint",[645,649,653],{"title":646,"path":647,"stem":648},"React Config","\u002Fdocs\u002Futils\u002Feslint\u002Freact","docs\u002Futils\u002Feslint\u002Freact",{"title":650,"path":651,"stem":652},"TypeScript Config","\u002Fdocs\u002Futils\u002Feslint\u002Ftypescript","docs\u002Futils\u002Feslint\u002Ftypescript",{"title":654,"path":655,"stem":656},"Vue Config","\u002Fdocs\u002Futils\u002Feslint\u002Fvue","docs\u002Futils\u002Feslint\u002Fvue",{"title":658,"path":659,"stem":660,"children":661,"page":53},"Server","\u002Fdocs\u002Futils\u002Fserver","docs\u002Futils\u002Fserver",[662,666,670,674,678,682,686],{"title":663,"path":664,"stem":665},"Encryption","\u002Fdocs\u002Futils\u002Fserver\u002Fencryption","docs\u002Futils\u002Fserver\u002Fencryption",{"title":667,"path":668,"stem":669},"Path Resolver","\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver","docs\u002Futils\u002Fserver\u002FpathResolver",{"title":671,"path":672,"stem":673},"File Replacements","\u002Fdocs\u002Futils\u002Fserver\u002Freplace","docs\u002Futils\u002Fserver\u002Freplace",{"title":675,"path":676,"stem":677},"run","\u002Fdocs\u002Futils\u002Fserver\u002Frun","docs\u002Futils\u002Fserver\u002Frun",{"title":679,"path":680,"stem":681},"scheduleTask","\u002Fdocs\u002Futils\u002Fserver\u002Fscheduletask","docs\u002Futils\u002Fserver\u002FscheduleTask",{"title":683,"path":684,"stem":685},"spawnRun","\u002Fdocs\u002Futils\u002Fserver\u002Fspawnrun","docs\u002Futils\u002Fserver\u002FspawnRun",{"title":687,"path":688,"stem":689},"uploadCsv","\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv","docs\u002Futils\u002Fserver\u002FuploadCsv",{"title":691,"path":692,"stem":693,"children":694,"page":53},"Shared","\u002Fdocs\u002Futils\u002Fshared","docs\u002Futils\u002Fshared",[695,699,703,707,711,715,719,723,727,731,735,739,743,747,751,755,759,763,767,771,775,779,783],{"title":696,"path":697,"stem":698},"BatchQueue","\u002Fdocs\u002Futils\u002Fshared\u002Fbatchqueue","docs\u002Futils\u002Fshared\u002FbatchQueue",{"title":700,"path":701,"stem":702},"capitalize","\u002Fdocs\u002Futils\u002Fshared\u002Fcapitalize","docs\u002Futils\u002Fshared\u002Fcapitalize",{"title":704,"path":705,"stem":706},"chunkProcess","\u002Fdocs\u002Futils\u002Fshared\u002Fchunkprocess","docs\u002Futils\u002Fshared\u002FchunkProcess",{"title":708,"path":709,"stem":710},"cleanObject","\u002Fdocs\u002Futils\u002Fshared\u002Fcleanobject","docs\u002Futils\u002Fshared\u002FcleanObject",{"title":712,"path":713,"stem":714},"createConfigManager","\u002Fdocs\u002Futils\u002Fshared\u002Fconfigurationdefiner","docs\u002Futils\u002Fshared\u002FconfigurationDefiner",{"title":716,"path":717,"stem":718},"debounce","\u002Fdocs\u002Futils\u002Fshared\u002Fdebounce","docs\u002Futils\u002Fshared\u002Fdebounce",{"title":720,"path":721,"stem":722},"ensureArray","\u002Fdocs\u002Futils\u002Fshared\u002Fensurearray","docs\u002Futils\u002Fshared\u002FensureArray",{"title":724,"path":725,"stem":726},"fetchWithRetry","\u002Fdocs\u002Futils\u002Fshared\u002Ffetchwithretry","docs\u002Futils\u002Fshared\u002FfetchWithRetry",{"title":728,"path":729,"stem":730},"filterEmptyValues","\u002Fdocs\u002Futils\u002Fshared\u002Ffilteremptyvalues","docs\u002Futils\u002Fshared\u002FfilterEmptyValues",{"title":732,"path":733,"stem":734},"findStringsInObject","\u002Fdocs\u002Futils\u002Fshared\u002Ffindobjectvalues","docs\u002Futils\u002Fshared\u002FfindObjectValues",{"title":736,"path":737,"stem":738},"fisherYatesShuffle","\u002Fdocs\u002Futils\u002Fshared\u002Ffisheryatesshuffle","docs\u002Futils\u002Fshared\u002FfisherYatesShuffle",{"title":740,"path":741,"stem":742},"getRandomImage","\u002Fdocs\u002Futils\u002Fshared\u002Fgetrandomimage","docs\u002Futils\u002Fshared\u002FgetRandomImage",{"title":744,"path":745,"stem":746},"isObjectHasValues","\u002Fdocs\u002Futils\u002Fshared\u002Fisobjecthasvalues","docs\u002Futils\u002Fshared\u002FisObjectHasValues",{"title":748,"path":749,"stem":750},"isAsyncOrPromise","\u002Fdocs\u002Futils\u002Fshared\u002Fispromise","docs\u002Futils\u002Fshared\u002FisPromise",{"title":752,"path":753,"stem":754},"MiniCache","\u002Fdocs\u002Futils\u002Fshared\u002Fminicache","docs\u002Futils\u002Fshared\u002FminiCache",{"title":756,"path":757,"stem":758},"parseCookies","\u002Fdocs\u002Futils\u002Fshared\u002Fparserawcookies","docs\u002Futils\u002Fshared\u002FparseRawCookies",{"title":760,"path":761,"stem":762},"safeAction","\u002Fdocs\u002Futils\u002Fshared\u002Fpromiselocker","docs\u002Futils\u002Fshared\u002FpromiseLocker",{"title":764,"path":765,"stem":766},"Random","\u002Fdocs\u002Futils\u002Fshared\u002Frandom","docs\u002Futils\u002Fshared\u002Frandom",{"title":768,"path":769,"stem":770},"range","\u002Fdocs\u002Futils\u002Fshared\u002Frange","docs\u002Futils\u002Fshared\u002Frange",{"title":772,"path":773,"stem":774},"rateLimiters","\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters","docs\u002Futils\u002Fshared\u002FrateLimiters",{"title":776,"path":777,"stem":778},"safeObjectMerge","\u002Fdocs\u002Futils\u002Fshared\u002Fsafemerge","docs\u002Futils\u002Fshared\u002FsafeMerge",{"title":780,"path":781,"stem":782},"textTruncation","\u002Fdocs\u002Futils\u002Fshared\u002Ftexttruncation","docs\u002Futils\u002Fshared\u002FtextTruncation",{"title":784,"path":785,"stem":786},"validateZodSchema","\u002Fdocs\u002Futils\u002Fshared\u002Fvalidatezodschema","docs\u002Futils\u002Fshared\u002FvalidateZodSchema",{"title":788,"path":789,"stem":790,"children":791},"Utility Types","\u002Fdocs\u002Futils\u002Ftypes","docs\u002Futils\u002Ftypes\u002Findex",[792,793,797,801,805,809,813,817,821,825],{"title":788,"path":789,"stem":790},{"title":794,"path":795,"stem":796},"Brand","\u002Fdocs\u002Futils\u002Ftypes\u002Fbrand","docs\u002Futils\u002Ftypes\u002FBrand",{"title":798,"path":799,"stem":800},"DeepPartial","\u002Fdocs\u002Futils\u002Ftypes\u002Fdeeppartial","docs\u002Futils\u002Ftypes\u002FDeepPartial",{"title":802,"path":803,"stem":804},"Merge","\u002Fdocs\u002Futils\u002Ftypes\u002Fmerge","docs\u002Futils\u002Ftypes\u002FMerge",{"title":806,"path":807,"stem":808},"NonNullable","\u002Fdocs\u002Futils\u002Ftypes\u002Fnonnullable","docs\u002Futils\u002Ftypes\u002FNonNullable",{"title":810,"path":811,"stem":812},"Prettify","\u002Fdocs\u002Futils\u002Ftypes\u002Fprettify","docs\u002Futils\u002Ftypes\u002FPrettify",{"title":814,"path":815,"stem":816},"PromiseType","\u002Fdocs\u002Futils\u002Ftypes\u002Fpromisetype","docs\u002Futils\u002Ftypes\u002FPromiseType",{"title":818,"path":819,"stem":820},"RequireKeys","\u002Fdocs\u002Futils\u002Ftypes\u002Frequirekeys","docs\u002Futils\u002Ftypes\u002FRequireKeys",{"title":822,"path":823,"stem":824},"StandardResponse","\u002Fdocs\u002Futils\u002Ftypes\u002Fstandardresponse","docs\u002Futils\u002Ftypes\u002FStandardResponse",{"title":826,"path":827,"stem":828},"ValueOf","\u002Fdocs\u002Futils\u002Ftypes\u002Fvalueof","docs\u002Futils\u002Ftypes\u002FValueOf",{"id":4,"extension":5,"links":830,"meta":841,"stem":62,"__hash__":63},[831,839,840],{"nested":8,"label":9,"icon":10,"to":11,"children":832},[833,834,835,836,837,838],{"label":14,"icon":15,"to":11,"description":16,"github":17,"badge":18},{"label":20,"icon":21,"to":22,"description":23,"github":24,"badge":25},{"label":27,"icon":28,"to":29,"description":30,"github":31,"badge":25},{"label":33,"icon":34,"to":35,"description":36,"github":37,"badge":38},{"label":40,"icon":41,"to":42,"description":43,"github":44,"badge":38},{"label":46,"icon":47,"to":48,"description":49,"github":50,"badge":51},{"nested":53,"label":54,"icon":55,"to":56},{"nested":53,"label":58,"icon":59,"to":60},{},{"id":843,"title":89,"body":844,"description":1963,"extension":1964,"icon":1965,"meta":1966,"module":1967,"navigation":8,"path":90,"rawbody":1968,"seo":1969,"stem":91,"__hash__":1970},"docs\u002Fdocs\u002Fauth-h3client\u002F01.essentials\u002F00.session.md",{"type":845,"value":846,"toc":1952},"minimark",[847,851,854,859,878,889,978,985,988,1131,1134,1160,1167,1169,1173,1178,1193,1198,1201,1212,1229,1305,1308,1311,1322,1393,1424,1428,1438,1442,1458,1509,1531,1683,1695,1697,1701,1708,1793,1804,1918,1924,1926,1930,1948],[848,849,850],"p",{},"Session state in the module is resolved entirely on the server. Every protected request runs through a token rotation check, a cached user-data lookup against the IAM service, and the verified result is placed on the H3 event context for the handler to read. A pre-built auth status route exposes the same resolution over HTTP so any browser client, or a Vue app, can read the session state with a single request.",[852,853],"hr",{},[855,856,858],"h2",{"id":857},"auth-status-handler","Auth status handler",[848,860,861,865,866,869,870,877],{},[862,863,864],"code",{},"getAuthStatusHandler"," is a pre-built H3 handler that resolves the current session. It calls ",[862,867,868],{},"ensureValidCredentials"," to check and rotate tokens, then proxies to the IAM ",[871,872,874],"a",{"href":873},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff#authorization-check-get-secretdata",[862,875,876],{},"\u002Fsecret\u002Fdata"," endpoint and returns a normalized response.",[848,879,880,881,884,885,888],{},"Register it at any path you choose. In manual H3 and Nitro setups, the common\npath is ",[862,882,883],{},"\u002Fauth\u002Fusers\u002FauthStatus",". Under the Nuxt module, the default path is\n",[862,886,887],{},"\u002Fapi\u002Fauth\u002Fusers\u002FauthStatus",":",[890,891,896],"pre",{"className":892,"code":893,"language":894,"meta":895,"style":895},"language-ts shiki shiki-themes light-plus light-plus dracula","\u002F\u002F H3 v1\nrouter.get('\u002Fauth\u002Fusers\u002FauthStatus', getAuthStatusHandler)\n\n\u002F\u002F H3 v2\napp.get('\u002Fauth\u002Fusers\u002FauthStatus', getAuthStatusHandler)\n","ts","",[862,897,898,907,942,948,954],{"__ignoreMap":895},[899,900,903],"span",{"class":901,"line":902},"line",1,[899,904,906],{"class":905},"sghk6","\u002F\u002F H3 v1\n",[899,908,910,914,918,922,925,929,932,934,937,939],{"class":901,"line":909},2,[899,911,913],{"class":912},"sjsA6","router",[899,915,917],{"class":916},"sDd4n",".",[899,919,921],{"class":920},"sHOzp","get",[899,923,924],{"class":916},"(",[899,926,928],{"class":927},"sFkSl","'",[899,930,883],{"class":931},"sFB1V",[899,933,928],{"class":927},[899,935,936],{"class":916},", ",[899,938,864],{"class":912},[899,940,941],{"class":916},")\n",[899,943,945],{"class":901,"line":944},3,[899,946,947],{"emptyLinePlaceholder":8},"\n",[899,949,951],{"class":901,"line":950},4,[899,952,953],{"class":905},"\u002F\u002F H3 v2\n",[899,955,957,960,962,964,966,968,970,972,974,976],{"class":901,"line":956},5,[899,958,959],{"class":912},"app",[899,961,917],{"class":916},[899,963,921],{"class":920},[899,965,924],{"class":916},[899,967,928],{"class":927},[899,969,883],{"class":931},[899,971,928],{"class":927},[899,973,936],{"class":916},[899,975,864],{"class":912},[899,977,941],{"class":916},[848,979,980,981,984],{},"When using the Nuxt module, this route is registered automatically at the path set by the ",[862,982,983],{},"authStatusUrl"," module option.",[848,986,987],{},"The response shape when authorized:",[890,989,992],{"className":990,"code":991,"language":5,"meta":895,"style":895},"language-json shiki shiki-themes light-plus light-plus dracula","{\n  \"authorized\": true,\n  \"userId\": 42,\n  \"roles\": [\"user\"],\n  \"ipAddress\": \"1.2.3.4\",\n  \"userAgent\": \"Mozilla\u002F5.0 ...\",\n  \"date\": \"2026-04-10T...\"\n}\n",[862,993,994,999,1022,1039,1063,1084,1105,1125],{"__ignoreMap":895},[899,995,996],{"class":901,"line":902},[899,997,998],{"class":916},"{\n",[899,1000,1001,1005,1009,1012,1015,1019],{"class":901,"line":909},[899,1002,1004],{"class":1003},"saJyd","  \"",[899,1006,1008],{"class":1007},"s_W10","authorized",[899,1010,1011],{"class":1003},"\"",[899,1013,888],{"class":1014},"saOXh",[899,1016,1018],{"class":1017},"sjR7W"," true",[899,1020,1021],{"class":916},",\n",[899,1023,1024,1026,1029,1031,1033,1037],{"class":901,"line":944},[899,1025,1004],{"class":1003},[899,1027,1028],{"class":1007},"userId",[899,1030,1011],{"class":1003},[899,1032,888],{"class":1014},[899,1034,1036],{"class":1035},"spgvN"," 42",[899,1038,1021],{"class":916},[899,1040,1041,1043,1046,1048,1050,1053,1055,1058,1060],{"class":901,"line":950},[899,1042,1004],{"class":1003},[899,1044,1045],{"class":1007},"roles",[899,1047,1011],{"class":1003},[899,1049,888],{"class":1014},[899,1051,1052],{"class":916}," [",[899,1054,1011],{"class":927},[899,1056,1057],{"class":931},"user",[899,1059,1011],{"class":927},[899,1061,1062],{"class":916},"],\n",[899,1064,1065,1067,1070,1072,1074,1077,1080,1082],{"class":901,"line":956},[899,1066,1004],{"class":1003},[899,1068,1069],{"class":1007},"ipAddress",[899,1071,1011],{"class":1003},[899,1073,888],{"class":1014},[899,1075,1076],{"class":927}," \"",[899,1078,1079],{"class":931},"1.2.3.4",[899,1081,1011],{"class":927},[899,1083,1021],{"class":916},[899,1085,1087,1089,1092,1094,1096,1098,1101,1103],{"class":901,"line":1086},6,[899,1088,1004],{"class":1003},[899,1090,1091],{"class":1007},"userAgent",[899,1093,1011],{"class":1003},[899,1095,888],{"class":1014},[899,1097,1076],{"class":927},[899,1099,1100],{"class":931},"Mozilla\u002F5.0 ...",[899,1102,1011],{"class":927},[899,1104,1021],{"class":916},[899,1106,1108,1110,1113,1115,1117,1119,1122],{"class":901,"line":1107},7,[899,1109,1004],{"class":1003},[899,1111,1112],{"class":1007},"date",[899,1114,1011],{"class":1003},[899,1116,888],{"class":1014},[899,1118,1076],{"class":927},[899,1120,1121],{"class":931},"2026-04-10T...",[899,1123,1124],{"class":927},"\"\n",[899,1126,1128],{"class":901,"line":1127},8,[899,1129,1130],{"class":916},"}\n",[848,1132,1133],{},"When not authorized:",[890,1135,1137],{"className":990,"code":1136,"language":5,"meta":895,"style":895},"{\n  \"authorized\": false\n}\n",[862,1138,1139,1143,1156],{"__ignoreMap":895},[899,1140,1141],{"class":901,"line":902},[899,1142,998],{"class":916},[899,1144,1145,1147,1149,1151,1153],{"class":901,"line":909},[899,1146,1004],{"class":1003},[899,1148,1008],{"class":1007},[899,1150,1011],{"class":1003},[899,1152,888],{"class":1014},[899,1154,1155],{"class":1017}," false\n",[899,1157,1158],{"class":901,"line":944},[899,1159,1130],{"class":916},[848,1161,1162,1163,1166],{},"HTTP 202 indicates an MFA challenge and carries a ",[862,1164,1165],{},"message"," field with instructions.",[852,1168],{},[855,1170,1172],{"id":1171},"token-rotation","Token rotation",[848,1174,1175,1177],{},[862,1176,868],{}," runs inside every authenticated handler wrapper before your handler code executes. It is responsible for keeping the session alive by checking token state and rotating when needed.",[848,1179,1180,1181,1184,1185,1188,1189,1192],{},"Before any token logic runs, the function reads the ",[862,1182,1183],{},"session"," and ",[862,1186,1187],{},"canary_id"," cookies. If either is absent, it throws HTTP 401. The ",[862,1190,1191],{},"__Secure-a"," access token cookie is optional at this stage.",[1194,1195,1197],"h3",{"id":1196},"two-paths","Two paths",[848,1199,1200],{},"The function takes one of two paths depending on whether an access token is present.",[848,1202,1203,1207,1208,1211],{},[1204,1205,1206],"strong",{},"No access token:"," the function skips the metadata check and calls ",[862,1209,1210],{},"POST \u002Fauth\u002Fuser\u002Frefresh-session"," on the IAM service.",[848,1213,1214,1217,1218,1221,1222,1224,1225,1228],{},[1204,1215,1216],{},"Access token present:"," the function first calls ",[862,1219,1220],{},"GET \u002Fsecret\u002Faccesstoken\u002Fmetadata"," on the IAM service to check the token's state. Results are cached in a ",[862,1223,752],{}," instance keyed by the access token value (cached for ",[862,1226,1227],{},"msUntilExp - refreshThreshold - 5 seconds","). The metadata result determines what happens next:",[1230,1231,1232,1245],"table",{},[1233,1234,1235],"thead",{},[1236,1237,1238,1242],"tr",{},[1239,1240,1241],"th",{},"Metadata result",[1239,1243,1244],{},"Action",[1246,1247,1248,1257,1272,1281,1290],"tbody",{},[1236,1249,1250,1254],{},[1251,1252,1253],"td",{},"Server error, no response, or unexpected status",[1251,1255,1256],{},"Delete cache entry, rotate",[1236,1258,1259,1265],{},[1251,1260,1261,1264],{},[862,1262,1263],{},"mfa: true"," (IAM returned 202)",[1251,1266,1267,1268,1271],{},"Return ",[862,1269,1270],{},"{ text: 'MFA required' }"," with HTTP 202, do not rotate",[1236,1273,1274,1279],{},[1251,1275,1276],{},[862,1277,1278],{},"authorized: false",[1251,1280,1256],{},[1236,1282,1283,1288],{},[1251,1284,1285],{},[862,1286,1287],{},"shouldRotate: true",[1251,1289,1256],{},[1236,1291,1292,1295],{},[1251,1293,1294],{},"Valid and within threshold",[1251,1296,1297,1298,1184,1301,1304],{},"Set ",[862,1299,1300],{},"event.context.accessToken",[862,1302,1303],{},"event.context.session",", continue",[848,1306,1307],{},"If the metadata call throws unexpectedly, the cache entry is deleted and rotation is attempted.",[1194,1309,512],{"id":1310},"rotation",[848,1312,1313,1314,1316,1317,1184,1319,1321],{},"When rotation is needed, the function calls ",[862,1315,1210],{}," with the ",[862,1318,1183],{},[862,1320,1187],{}," cookies. The IAM service response determines the outcome:",[1230,1323,1324,1333],{},[1233,1325,1326],{},[1236,1327,1328,1331],{},[1239,1329,1330],{},"IAM status",[1239,1332,1244],{},[1246,1334,1335,1345,1358,1368,1382],{},[1236,1336,1337,1342],{},[1251,1338,1339],{},[862,1340,1341],{},"201",[1251,1343,1344],{},"Apply new tokens and continue",[1236,1346,1347,1352],{},[1251,1348,1349],{},[862,1350,1351],{},"202",[1251,1353,1267,1354,1357],{},[862,1355,1356],{},"{ text: 'MFA required', message }"," with HTTP 202, do not apply cookies",[1236,1359,1360,1365],{},[1251,1361,1362],{},[862,1363,1364],{},"401",[1251,1366,1367],{},"Throw HTTP 401, re-authentication required",[1236,1369,1370,1375],{},[1251,1371,1372],{},[862,1373,1374],{},"429",[1251,1376,1377,1378,1381],{},"Forward ",[862,1379,1380],{},"Retry-After"," header, return rate-limit error",[1236,1383,1384,1390],{},[1251,1385,1386,1389],{},[862,1387,1388],{},"500"," or unexpected",[1251,1391,1392],{},"Throw HTTP 500",[848,1394,1395,1396,1398,1399,1402,1403,936,1405,1408,1409,1412,1413,1415,1416,936,1418,1420,1421,917],{},"On a successful ",[862,1397,1341],{}," response, ",[862,1400,1401],{},"applyRotationResult"," writes the new ",[862,1404,1191],{},[862,1406,1407],{},"a-iat"," cookies and forwards the ",[862,1410,1411],{},"Set-Cookie"," headers from the IAM response (which contain the new ",[862,1414,1183],{}," cookie). It also sets ",[862,1417,1300],{},[862,1419,1303],{},", and ",[862,1422,1423],{},"event.context.isRotated = true",[1194,1425,1427],{"id":1426},"deduplication","Deduplication",[848,1429,1430,1431,1434,1435,1437],{},"Both the metadata check and the rotation call are wrapped with ",[862,1432,1433],{},"lockAsyncAction"," keyed on the ",[862,1436,1183],{}," refresh token value. If two requests for the same session arrive simultaneously, only one call proceeds at each stage. The second request waits and reuses the result.",[1194,1439,1441],{"id":1440},"accessing-token-metadata-directly","Accessing token metadata directly",[848,1443,1444,1447,1448,1454,1455,1457],{},[862,1445,1446],{},"getAccessTokenMetaData"," reads the access token from the request cookies and calls the IAM ",[871,1449,1451],{"href":1450},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff#token-metadata-get-secretaccesstokenmetadata",[862,1452,1453],{},"\u002Fsecret\u002Faccesstoken\u002Fmetadata"," endpoint. Results are cached in a ",[862,1456,752],{}," instance:",[890,1459,1461],{"className":892,"code":1460,"language":894,"meta":895,"style":895},"const meta = await getAccessTokenMetaData(event)\n\n\u002F\u002F meta.msUntilExp   - milliseconds until the token expires\n\u002F\u002F meta.shouldRotate - true when rotation threshold is reached\n\u002F\u002F meta.authorized   - false when the token is invalid or absent\n",[862,1462,1463,1490,1494,1499,1504],{"__ignoreMap":895},[899,1464,1465,1469,1473,1476,1480,1483,1485,1488],{"class":901,"line":902},[899,1466,1468],{"class":1467},"sl46w","const",[899,1470,1472],{"class":1471},"s3JHE"," meta",[899,1474,1475],{"class":1014}," =",[899,1477,1479],{"class":1478},"sZ328"," await",[899,1481,1482],{"class":920}," getAccessTokenMetaData",[899,1484,924],{"class":916},[899,1486,1487],{"class":912},"event",[899,1489,941],{"class":916},[899,1491,1492],{"class":901,"line":909},[899,1493,947],{"emptyLinePlaceholder":8},[899,1495,1496],{"class":901,"line":944},[899,1497,1498],{"class":905},"\u002F\u002F meta.msUntilExp   - milliseconds until the token expires\n",[899,1500,1501],{"class":901,"line":950},[899,1502,1503],{"class":905},"\u002F\u002F meta.shouldRotate - true when rotation threshold is reached\n",[899,1505,1506],{"class":901,"line":956},[899,1507,1508],{"class":905},"\u002F\u002F meta.authorized   - false when the token is invalid or absent\n",[848,1510,1511,1514,1515,1519,1520,1526,1527,1530],{},[862,1512,1513],{},"getCachedUserData"," calls the IAM ",[871,1516,1517],{"href":873},[862,1518,876],{}," endpoint and caches the result in the configured ",[871,1521,1525],{"href":1522,"rel":1523},"https:\u002F\u002Funstorage.unjs.io\u002F",[1524],"nofollow","unstorage"," instance. The cache key is a SHA-256 hash of the canary ID, refresh token, and access token. Cached results are served for the duration of ",[862,1528,1529],{},"successTtl"," (default 30 days) without a network call:",[890,1532,1534],{"className":892,"code":1533,"language":894,"meta":895,"style":895},"const result = await getCachedUserData(event, cookies, token, storage)\n\nif (result.type === 'SUCCESS') {\n  const { userId, roles, authorized } = result.data\n}\n\nif (result.type === 'ERROR') {\n  \u002F\u002F result.reason: 'UNAUTHORIZED' | 'MFA' | 'RATE_LIMIT' | 'SERVER_ERROR' | ...\n  \u002F\u002F result.status: number\n}\n",[862,1535,1536,1571,1575,1605,1636,1640,1644,1667,1672,1678],{"__ignoreMap":895},[899,1537,1538,1540,1543,1545,1547,1550,1552,1554,1556,1559,1561,1564,1566,1569],{"class":901,"line":902},[899,1539,1468],{"class":1467},[899,1541,1542],{"class":1471}," result",[899,1544,1475],{"class":1014},[899,1546,1479],{"class":1478},[899,1548,1549],{"class":920}," getCachedUserData",[899,1551,924],{"class":916},[899,1553,1487],{"class":912},[899,1555,936],{"class":916},[899,1557,1558],{"class":912},"cookies",[899,1560,936],{"class":916},[899,1562,1563],{"class":912},"token",[899,1565,936],{"class":916},[899,1567,1568],{"class":912},"storage",[899,1570,941],{"class":916},[899,1572,1573],{"class":901,"line":909},[899,1574,947],{"emptyLinePlaceholder":8},[899,1576,1577,1580,1583,1586,1588,1591,1594,1597,1600,1602],{"class":901,"line":944},[899,1578,1579],{"class":1478},"if",[899,1581,1582],{"class":916}," (",[899,1584,1585],{"class":912},"result",[899,1587,917],{"class":916},[899,1589,1590],{"class":912},"type",[899,1592,1593],{"class":1014}," ===",[899,1595,1596],{"class":927}," '",[899,1598,1599],{"class":931},"SUCCESS",[899,1601,928],{"class":927},[899,1603,1604],{"class":916},") {\n",[899,1606,1607,1610,1613,1615,1617,1619,1621,1623,1626,1629,1631,1633],{"class":901,"line":950},[899,1608,1609],{"class":1467},"  const",[899,1611,1612],{"class":916}," { ",[899,1614,1028],{"class":1471},[899,1616,936],{"class":916},[899,1618,1045],{"class":1471},[899,1620,936],{"class":916},[899,1622,1008],{"class":1471},[899,1624,1625],{"class":916}," } ",[899,1627,1628],{"class":1014},"=",[899,1630,1542],{"class":912},[899,1632,917],{"class":916},[899,1634,1635],{"class":912},"data\n",[899,1637,1638],{"class":901,"line":956},[899,1639,1130],{"class":916},[899,1641,1642],{"class":901,"line":1086},[899,1643,947],{"emptyLinePlaceholder":8},[899,1645,1646,1648,1650,1652,1654,1656,1658,1660,1663,1665],{"class":901,"line":1107},[899,1647,1579],{"class":1478},[899,1649,1582],{"class":916},[899,1651,1585],{"class":912},[899,1653,917],{"class":916},[899,1655,1590],{"class":912},[899,1657,1593],{"class":1014},[899,1659,1596],{"class":927},[899,1661,1662],{"class":931},"ERROR",[899,1664,928],{"class":927},[899,1666,1604],{"class":916},[899,1668,1669],{"class":901,"line":1127},[899,1670,1671],{"class":905},"  \u002F\u002F result.reason: 'UNAUTHORIZED' | 'MFA' | 'RATE_LIMIT' | 'SERVER_ERROR' | ...\n",[899,1673,1675],{"class":901,"line":1674},9,[899,1676,1677],{"class":905},"  \u002F\u002F result.status: number\n",[899,1679,1681],{"class":901,"line":1680},10,[899,1682,1130],{"class":916},[848,1684,1685,1687,1688,1184,1691,1694],{},[862,1686,1513],{}," is called internally by ",[862,1689,1690],{},"defineAuthenticatedEventHandler",[862,1692,1693],{},"defineOptionalAuthenticationEvent",". Call it directly only when you need user data outside of a handler wrapper context.",[852,1696],{},[855,1698,1700],{"id":1699},"reading-session-state-from-the-h3-event-context","Reading session state from the H3 event context",[848,1702,1703,1704,1707],{},"Inside any authenticated handler wrapper, ",[862,1705,1706],{},"event.context.authorizedData"," holds the verified session data after the auth check passes:",[890,1709,1711],{"className":892,"code":1710,"language":894,"meta":895,"style":895},"export default defineAuthenticatedEventHandler(async (event) => {\n  const { userId, roles, authorized } = event.context.authorizedData\n  return { userId }\n})\n",[862,1712,1713,1743,1776,1788],{"__ignoreMap":895},[899,1714,1715,1718,1721,1724,1726,1729,1731,1734,1737,1740],{"class":901,"line":902},[899,1716,1717],{"class":1478},"export",[899,1719,1720],{"class":1478}," default",[899,1722,1723],{"class":920}," defineAuthenticatedEventHandler",[899,1725,924],{"class":916},[899,1727,1728],{"class":1467},"async",[899,1730,1582],{"class":916},[899,1732,1487],{"class":1733},"sygFZ",[899,1735,1736],{"class":916},") ",[899,1738,1739],{"class":1467},"=>",[899,1741,1742],{"class":916}," {\n",[899,1744,1745,1747,1749,1751,1753,1755,1757,1759,1761,1763,1766,1768,1771,1773],{"class":901,"line":909},[899,1746,1609],{"class":1467},[899,1748,1612],{"class":916},[899,1750,1028],{"class":1471},[899,1752,936],{"class":916},[899,1754,1045],{"class":1471},[899,1756,936],{"class":916},[899,1758,1008],{"class":1471},[899,1760,1625],{"class":916},[899,1762,1628],{"class":1014},[899,1764,1765],{"class":912}," event",[899,1767,917],{"class":916},[899,1769,1770],{"class":912},"context",[899,1772,917],{"class":916},[899,1774,1775],{"class":912},"authorizedData\n",[899,1777,1778,1781,1783,1785],{"class":901,"line":944},[899,1779,1780],{"class":1478},"  return",[899,1782,1612],{"class":916},[899,1784,1028],{"class":912},[899,1786,1787],{"class":916}," }\n",[899,1789,1790],{"class":901,"line":950},[899,1791,1792],{"class":916},"})\n",[848,1794,1795,1796,1799,1800,1803],{},"The ",[862,1797,1798],{},"authorizedData"," object matches the ",[862,1801,1802],{},"ServerResponse"," type returned by the IAM service:",[890,1805,1807],{"className":892,"code":1806,"language":894,"meta":895,"style":895},"interface ServerResponse {\n  authorized: boolean\n  userId?: string\n  roles?: string[] | string\n  ipAddress: string\n  userAgent: string\n  date: string\n  reason?: string\n  error?: string\n  message?: string\n}\n",[862,1808,1809,1820,1830,1841,1859,1868,1877,1886,1895,1904,1913],{"__ignoreMap":895},[899,1810,1811,1814,1818],{"class":901,"line":902},[899,1812,1813],{"class":1467},"interface",[899,1815,1817],{"class":1816},"sFs1U"," ServerResponse",[899,1819,1742],{"class":916},[899,1821,1822,1825,1827],{"class":901,"line":909},[899,1823,1824],{"class":912},"  authorized",[899,1826,888],{"class":1014},[899,1828,1829],{"class":1816}," boolean\n",[899,1831,1832,1835,1838],{"class":901,"line":944},[899,1833,1834],{"class":912},"  userId",[899,1836,1837],{"class":1014},"?:",[899,1839,1840],{"class":1816}," string\n",[899,1842,1843,1846,1848,1851,1854,1857],{"class":901,"line":950},[899,1844,1845],{"class":912},"  roles",[899,1847,1837],{"class":1014},[899,1849,1850],{"class":1816}," string",[899,1852,1853],{"class":916},"[] ",[899,1855,1856],{"class":1014},"|",[899,1858,1840],{"class":1816},[899,1860,1861,1864,1866],{"class":901,"line":956},[899,1862,1863],{"class":912},"  ipAddress",[899,1865,888],{"class":1014},[899,1867,1840],{"class":1816},[899,1869,1870,1873,1875],{"class":901,"line":1086},[899,1871,1872],{"class":912},"  userAgent",[899,1874,888],{"class":1014},[899,1876,1840],{"class":1816},[899,1878,1879,1882,1884],{"class":901,"line":1107},[899,1880,1881],{"class":912},"  date",[899,1883,888],{"class":1014},[899,1885,1840],{"class":1816},[899,1887,1888,1891,1893],{"class":901,"line":1127},[899,1889,1890],{"class":912},"  reason",[899,1892,1837],{"class":1014},[899,1894,1840],{"class":1816},[899,1896,1897,1900,1902],{"class":901,"line":1674},[899,1898,1899],{"class":912},"  error",[899,1901,1837],{"class":1014},[899,1903,1840],{"class":1816},[899,1905,1906,1909,1911],{"class":901,"line":1680},[899,1907,1908],{"class":912},"  message",[899,1910,1837],{"class":1014},[899,1912,1840],{"class":1816},[899,1914,1916],{"class":901,"line":1915},11,[899,1917,1130],{"class":916},[848,1919,1920,1921,1923],{},"See ",[871,1922,93],{"href":94}," for the full set of handler wrappers and when to use each one.",[852,1925],{},[855,1927,1929],{"id":1928},"reading-session-state-on-the-client","Reading session state on the client",[848,1931,1795,1932,1935,1936,1940,1941,1944,1945,1947],{},[862,1933,1934],{},"auth-h3client\u002Fclient"," entry point ships a browser-side Vue composable, ",[871,1937,1938],{"href":153},[862,1939,152],{},", that calls the auth status route during SSR, stores the result in a singleton, and hydrates it on the client without triggering a second request. The composable works in any Nuxt or Vue application that has access to the ",[862,1942,1943],{},"nuxt\u002Fapp"," composables. See the ",[871,1946,146],{"href":147}," section for the full browser-side surface.",[1949,1950,1951],"style",{},"html pre.shiki code .sghk6, html code.shiki .sghk6{--shiki-light:#008000;--shiki-default:#008000;--shiki-dark:#6272A4}html pre.shiki code .sjsA6, html code.shiki .sjsA6{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#F8F8F2}html pre.shiki code .sDd4n, html code.shiki .sDd4n{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#F8F8F2}html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}html pre.shiki code .sFkSl, html code.shiki .sFkSl{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#E9F284}html pre.shiki code .sFB1V, html code.shiki .sFB1V{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#F1FA8C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .saJyd, html code.shiki .saJyd{--shiki-light:#0451A5;--shiki-default:#0451A5;--shiki-dark:#8BE9FE}html pre.shiki code .s_W10, html code.shiki .s_W10{--shiki-light:#0451A5;--shiki-default:#0451A5;--shiki-dark:#8BE9FD}html pre.shiki code .saOXh, html code.shiki .saOXh{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#FF79C6}html pre.shiki code .sjR7W, html code.shiki .sjR7W{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#BD93F9}html pre.shiki code .spgvN, html code.shiki .spgvN{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#BD93F9}html pre.shiki code .sl46w, html code.shiki .sl46w{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#FF79C6}html pre.shiki code .s3JHE, html code.shiki .s3JHE{--shiki-light:#0070C1;--shiki-default:#0070C1;--shiki-dark:#F8F8F2}html pre.shiki code .sZ328, html code.shiki .sZ328{--shiki-light:#AF00DB;--shiki-default:#AF00DB;--shiki-dark:#FF79C6}html pre.shiki code .sygFZ, html code.shiki .sygFZ{--shiki-light:#001080;--shiki-light-font-style:inherit;--shiki-default:#001080;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}html pre.shiki code .sFs1U, html code.shiki .sFs1U{--shiki-light:#267F99;--shiki-light-font-style:inherit;--shiki-default:#267F99;--shiki-default-font-style:inherit;--shiki-dark:#8BE9FD;--shiki-dark-font-style:italic}",{"title":895,"searchDepth":909,"depth":909,"links":1953},[1954,1955,1961,1962],{"id":857,"depth":909,"text":858},{"id":1171,"depth":909,"text":1172,"children":1956},[1957,1958,1959,1960],{"id":1196,"depth":944,"text":1197},{"id":1310,"depth":944,"text":512},{"id":1426,"depth":944,"text":1427},{"id":1440,"depth":944,"text":1441},{"id":1699,"depth":909,"text":1700},{"id":1928,"depth":909,"text":1929},"How the gateway resolves, rotates, and exposes session state on the server, and how the auth status handler powers authentication checks.","md","i-lucide-user-check",{},null,"---\ntitle: Session Management\ndescription: How the gateway resolves, rotates, and exposes session state on the server, and how the auth status handler powers authentication checks.\nicon: i-lucide-user-check\n---\n\nSession state in the module is resolved entirely on the server. Every protected request runs through a token rotation check, a cached user-data lookup against the IAM service, and the verified result is placed on the H3 event context for the handler to read. A pre-built auth status route exposes the same resolution over HTTP so any browser client, or a Vue app, can read the session state with a single request.\n\n---\n\n## Auth status handler\n\n`getAuthStatusHandler` is a pre-built H3 handler that resolves the current session. It calls `ensureValidCredentials` to check and rotate tokens, then proxies to the IAM [`\u002Fsecret\u002Fdata`](\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff#authorization-check-get-secretdata) endpoint and returns a normalized response.\n\nRegister it at any path you choose. In manual H3 and Nitro setups, the common\npath is `\u002Fauth\u002Fusers\u002FauthStatus`. Under the Nuxt module, the default path is\n`\u002Fapi\u002Fauth\u002Fusers\u002FauthStatus`:\n\n```ts\n\u002F\u002F H3 v1\nrouter.get('\u002Fauth\u002Fusers\u002FauthStatus', getAuthStatusHandler)\n\n\u002F\u002F H3 v2\napp.get('\u002Fauth\u002Fusers\u002FauthStatus', getAuthStatusHandler)\n```\n\nWhen using the Nuxt module, this route is registered automatically at the path set by the `authStatusUrl` module option.\n\nThe response shape when authorized:\n\n```json\n{\n  \"authorized\": true,\n  \"userId\": 42,\n  \"roles\": [\"user\"],\n  \"ipAddress\": \"1.2.3.4\",\n  \"userAgent\": \"Mozilla\u002F5.0 ...\",\n  \"date\": \"2026-04-10T...\"\n}\n```\n\nWhen not authorized:\n\n```json\n{\n  \"authorized\": false\n}\n```\n\nHTTP 202 indicates an MFA challenge and carries a `message` field with instructions.\n\n---\n\n## Token rotation\n\n`ensureValidCredentials` runs inside every authenticated handler wrapper before your handler code executes. It is responsible for keeping the session alive by checking token state and rotating when needed.\n\n\nBefore any token logic runs, the function reads the `session` and `canary_id` cookies. If either is absent, it throws HTTP 401. The `__Secure-a` access token cookie is optional at this stage.\n\n### Two paths\n\nThe function takes one of two paths depending on whether an access token is present.\n\n**No access token:** the function skips the metadata check and calls `POST \u002Fauth\u002Fuser\u002Frefresh-session` on the IAM service.\n\n**Access token present:** the function first calls `GET \u002Fsecret\u002Faccesstoken\u002Fmetadata` on the IAM service to check the token's state. Results are cached in a `MiniCache` instance keyed by the access token value (cached for `msUntilExp - refreshThreshold - 5 seconds`). The metadata result determines what happens next:\n\n| Metadata result | Action |\n|---|---|\n| Server error, no response, or unexpected status | Delete cache entry, rotate |\n| `mfa: true` (IAM returned 202) | Return `{ text: 'MFA required' }` with HTTP 202, do not rotate |\n| `authorized: false` | Delete cache entry, rotate |\n| `shouldRotate: true` | Delete cache entry, rotate |\n| Valid and within threshold | Set `event.context.accessToken` and `event.context.session`, continue |\n\nIf the metadata call throws unexpectedly, the cache entry is deleted and rotation is attempted.\n\n### Rotation\n\nWhen rotation is needed, the function calls `POST \u002Fauth\u002Fuser\u002Frefresh-session` with the `session` and `canary_id` cookies. The IAM service response determines the outcome:\n\n| IAM status | Action |\n|---|---|\n| `201` | Apply new tokens and continue |\n| `202` | Return `{ text: 'MFA required', message }` with HTTP 202, do not apply cookies |\n| `401` | Throw HTTP 401, re-authentication required |\n| `429` | Forward `Retry-After` header, return rate-limit error |\n| `500` or unexpected | Throw HTTP 500 |\n\nOn a successful `201` response, `applyRotationResult` writes the new `__Secure-a`, `a-iat` cookies and forwards the `Set-Cookie` headers from the IAM response (which contain the new `session` cookie). It also sets `event.context.accessToken`, `event.context.session`, and `event.context.isRotated = true`.\n\n### Deduplication\n\nBoth the metadata check and the rotation call are wrapped with `lockAsyncAction` keyed on the `session` refresh token value. If two requests for the same session arrive simultaneously, only one call proceeds at each stage. The second request waits and reuses the result.\n\n### Accessing token metadata directly\n\n`getAccessTokenMetaData` reads the access token from the request cookies and calls the IAM [`\u002Fsecret\u002Faccesstoken\u002Fmetadata`](\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff#token-metadata-get-secretaccesstokenmetadata) endpoint. Results are cached in a `MiniCache` instance:\n\n```ts\nconst meta = await getAccessTokenMetaData(event)\n\n\u002F\u002F meta.msUntilExp   - milliseconds until the token expires\n\u002F\u002F meta.shouldRotate - true when rotation threshold is reached\n\u002F\u002F meta.authorized   - false when the token is invalid or absent\n```\n\n`getCachedUserData` calls the IAM [`\u002Fsecret\u002Fdata`](\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff#authorization-check-get-secretdata) endpoint and caches the result in the configured [unstorage](https:\u002F\u002Funstorage.unjs.io\u002F) instance. The cache key is a SHA-256 hash of the canary ID, refresh token, and access token. Cached results are served for the duration of `successTtl` (default 30 days) without a network call:\n\n```ts\nconst result = await getCachedUserData(event, cookies, token, storage)\n\nif (result.type === 'SUCCESS') {\n  const { userId, roles, authorized } = result.data\n}\n\nif (result.type === 'ERROR') {\n  \u002F\u002F result.reason: 'UNAUTHORIZED' | 'MFA' | 'RATE_LIMIT' | 'SERVER_ERROR' | ...\n  \u002F\u002F result.status: number\n}\n```\n\n`getCachedUserData` is called internally by `defineAuthenticatedEventHandler` and `defineOptionalAuthenticationEvent`. Call it directly only when you need user data outside of a handler wrapper context.\n\n---\n\n## Reading session state from the H3 event context\n\nInside any authenticated handler wrapper, `event.context.authorizedData` holds the verified session data after the auth check passes:\n\n```ts\nexport default defineAuthenticatedEventHandler(async (event) => {\n  const { userId, roles, authorized } = event.context.authorizedData\n  return { userId }\n})\n```\n\nThe `authorizedData` object matches the `ServerResponse` type returned by the IAM service:\n\n```ts\ninterface ServerResponse {\n  authorized: boolean\n  userId?: string\n  roles?: string[] | string\n  ipAddress: string\n  userAgent: string\n  date: string\n  reason?: string\n  error?: string\n  message?: string\n}\n```\n\nSee [Route Protection](\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection) for the full set of handler wrappers and when to use each one.\n\n---\n\n## Reading session state on the client\n\nThe `auth-h3client\u002Fclient` entry point ships a browser-side Vue composable, [`useAuthData`](\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-auth-data), that calls the auth status route during SSR, stores the result in a singleton, and hydrates it on the client without triggering a second request. The composable works in any Nuxt or Vue application that has access to the `nuxt\u002Fapp` composables. See the [Client-side](\u002Fdocs\u002Fauth-h3client\u002Fclient) section for the full browser-side surface.",{"title":89,"description":1963},"0gp4xZLUnvSGKpqhks9CgUqk_j4iZzLzPOcqV5NjRHs",[1972,1973],{"title":83,"path":84,"stem":85,"children":-1},{"title":93,"path":94,"stem":95,"children":-1},{"id":843,"title":89,"body":1975,"description":1963,"extension":1964,"icon":1965,"meta":2803,"module":1967,"navigation":8,"path":90,"rawbody":1968,"seo":2804,"stem":91,"__hash__":1970},{"type":845,"value":1976,"toc":2792},[1977,1979,1981,1983,1993,1999,2059,2063,2065,2177,2179,2203,2207,2209,2211,2215,2223,2225,2227,2233,2243,2297,2299,2301,2309,2365,2385,2387,2393,2395,2405,2443,2456,2584,2592,2594,2596,2600,2670,2676,2770,2774,2776,2778,2790],[848,1978,850],{},[852,1980],{},[855,1982,858],{"id":857},[848,1984,1985,865,1987,869,1989,877],{},[862,1986,864],{},[862,1988,868],{},[871,1990,1991],{"href":873},[862,1992,876],{},[848,1994,880,1995,884,1997,888],{},[862,1996,883],{},[862,1998,887],{},[890,2000,2001],{"className":892,"code":893,"language":894,"meta":895,"style":895},[862,2002,2003,2007,2029,2033,2037],{"__ignoreMap":895},[899,2004,2005],{"class":901,"line":902},[899,2006,906],{"class":905},[899,2008,2009,2011,2013,2015,2017,2019,2021,2023,2025,2027],{"class":901,"line":909},[899,2010,913],{"class":912},[899,2012,917],{"class":916},[899,2014,921],{"class":920},[899,2016,924],{"class":916},[899,2018,928],{"class":927},[899,2020,883],{"class":931},[899,2022,928],{"class":927},[899,2024,936],{"class":916},[899,2026,864],{"class":912},[899,2028,941],{"class":916},[899,2030,2031],{"class":901,"line":944},[899,2032,947],{"emptyLinePlaceholder":8},[899,2034,2035],{"class":901,"line":950},[899,2036,953],{"class":905},[899,2038,2039,2041,2043,2045,2047,2049,2051,2053,2055,2057],{"class":901,"line":956},[899,2040,959],{"class":912},[899,2042,917],{"class":916},[899,2044,921],{"class":920},[899,2046,924],{"class":916},[899,2048,928],{"class":927},[899,2050,883],{"class":931},[899,2052,928],{"class":927},[899,2054,936],{"class":916},[899,2056,864],{"class":912},[899,2058,941],{"class":916},[848,2060,980,2061,984],{},[862,2062,983],{},[848,2064,987],{},[890,2066,2067],{"className":990,"code":991,"language":5,"meta":895,"style":895},[862,2068,2069,2073,2087,2101,2121,2139,2157,2173],{"__ignoreMap":895},[899,2070,2071],{"class":901,"line":902},[899,2072,998],{"class":916},[899,2074,2075,2077,2079,2081,2083,2085],{"class":901,"line":909},[899,2076,1004],{"class":1003},[899,2078,1008],{"class":1007},[899,2080,1011],{"class":1003},[899,2082,888],{"class":1014},[899,2084,1018],{"class":1017},[899,2086,1021],{"class":916},[899,2088,2089,2091,2093,2095,2097,2099],{"class":901,"line":944},[899,2090,1004],{"class":1003},[899,2092,1028],{"class":1007},[899,2094,1011],{"class":1003},[899,2096,888],{"class":1014},[899,2098,1036],{"class":1035},[899,2100,1021],{"class":916},[899,2102,2103,2105,2107,2109,2111,2113,2115,2117,2119],{"class":901,"line":950},[899,2104,1004],{"class":1003},[899,2106,1045],{"class":1007},[899,2108,1011],{"class":1003},[899,2110,888],{"class":1014},[899,2112,1052],{"class":916},[899,2114,1011],{"class":927},[899,2116,1057],{"class":931},[899,2118,1011],{"class":927},[899,2120,1062],{"class":916},[899,2122,2123,2125,2127,2129,2131,2133,2135,2137],{"class":901,"line":956},[899,2124,1004],{"class":1003},[899,2126,1069],{"class":1007},[899,2128,1011],{"class":1003},[899,2130,888],{"class":1014},[899,2132,1076],{"class":927},[899,2134,1079],{"class":931},[899,2136,1011],{"class":927},[899,2138,1021],{"class":916},[899,2140,2141,2143,2145,2147,2149,2151,2153,2155],{"class":901,"line":1086},[899,2142,1004],{"class":1003},[899,2144,1091],{"class":1007},[899,2146,1011],{"class":1003},[899,2148,888],{"class":1014},[899,2150,1076],{"class":927},[899,2152,1100],{"class":931},[899,2154,1011],{"class":927},[899,2156,1021],{"class":916},[899,2158,2159,2161,2163,2165,2167,2169,2171],{"class":901,"line":1107},[899,2160,1004],{"class":1003},[899,2162,1112],{"class":1007},[899,2164,1011],{"class":1003},[899,2166,888],{"class":1014},[899,2168,1076],{"class":927},[899,2170,1121],{"class":931},[899,2172,1124],{"class":927},[899,2174,2175],{"class":901,"line":1127},[899,2176,1130],{"class":916},[848,2178,1133],{},[890,2180,2181],{"className":990,"code":1136,"language":5,"meta":895,"style":895},[862,2182,2183,2187,2199],{"__ignoreMap":895},[899,2184,2185],{"class":901,"line":902},[899,2186,998],{"class":916},[899,2188,2189,2191,2193,2195,2197],{"class":901,"line":909},[899,2190,1004],{"class":1003},[899,2192,1008],{"class":1007},[899,2194,1011],{"class":1003},[899,2196,888],{"class":1014},[899,2198,1155],{"class":1017},[899,2200,2201],{"class":901,"line":944},[899,2202,1130],{"class":916},[848,2204,1162,2205,1166],{},[862,2206,1165],{},[852,2208],{},[855,2210,1172],{"id":1171},[848,2212,2213,1177],{},[862,2214,868],{},[848,2216,1180,2217,1184,2219,1188,2221,1192],{},[862,2218,1183],{},[862,2220,1187],{},[862,2222,1191],{},[1194,2224,1197],{"id":1196},[848,2226,1200],{},[848,2228,2229,1207,2231,1211],{},[1204,2230,1206],{},[862,2232,1210],{},[848,2234,2235,1217,2237,1221,2239,1224,2241,1228],{},[1204,2236,1216],{},[862,2238,1220],{},[862,2240,752],{},[862,2242,1227],{},[1230,2244,2245,2253],{},[1233,2246,2247],{},[1236,2248,2249,2251],{},[1239,2250,1241],{},[1239,2252,1244],{},[1246,2254,2255,2261,2271,2279,2287],{},[1236,2256,2257,2259],{},[1251,2258,1253],{},[1251,2260,1256],{},[1236,2262,2263,2267],{},[1251,2264,2265,1264],{},[862,2266,1263],{},[1251,2268,1267,2269,1271],{},[862,2270,1270],{},[1236,2272,2273,2277],{},[1251,2274,2275],{},[862,2276,1278],{},[1251,2278,1256],{},[1236,2280,2281,2285],{},[1251,2282,2283],{},[862,2284,1287],{},[1251,2286,1256],{},[1236,2288,2289,2291],{},[1251,2290,1294],{},[1251,2292,1297,2293,1184,2295,1304],{},[862,2294,1300],{},[862,2296,1303],{},[848,2298,1307],{},[1194,2300,512],{"id":1310},[848,2302,1313,2303,1316,2305,1184,2307,1321],{},[862,2304,1210],{},[862,2306,1183],{},[862,2308,1187],{},[1230,2310,2311,2319],{},[1233,2312,2313],{},[1236,2314,2315,2317],{},[1239,2316,1330],{},[1239,2318,1244],{},[1246,2320,2321,2329,2339,2347,2357],{},[1236,2322,2323,2327],{},[1251,2324,2325],{},[862,2326,1341],{},[1251,2328,1344],{},[1236,2330,2331,2335],{},[1251,2332,2333],{},[862,2334,1351],{},[1251,2336,1267,2337,1357],{},[862,2338,1356],{},[1236,2340,2341,2345],{},[1251,2342,2343],{},[862,2344,1364],{},[1251,2346,1367],{},[1236,2348,2349,2353],{},[1251,2350,2351],{},[862,2352,1374],{},[1251,2354,1377,2355,1381],{},[862,2356,1380],{},[1236,2358,2359,2363],{},[1251,2360,2361,1389],{},[862,2362,1388],{},[1251,2364,1392],{},[848,2366,1395,2367,1398,2369,1402,2371,936,2373,1408,2375,1412,2377,1415,2379,936,2381,1420,2383,917],{},[862,2368,1341],{},[862,2370,1401],{},[862,2372,1191],{},[862,2374,1407],{},[862,2376,1411],{},[862,2378,1183],{},[862,2380,1300],{},[862,2382,1303],{},[862,2384,1423],{},[1194,2386,1427],{"id":1426},[848,2388,1430,2389,1434,2391,1437],{},[862,2390,1433],{},[862,2392,1183],{},[1194,2394,1441],{"id":1440},[848,2396,2397,1447,2399,1454,2403,1457],{},[862,2398,1446],{},[871,2400,2401],{"href":1450},[862,2402,1453],{},[862,2404,752],{},[890,2406,2407],{"className":892,"code":1460,"language":894,"meta":895,"style":895},[862,2408,2409,2427,2431,2435,2439],{"__ignoreMap":895},[899,2410,2411,2413,2415,2417,2419,2421,2423,2425],{"class":901,"line":902},[899,2412,1468],{"class":1467},[899,2414,1472],{"class":1471},[899,2416,1475],{"class":1014},[899,2418,1479],{"class":1478},[899,2420,1482],{"class":920},[899,2422,924],{"class":916},[899,2424,1487],{"class":912},[899,2426,941],{"class":916},[899,2428,2429],{"class":901,"line":909},[899,2430,947],{"emptyLinePlaceholder":8},[899,2432,2433],{"class":901,"line":944},[899,2434,1498],{"class":905},[899,2436,2437],{"class":901,"line":950},[899,2438,1503],{"class":905},[899,2440,2441],{"class":901,"line":956},[899,2442,1508],{"class":905},[848,2444,2445,1514,2447,1519,2451,1526,2454,1530],{},[862,2446,1513],{},[871,2448,2449],{"href":873},[862,2450,876],{},[871,2452,1525],{"href":1522,"rel":2453},[1524],[862,2455,1529],{},[890,2457,2458],{"className":892,"code":1533,"language":894,"meta":895,"style":895},[862,2459,2460,2490,2494,2516,2542,2546,2550,2572,2576,2580],{"__ignoreMap":895},[899,2461,2462,2464,2466,2468,2470,2472,2474,2476,2478,2480,2482,2484,2486,2488],{"class":901,"line":902},[899,2463,1468],{"class":1467},[899,2465,1542],{"class":1471},[899,2467,1475],{"class":1014},[899,2469,1479],{"class":1478},[899,2471,1549],{"class":920},[899,2473,924],{"class":916},[899,2475,1487],{"class":912},[899,2477,936],{"class":916},[899,2479,1558],{"class":912},[899,2481,936],{"class":916},[899,2483,1563],{"class":912},[899,2485,936],{"class":916},[899,2487,1568],{"class":912},[899,2489,941],{"class":916},[899,2491,2492],{"class":901,"line":909},[899,2493,947],{"emptyLinePlaceholder":8},[899,2495,2496,2498,2500,2502,2504,2506,2508,2510,2512,2514],{"class":901,"line":944},[899,2497,1579],{"class":1478},[899,2499,1582],{"class":916},[899,2501,1585],{"class":912},[899,2503,917],{"class":916},[899,2505,1590],{"class":912},[899,2507,1593],{"class":1014},[899,2509,1596],{"class":927},[899,2511,1599],{"class":931},[899,2513,928],{"class":927},[899,2515,1604],{"class":916},[899,2517,2518,2520,2522,2524,2526,2528,2530,2532,2534,2536,2538,2540],{"class":901,"line":950},[899,2519,1609],{"class":1467},[899,2521,1612],{"class":916},[899,2523,1028],{"class":1471},[899,2525,936],{"class":916},[899,2527,1045],{"class":1471},[899,2529,936],{"class":916},[899,2531,1008],{"class":1471},[899,2533,1625],{"class":916},[899,2535,1628],{"class":1014},[899,2537,1542],{"class":912},[899,2539,917],{"class":916},[899,2541,1635],{"class":912},[899,2543,2544],{"class":901,"line":956},[899,2545,1130],{"class":916},[899,2547,2548],{"class":901,"line":1086},[899,2549,947],{"emptyLinePlaceholder":8},[899,2551,2552,2554,2556,2558,2560,2562,2564,2566,2568,2570],{"class":901,"line":1107},[899,2553,1579],{"class":1478},[899,2555,1582],{"class":916},[899,2557,1585],{"class":912},[899,2559,917],{"class":916},[899,2561,1590],{"class":912},[899,2563,1593],{"class":1014},[899,2565,1596],{"class":927},[899,2567,1662],{"class":931},[899,2569,928],{"class":927},[899,2571,1604],{"class":916},[899,2573,2574],{"class":901,"line":1127},[899,2575,1671],{"class":905},[899,2577,2578],{"class":901,"line":1674},[899,2579,1677],{"class":905},[899,2581,2582],{"class":901,"line":1680},[899,2583,1130],{"class":916},[848,2585,2586,1687,2588,1184,2590,1694],{},[862,2587,1513],{},[862,2589,1690],{},[862,2591,1693],{},[852,2593],{},[855,2595,1700],{"id":1699},[848,2597,1703,2598,1707],{},[862,2599,1706],{},[890,2601,2602],{"className":892,"code":1710,"language":894,"meta":895,"style":895},[862,2603,2604,2626,2656,2666],{"__ignoreMap":895},[899,2605,2606,2608,2610,2612,2614,2616,2618,2620,2622,2624],{"class":901,"line":902},[899,2607,1717],{"class":1478},[899,2609,1720],{"class":1478},[899,2611,1723],{"class":920},[899,2613,924],{"class":916},[899,2615,1728],{"class":1467},[899,2617,1582],{"class":916},[899,2619,1487],{"class":1733},[899,2621,1736],{"class":916},[899,2623,1739],{"class":1467},[899,2625,1742],{"class":916},[899,2627,2628,2630,2632,2634,2636,2638,2640,2642,2644,2646,2648,2650,2652,2654],{"class":901,"line":909},[899,2629,1609],{"class":1467},[899,2631,1612],{"class":916},[899,2633,1028],{"class":1471},[899,2635,936],{"class":916},[899,2637,1045],{"class":1471},[899,2639,936],{"class":916},[899,2641,1008],{"class":1471},[899,2643,1625],{"class":916},[899,2645,1628],{"class":1014},[899,2647,1765],{"class":912},[899,2649,917],{"class":916},[899,2651,1770],{"class":912},[899,2653,917],{"class":916},[899,2655,1775],{"class":912},[899,2657,2658,2660,2662,2664],{"class":901,"line":944},[899,2659,1780],{"class":1478},[899,2661,1612],{"class":916},[899,2663,1028],{"class":912},[899,2665,1787],{"class":916},[899,2667,2668],{"class":901,"line":950},[899,2669,1792],{"class":916},[848,2671,1795,2672,1799,2674,1803],{},[862,2673,1798],{},[862,2675,1802],{},[890,2677,2678],{"className":892,"code":1806,"language":894,"meta":895,"style":895},[862,2679,2680,2688,2696,2704,2718,2726,2734,2742,2750,2758,2766],{"__ignoreMap":895},[899,2681,2682,2684,2686],{"class":901,"line":902},[899,2683,1813],{"class":1467},[899,2685,1817],{"class":1816},[899,2687,1742],{"class":916},[899,2689,2690,2692,2694],{"class":901,"line":909},[899,2691,1824],{"class":912},[899,2693,888],{"class":1014},[899,2695,1829],{"class":1816},[899,2697,2698,2700,2702],{"class":901,"line":944},[899,2699,1834],{"class":912},[899,2701,1837],{"class":1014},[899,2703,1840],{"class":1816},[899,2705,2706,2708,2710,2712,2714,2716],{"class":901,"line":950},[899,2707,1845],{"class":912},[899,2709,1837],{"class":1014},[899,2711,1850],{"class":1816},[899,2713,1853],{"class":916},[899,2715,1856],{"class":1014},[899,2717,1840],{"class":1816},[899,2719,2720,2722,2724],{"class":901,"line":956},[899,2721,1863],{"class":912},[899,2723,888],{"class":1014},[899,2725,1840],{"class":1816},[899,2727,2728,2730,2732],{"class":901,"line":1086},[899,2729,1872],{"class":912},[899,2731,888],{"class":1014},[899,2733,1840],{"class":1816},[899,2735,2736,2738,2740],{"class":901,"line":1107},[899,2737,1881],{"class":912},[899,2739,888],{"class":1014},[899,2741,1840],{"class":1816},[899,2743,2744,2746,2748],{"class":901,"line":1127},[899,2745,1890],{"class":912},[899,2747,1837],{"class":1014},[899,2749,1840],{"class":1816},[899,2751,2752,2754,2756],{"class":901,"line":1674},[899,2753,1899],{"class":912},[899,2755,1837],{"class":1014},[899,2757,1840],{"class":1816},[899,2759,2760,2762,2764],{"class":901,"line":1680},[899,2761,1908],{"class":912},[899,2763,1837],{"class":1014},[899,2765,1840],{"class":1816},[899,2767,2768],{"class":901,"line":1915},[899,2769,1130],{"class":916},[848,2771,1920,2772,1923],{},[871,2773,93],{"href":94},[852,2775],{},[855,2777,1929],{"id":1928},[848,2779,1795,2780,1935,2782,1940,2786,1944,2788,1947],{},[862,2781,1934],{},[871,2783,2784],{"href":153},[862,2785,152],{},[862,2787,1943],{},[871,2789,146],{"href":147},[1949,2791,1951],{},{"title":895,"searchDepth":909,"depth":909,"links":2793},[2794,2795,2801,2802],{"id":857,"depth":909,"text":858},{"id":1171,"depth":909,"text":1172,"children":2796},[2797,2798,2799,2800],{"id":1196,"depth":944,"text":1197},{"id":1310,"depth":944,"text":512},{"id":1426,"depth":944,"text":1427},{"id":1440,"depth":944,"text":1441},{"id":1699,"depth":909,"text":1700},{"id":1928,"depth":909,"text":1929},{},{"title":89,"description":1963},1780436290318]