[{"data":1,"prerenderedAt":2785},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fauth-h3client":64,"navigation":217,"navLinks_footer":829,"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf_page":842,"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf_surround":1957,"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf":1960},{"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":97,"body":844,"description":1949,"extension":1950,"icon":1951,"meta":1952,"module":1953,"navigation":8,"path":98,"rawbody":1954,"seo":1955,"stem":99,"__hash__":1956},"docs\u002Fdocs\u002Fauth-h3client\u002F01.essentials\u002F02.csrf.md",{"type":845,"value":846,"toc":1941},"minimark",[847,851,854,859,874,880,891,945,963,977,979,983,999,1024,1053,1069,1171,1173,1177,1210,1365,1367,1373,1395,1501,1504,1579,1588,1681,1701,1860,1862,1866,1937],[848,849,850],"p",{},"The module implements a double-submit cookie pattern with HMAC signing. The server mints a signed cookie on first contact and expects the client to echo the token value back in a request header on every state-changing request. The signature covers the token value, a session identifier, and an expiry timestamp, so the cookie cannot be forged or reused after it expires.",[852,853],"hr",{},[855,856,858],"h2",{"id":857},"cookie-issuance","Cookie issuance",[848,860,861,865,866,869,870,873],{},[862,863,864],"code",{},"generateCsrfCookie"," mints the ",[862,867,868],{},"__Host-csrf"," cookie if it is not already present on the request. It generates a 32-byte random token, creates a signed value from the token with a 30-minute TTL, and sets the cookie with ",[862,871,872],{},"httpOnly: false"," so the browser can read it.",[848,875,876,877],{},"The signed cookie format is: ",[862,878,879],{},"base64(token).base64(session).expiry.hmac",[848,881,882,883,886,887,890],{},"The ",[862,884,885],{},"session"," segment in the signature is the string ",[862,888,889],{},"\"csrf\"",", which is the keyword verified on the server side. This binds the cookie to the CSRF context and prevents signed values from other contexts being submitted as CSRF tokens.",[892,893,898],"pre",{"className":894,"code":895,"language":896,"meta":897,"style":897},"language-ts shiki shiki-themes light-plus light-plus dracula","\u002F\u002F Cookie attributes set by generateCsrfCookie:\n\u002F\u002F Name:     __Host-csrf\n\u002F\u002F HttpOnly: false   (client must read it)\n\u002F\u002F SameSite: Strict\n\u002F\u002F Secure:   true\n\u002F\u002F MaxAge:   1800 (30 minutes)\n\u002F\u002F Path:     \u002F (enforced by __Host- prefix)\n","ts","",[862,899,900,909,915,921,927,933,939],{"__ignoreMap":897},[901,902,905],"span",{"class":903,"line":904},"line",1,[901,906,908],{"class":907},"sghk6","\u002F\u002F Cookie attributes set by generateCsrfCookie:\n",[901,910,912],{"class":903,"line":911},2,[901,913,914],{"class":907},"\u002F\u002F Name:     __Host-csrf\n",[901,916,918],{"class":903,"line":917},3,[901,919,920],{"class":907},"\u002F\u002F HttpOnly: false   (client must read it)\n",[901,922,924],{"class":903,"line":923},4,[901,925,926],{"class":907},"\u002F\u002F SameSite: Strict\n",[901,928,930],{"class":903,"line":929},5,[901,931,932],{"class":907},"\u002F\u002F Secure:   true\n",[901,934,936],{"class":903,"line":935},6,[901,937,938],{"class":907},"\u002F\u002F MaxAge:   1800 (30 minutes)\n",[901,940,942],{"class":903,"line":941},7,[901,943,944],{"class":907},"\u002F\u002F Path:     \u002F (enforced by __Host- prefix)\n",[848,946,882,947,950,951,954,955,958,959,962],{},[862,948,949],{},"__Host-"," prefix requires ",[862,952,953],{},"Secure: true",", ",[862,956,957],{},"Path: \u002F",", and no ",[862,960,961],{},"Domain"," attribute, making the cookie scoped to the exact origin with no subdomain leakage.",[848,964,965,967,968,972,973,976],{},[862,966,864],{}," is part of the global middleware chain wired up in the ",[969,970,971],"a",{"href":177},"H3 or Nitro setup",". When using the Nuxt module with ",[862,974,975],{},"enableMiddleware: true",", it runs automatically on every request and you do not need to call it manually.",[852,978],{},[855,980,982],{"id":981},"cookie-verification","Cookie verification",[848,984,985,988,989,992,993,995,996,998],{},[862,986,987],{},"verifyCsrfCookie"," validates the CSRF cookie and the ",[862,990,991],{},"X-CSRF-Token"," request header. It throws HTTP 403 in three cases: the ",[862,994,868],{}," cookie is missing, the cookie signature or expiry is invalid, or the ",[862,997,991],{}," header value does not match the token stored in the cookie payload.",[892,1000,1002],{"className":894,"code":1001,"language":896,"meta":897,"style":897},"\u002F\u002F Throws 403 with one of these codes:\n\u002F\u002F CSRF_MISSING: cookie not present\n\u002F\u002F CSRF_INVALID: signature check failed or cookie expired\n\u002F\u002F TOKEN_INVALID: header missing or does not match cookie payload\n",[862,1003,1004,1009,1014,1019],{"__ignoreMap":897},[901,1005,1006],{"class":903,"line":904},[901,1007,1008],{"class":907},"\u002F\u002F Throws 403 with one of these codes:\n",[901,1010,1011],{"class":903,"line":911},[901,1012,1013],{"class":907},"\u002F\u002F CSRF_MISSING: cookie not present\n",[901,1015,1016],{"class":903,"line":917},[901,1017,1018],{"class":907},"\u002F\u002F CSRF_INVALID: signature check failed or cookie expired\n",[901,1020,1021],{"class":903,"line":923},[901,1022,1023],{"class":907},"\u002F\u002F TOKEN_INVALID: header missing or does not match cookie payload\n",[848,1025,1026,1027,1029,1030,1033,1034,1037,1038,1041,1042,954,1045,1048,1049,1052],{},"Both the cookie payload and the ",[862,1028,991],{}," header are Base64-encoded. The server decodes both with ",[862,1031,1032],{},"fromB64"," and performs a timing‑safe comparison using ",[862,1035,1036],{},"isSame"," to avoid timing side‑channel attacks. On missing\u002Finvalid values the middleware throws ",[862,1039,1040],{},"403"," with codes ",[862,1043,1044],{},"CSRF_MISSING",[862,1046,1047],{},"CSRF_INVALID",", or ",[862,1050,1051],{},"TOKEN_INVALID",".",[848,1054,1055,1057,1058,954,1061,1064,1065,1068],{},[862,1056,987],{}," is called automatically by ",[862,1059,1060],{},"defineVerifiedCsrfHandler",[862,1062,1063],{},"defineAuthenticatedEventPostHandlers",", and ",[862,1066,1067],{},"defineMfaCodeVerifierHandler",". You only need to call it directly when composing a custom pipeline:",[892,1070,1073],{"className":894,"code":1071,"filename":1072,"language":896,"meta":897,"style":897},"import { defineEventHandler } from 'h3'\n\nexport default defineEventHandler(async (event) => {\n  await verifyCsrfCookie(event)\n  \u002F\u002F Proceed with the handler\n})\n","server\u002Fapi\u002Fcustom.post.ts",[862,1074,1075,1106,1111,1146,1161,1166],{"__ignoreMap":897},[901,1076,1077,1081,1085,1089,1092,1095,1099,1103],{"class":903,"line":904},[901,1078,1080],{"class":1079},"sZ328","import",[901,1082,1084],{"class":1083},"sDd4n"," { ",[901,1086,1088],{"class":1087},"sjsA6","defineEventHandler",[901,1090,1091],{"class":1083}," } ",[901,1093,1094],{"class":1079},"from",[901,1096,1098],{"class":1097},"sFkSl"," '",[901,1100,1102],{"class":1101},"sFB1V","h3",[901,1104,1105],{"class":1097},"'\n",[901,1107,1108],{"class":903,"line":911},[901,1109,1110],{"emptyLinePlaceholder":8},"\n",[901,1112,1113,1116,1119,1123,1126,1130,1133,1137,1140,1143],{"class":903,"line":917},[901,1114,1115],{"class":1079},"export",[901,1117,1118],{"class":1079}," default",[901,1120,1122],{"class":1121},"sHOzp"," defineEventHandler",[901,1124,1125],{"class":1083},"(",[901,1127,1129],{"class":1128},"sl46w","async",[901,1131,1132],{"class":1083}," (",[901,1134,1136],{"class":1135},"sygFZ","event",[901,1138,1139],{"class":1083},") ",[901,1141,1142],{"class":1128},"=>",[901,1144,1145],{"class":1083}," {\n",[901,1147,1148,1151,1154,1156,1158],{"class":903,"line":923},[901,1149,1150],{"class":1079},"  await",[901,1152,1153],{"class":1121}," verifyCsrfCookie",[901,1155,1125],{"class":1083},[901,1157,1136],{"class":1087},[901,1159,1160],{"class":1083},")\n",[901,1162,1163],{"class":903,"line":929},[901,1164,1165],{"class":907},"  \u002F\u002F Proceed with the handler\n",[901,1167,1168],{"class":903,"line":935},[901,1169,1170],{"class":1083},"})\n",[852,1172],{},[855,1174,1176],{"id":1175},"client-side-token-reading","Client-side token reading",[848,1178,1179,1182,1183,1186,1187,1189,1190,1198,1199,1201,1202,1205,1206,1209],{},[862,1180,1181],{},"getCsrfToken()"," is a browser-only helper exported from ",[862,1184,1185],{},"auth-h3client\u002Fclient",". It reads the ",[862,1188,868],{}," cookie from ",[969,1191,1195],{"href":1192,"rel":1193},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FDocument\u002Fcookie",[1194],"nofollow",[862,1196,1197],{},"document.cookie"," and extracts the first segment (the raw token before the first ",[862,1200,1052],{},"). It returns ",[862,1203,1204],{},"undefined"," if the cookie is absent. See ",[969,1207,1208],{"href":165},"Client-side: getCsrfToken"," for the full client-side surface.",[892,1211,1213],{"className":894,"code":1212,"language":896,"meta":897,"style":897},"const token = getCsrfToken()\n\n\nfetch('\u002Fapi\u002Faction', {\n  method: 'POST',\n  headers: {\n    'X-CSRF-Token': token ?? '',\n    'Content-Type': 'application\u002Fjson'\n  },\n  body: JSON.stringify({ ... })\n})\n",[862,1214,1215,1234,1238,1242,1260,1279,1288,1309,1328,1334,1360],{"__ignoreMap":897},[901,1216,1217,1220,1224,1228,1231],{"class":903,"line":904},[901,1218,1219],{"class":1128},"const",[901,1221,1223],{"class":1222},"s3JHE"," token",[901,1225,1227],{"class":1226},"saOXh"," =",[901,1229,1230],{"class":1121}," getCsrfToken",[901,1232,1233],{"class":1083},"()\n",[901,1235,1236],{"class":903,"line":911},[901,1237,1110],{"emptyLinePlaceholder":8},[901,1239,1240],{"class":903,"line":917},[901,1241,1110],{"emptyLinePlaceholder":8},[901,1243,1244,1247,1249,1252,1255,1257],{"class":903,"line":923},[901,1245,1246],{"class":1121},"fetch",[901,1248,1125],{"class":1083},[901,1250,1251],{"class":1097},"'",[901,1253,1254],{"class":1101},"\u002Fapi\u002Faction",[901,1256,1251],{"class":1097},[901,1258,1259],{"class":1083},", {\n",[901,1261,1262,1265,1269,1271,1274,1276],{"class":903,"line":929},[901,1263,1264],{"class":1087},"  method",[901,1266,1268],{"class":1267},"s34zl",":",[901,1270,1098],{"class":1097},[901,1272,1273],{"class":1101},"POST",[901,1275,1251],{"class":1097},[901,1277,1278],{"class":1083},",\n",[901,1280,1281,1284,1286],{"class":903,"line":935},[901,1282,1283],{"class":1087},"  headers",[901,1285,1268],{"class":1267},[901,1287,1145],{"class":1083},[901,1289,1290,1293,1295,1297,1299,1301,1304,1307],{"class":903,"line":941},[901,1291,1292],{"class":1097},"    '",[901,1294,991],{"class":1101},[901,1296,1251],{"class":1097},[901,1298,1268],{"class":1267},[901,1300,1223],{"class":1087},[901,1302,1303],{"class":1226}," ??",[901,1305,1306],{"class":1097}," ''",[901,1308,1278],{"class":1083},[901,1310,1312,1314,1317,1319,1321,1323,1326],{"class":903,"line":1311},8,[901,1313,1292],{"class":1097},[901,1315,1316],{"class":1101},"Content-Type",[901,1318,1251],{"class":1097},[901,1320,1268],{"class":1267},[901,1322,1098],{"class":1097},[901,1324,1325],{"class":1101},"application\u002Fjson",[901,1327,1105],{"class":1097},[901,1329,1331],{"class":903,"line":1330},9,[901,1332,1333],{"class":1083},"  },\n",[901,1335,1337,1340,1342,1346,1348,1351,1354,1357],{"class":903,"line":1336},10,[901,1338,1339],{"class":1087},"  body",[901,1341,1268],{"class":1267},[901,1343,1345],{"class":1344},"sPzPf"," JSON",[901,1347,1052],{"class":1083},[901,1349,1350],{"class":1121},"stringify",[901,1352,1353],{"class":1083},"({ ",[901,1355,1356],{"class":1226},"...",[901,1358,1359],{"class":1083}," })\n",[901,1361,1363],{"class":903,"line":1362},11,[901,1364,1170],{"class":1083},[852,1366],{},[855,1368,1370,1371],{"id":1369},"using-executerequest","Using ",[862,1372,160],{},[848,1374,1375,1377,1378,1380,1381,1383,1384,1386,1387,1390,1391,1394],{},[862,1376,160],{}," is the recommended way to make authenticated requests from Vue components and pages. It is exported from ",[862,1379,1185],{},". On the client it reads the CSRF token via ",[862,1382,1181],{}," and injects it as the ",[862,1385,991],{}," header automatically. On the server it proxies the incoming request headers so cookies are forwarded upstream. It also captures ",[862,1388,1389],{},"Set-Cookie"," headers from the response and forwards them to the browser, handling token rotation transparently. See ",[969,1392,1393],{"href":161},"Client-side: executeRequest"," for full parameter and return-type details.",[892,1396,1399],{"className":894,"code":1397,"filename":1398,"language":896,"meta":897,"style":897},"const result = await executeRequest\u003C{ name: string }>('\u002Fapi\u002Fprofile', 'GET')\n\nif (result.ok) {\n  console.log(result.data.name)\n}\n","composables\u002FuseProfile.ts",[862,1400,1401,1449,1453,1471,1496],{"__ignoreMap":897},[901,1402,1403,1405,1408,1410,1413,1416,1419,1422,1424,1428,1431,1433,1436,1438,1440,1442,1445,1447],{"class":903,"line":904},[901,1404,1219],{"class":1128},[901,1406,1407],{"class":1222}," result",[901,1409,1227],{"class":1226},[901,1411,1412],{"class":1079}," await",[901,1414,1415],{"class":1121}," executeRequest",[901,1417,1418],{"class":1083},"\u003C{ ",[901,1420,1421],{"class":1087},"name",[901,1423,1268],{"class":1226},[901,1425,1427],{"class":1426},"sFs1U"," string",[901,1429,1430],{"class":1083}," }>(",[901,1432,1251],{"class":1097},[901,1434,1435],{"class":1101},"\u002Fapi\u002Fprofile",[901,1437,1251],{"class":1097},[901,1439,954],{"class":1083},[901,1441,1251],{"class":1097},[901,1443,1444],{"class":1101},"GET",[901,1446,1251],{"class":1097},[901,1448,1160],{"class":1083},[901,1450,1451],{"class":903,"line":911},[901,1452,1110],{"emptyLinePlaceholder":8},[901,1454,1455,1458,1460,1463,1465,1468],{"class":903,"line":917},[901,1456,1457],{"class":1079},"if",[901,1459,1132],{"class":1083},[901,1461,1462],{"class":1087},"result",[901,1464,1052],{"class":1083},[901,1466,1467],{"class":1087},"ok",[901,1469,1470],{"class":1083},") {\n",[901,1472,1473,1476,1478,1481,1483,1485,1487,1490,1492,1494],{"class":903,"line":923},[901,1474,1475],{"class":1087},"  console",[901,1477,1052],{"class":1083},[901,1479,1480],{"class":1121},"log",[901,1482,1125],{"class":1083},[901,1484,1462],{"class":1087},[901,1486,1052],{"class":1083},[901,1488,1489],{"class":1087},"data",[901,1491,1052],{"class":1083},[901,1493,1421],{"class":1087},[901,1495,1160],{"class":1083},[901,1497,1498],{"class":903,"line":929},[901,1499,1500],{"class":1083},"}\n",[848,1502,1503],{},"For POST requests:",[892,1505,1507],{"className":894,"code":1506,"language":896,"meta":897,"style":897},"const result = await executeRequest\u003C{ ok: boolean }>(\n  '\u002Fapi\u002Faccount\u002Fsettings',\n  'POST',\n  { theme: 'dark' }\n)\n",[862,1508,1509,1533,1545,1555,1575],{"__ignoreMap":897},[901,1510,1511,1513,1515,1517,1519,1521,1523,1525,1527,1530],{"class":903,"line":904},[901,1512,1219],{"class":1128},[901,1514,1407],{"class":1222},[901,1516,1227],{"class":1226},[901,1518,1412],{"class":1079},[901,1520,1415],{"class":1121},[901,1522,1418],{"class":1083},[901,1524,1467],{"class":1087},[901,1526,1268],{"class":1226},[901,1528,1529],{"class":1426}," boolean",[901,1531,1532],{"class":1083}," }>(\n",[901,1534,1535,1538,1541,1543],{"class":903,"line":911},[901,1536,1537],{"class":1097},"  '",[901,1539,1540],{"class":1101},"\u002Fapi\u002Faccount\u002Fsettings",[901,1542,1251],{"class":1097},[901,1544,1278],{"class":1083},[901,1546,1547,1549,1551,1553],{"class":903,"line":917},[901,1548,1537],{"class":1097},[901,1550,1273],{"class":1101},[901,1552,1251],{"class":1097},[901,1554,1278],{"class":1083},[901,1556,1557,1560,1563,1565,1567,1570,1572],{"class":903,"line":923},[901,1558,1559],{"class":1083},"  { ",[901,1561,1562],{"class":1087},"theme",[901,1564,1268],{"class":1267},[901,1566,1098],{"class":1097},[901,1568,1569],{"class":1101},"dark",[901,1571,1251],{"class":1097},[901,1573,1574],{"class":1083}," }\n",[901,1576,1577],{"class":903,"line":929},[901,1578,1160],{"class":1083},[848,1580,1581,1583,1584,1587],{},[862,1582,160],{}," returns a ",[862,1585,1586],{},"Results\u003CT>"," object:",[892,1589,1591],{"className":894,"code":1590,"language":896,"meta":897,"style":897},"type Results\u003CT> =\n  | { ok: true; data: T; date: string }\n  | { ok: false; reason: string; date: string }\n",[862,1592,1593,1614,1649],{"__ignoreMap":897},[901,1594,1595,1598,1601,1604,1608,1611],{"class":903,"line":904},[901,1596,1597],{"class":1128},"type",[901,1599,1600],{"class":1426}," Results",[901,1602,1603],{"class":1083},"\u003C",[901,1605,1607],{"class":1606},"sW-rI","T",[901,1609,1610],{"class":1083},"> ",[901,1612,1613],{"class":1226},"=\n",[901,1615,1616,1619,1621,1623,1625,1628,1631,1633,1635,1638,1640,1643,1645,1647],{"class":903,"line":911},[901,1617,1618],{"class":1226},"  |",[901,1620,1084],{"class":1083},[901,1622,1467],{"class":1087},[901,1624,1268],{"class":1226},[901,1626,1627],{"class":1426}," true",[901,1629,1630],{"class":1083},"; ",[901,1632,1489],{"class":1087},[901,1634,1268],{"class":1226},[901,1636,1637],{"class":1426}," T",[901,1639,1630],{"class":1083},[901,1641,1642],{"class":1087},"date",[901,1644,1268],{"class":1226},[901,1646,1427],{"class":1426},[901,1648,1574],{"class":1083},[901,1650,1651,1653,1655,1657,1659,1662,1664,1667,1669,1671,1673,1675,1677,1679],{"class":903,"line":917},[901,1652,1618],{"class":1226},[901,1654,1084],{"class":1083},[901,1656,1467],{"class":1087},[901,1658,1268],{"class":1226},[901,1660,1661],{"class":1426}," false",[901,1663,1630],{"class":1083},[901,1665,1666],{"class":1087},"reason",[901,1668,1268],{"class":1226},[901,1670,1427],{"class":1426},[901,1672,1630],{"class":1083},[901,1674,1642],{"class":1087},[901,1676,1268],{"class":1226},[901,1678,1427],{"class":1426},[901,1680,1574],{"class":1083},[848,1682,1683,1684,954,1687,1690,1691,1694,1695,1697,1698,1268],{},"The function accepts optional ",[862,1685,1686],{},"customHeaders",[862,1688,1689],{},"customOptions",", and an ",[862,1692,1693],{},"ApiContext"," object for server-side usage where you want to pass a specific ",[862,1696,1136],{}," or ",[862,1699,1700],{},"fetcher",[892,1702,1705],{"className":894,"code":1703,"filename":1704,"language":896,"meta":897,"style":897},"export default defineAuthenticatedEventHandler(async (event) => {\n  const headers = useRequestHeaders()\n  const fetcher = useRequestFetch()\n\n  const result = await executeRequest\u003CData>(\n    '\u002Fapi\u002Fdownstream',\n    'GET',\n    {},\n    {},\n    {},\n    { headers, event, fetcher }\n  )\n\n  return result\n})\n","server\u002Fapi\u002Fproxy.get.ts",[862,1706,1707,1730,1745,1759,1763,1783,1794,1804,1809,1813,1817,1835,1841,1846,1855],{"__ignoreMap":897},[901,1708,1709,1711,1713,1716,1718,1720,1722,1724,1726,1728],{"class":903,"line":904},[901,1710,1115],{"class":1079},[901,1712,1118],{"class":1079},[901,1714,1715],{"class":1121}," defineAuthenticatedEventHandler",[901,1717,1125],{"class":1083},[901,1719,1129],{"class":1128},[901,1721,1132],{"class":1083},[901,1723,1136],{"class":1135},[901,1725,1139],{"class":1083},[901,1727,1142],{"class":1128},[901,1729,1145],{"class":1083},[901,1731,1732,1735,1738,1740,1743],{"class":903,"line":911},[901,1733,1734],{"class":1128},"  const",[901,1736,1737],{"class":1222}," headers",[901,1739,1227],{"class":1226},[901,1741,1742],{"class":1121}," useRequestHeaders",[901,1744,1233],{"class":1083},[901,1746,1747,1749,1752,1754,1757],{"class":903,"line":917},[901,1748,1734],{"class":1128},[901,1750,1751],{"class":1222}," fetcher",[901,1753,1227],{"class":1226},[901,1755,1756],{"class":1121}," useRequestFetch",[901,1758,1233],{"class":1083},[901,1760,1761],{"class":903,"line":923},[901,1762,1110],{"emptyLinePlaceholder":8},[901,1764,1765,1767,1769,1771,1773,1775,1777,1780],{"class":903,"line":929},[901,1766,1734],{"class":1128},[901,1768,1407],{"class":1222},[901,1770,1227],{"class":1226},[901,1772,1412],{"class":1079},[901,1774,1415],{"class":1121},[901,1776,1603],{"class":1083},[901,1778,1779],{"class":1606},"Data",[901,1781,1782],{"class":1083},">(\n",[901,1784,1785,1787,1790,1792],{"class":903,"line":935},[901,1786,1292],{"class":1097},[901,1788,1789],{"class":1101},"\u002Fapi\u002Fdownstream",[901,1791,1251],{"class":1097},[901,1793,1278],{"class":1083},[901,1795,1796,1798,1800,1802],{"class":903,"line":941},[901,1797,1292],{"class":1097},[901,1799,1444],{"class":1101},[901,1801,1251],{"class":1097},[901,1803,1278],{"class":1083},[901,1805,1806],{"class":903,"line":1311},[901,1807,1808],{"class":1083},"    {},\n",[901,1810,1811],{"class":903,"line":1330},[901,1812,1808],{"class":1083},[901,1814,1815],{"class":903,"line":1336},[901,1816,1808],{"class":1083},[901,1818,1819,1822,1825,1827,1829,1831,1833],{"class":903,"line":1362},[901,1820,1821],{"class":1083},"    { ",[901,1823,1824],{"class":1087},"headers",[901,1826,954],{"class":1083},[901,1828,1136],{"class":1087},[901,1830,954],{"class":1083},[901,1832,1700],{"class":1087},[901,1834,1574],{"class":1083},[901,1836,1838],{"class":903,"line":1837},12,[901,1839,1840],{"class":1083},"  )\n",[901,1842,1844],{"class":903,"line":1843},13,[901,1845,1110],{"emptyLinePlaceholder":8},[901,1847,1849,1852],{"class":903,"line":1848},14,[901,1850,1851],{"class":1079},"  return",[901,1853,1854],{"class":1087}," result\n",[901,1856,1858],{"class":903,"line":1857},15,[901,1859,1170],{"class":1083},[852,1861],{},[855,1863,1865],{"id":1864},"summary","Summary",[1867,1868,1869,1885],"table",{},[1870,1871,1872],"thead",{},[1873,1874,1875,1879,1882],"tr",{},[1876,1877,1878],"th",{},"Step",[1876,1880,1881],{},"Function",[1876,1883,1884],{},"Where it runs",[1886,1887,1888,1901,1913,1925],"tbody",{},[1873,1889,1890,1894,1898],{},[1891,1892,1893],"td",{},"Issue cookie",[1891,1895,1896],{},[862,1897,864],{},[1891,1899,1900],{},"Server middleware (automatic)",[1873,1902,1903,1906,1910],{},[1891,1904,1905],{},"Read token",[1891,1907,1908],{},[862,1909,1181],{},[1891,1911,1912],{},"Browser (client composable)",[1873,1914,1915,1918,1922],{},[1891,1916,1917],{},"Inject header",[1891,1919,1920],{},[862,1921,160],{},[1891,1923,1924],{},"Automatic in client context",[1873,1926,1927,1930,1934],{},[1891,1928,1929],{},"Verify cookie + header",[1891,1931,1932],{},[862,1933,987],{},[1891,1935,1936],{},"Server, inside protected wrappers",[1938,1939,1940],"style",{},"html pre.shiki code .sghk6, html code.shiki .sghk6{--shiki-light:#008000;--shiki-default:#008000;--shiki-dark:#6272A4}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 .sZ328, html code.shiki .sZ328{--shiki-light:#AF00DB;--shiki-default:#AF00DB;--shiki-dark:#FF79C6}html pre.shiki code .sDd4n, html code.shiki .sDd4n{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#F8F8F2}html pre.shiki code .sjsA6, html code.shiki .sjsA6{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#F8F8F2}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 pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}html pre.shiki code .sl46w, html code.shiki .sl46w{--shiki-light:#0000FF;--shiki-default:#0000FF;--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 .s3JHE, html code.shiki .s3JHE{--shiki-light:#0070C1;--shiki-default:#0070C1;--shiki-dark:#F8F8F2}html pre.shiki code .saOXh, html code.shiki .saOXh{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#FF79C6}html pre.shiki code .s34zl, html code.shiki .s34zl{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#FF79C6}html pre.shiki code .sPzPf, html code.shiki .sPzPf{--shiki-light:#0070C1;--shiki-default:#0070C1;--shiki-dark:#BD93F9}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}html pre.shiki code .sW-rI, html code.shiki .sW-rI{--shiki-light:#267F99;--shiki-light-font-style:inherit;--shiki-default:#267F99;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}",{"title":897,"searchDepth":911,"depth":911,"links":1942},[1943,1944,1945,1946,1948],{"id":857,"depth":911,"text":858},{"id":981,"depth":911,"text":982},{"id":1175,"depth":911,"text":1176},{"id":1369,"depth":911,"text":1947},"Using executeRequest",{"id":1864,"depth":911,"text":1865},"How the signed CSRF cookie is issued, validated, and consumed by client composables, with the full verification chain from cookie to request header.","md","i-lucide-shield-x",{},null,"---\ntitle: CSRF Protection\ndescription: How the signed CSRF cookie is issued, validated, and consumed by client composables, with the full verification chain from cookie to request header.\nicon: i-lucide-shield-x\n---\n\nThe module implements a double-submit cookie pattern with HMAC signing. The server mints a signed cookie on first contact and expects the client to echo the token value back in a request header on every state-changing request. The signature covers the token value, a session identifier, and an expiry timestamp, so the cookie cannot be forged or reused after it expires.\n\n---\n\n## Cookie issuance\n\n`generateCsrfCookie` mints the `__Host-csrf` cookie if it is not already present on the request. It generates a 32-byte random token, creates a signed value from the token with a 30-minute TTL, and sets the cookie with `httpOnly: false` so the browser can read it.\n\nThe signed cookie format is: `base64(token).base64(session).expiry.hmac`\n\nThe `session` segment in the signature is the string `\"csrf\"`, which is the keyword verified on the server side. This binds the cookie to the CSRF context and prevents signed values from other contexts being submitted as CSRF tokens.\n\n```ts\n\u002F\u002F Cookie attributes set by generateCsrfCookie:\n\u002F\u002F Name:     __Host-csrf\n\u002F\u002F HttpOnly: false   (client must read it)\n\u002F\u002F SameSite: Strict\n\u002F\u002F Secure:   true\n\u002F\u002F MaxAge:   1800 (30 minutes)\n\u002F\u002F Path:     \u002F (enforced by __Host- prefix)\n```\n\nThe `__Host-` prefix requires `Secure: true`, `Path: \u002F`, and no `Domain` attribute, making the cookie scoped to the exact origin with no subdomain leakage.\n\n`generateCsrfCookie` is part of the global middleware chain wired up in the [H3 or Nitro setup](\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro). When using the Nuxt module with `enableMiddleware: true`, it runs automatically on every request and you do not need to call it manually.\n\n---\n\n## Cookie verification\n\n`verifyCsrfCookie` validates the CSRF cookie and the `X-CSRF-Token` request header. It throws HTTP 403 in three cases: the `__Host-csrf` cookie is missing, the cookie signature or expiry is invalid, or the `X-CSRF-Token` header value does not match the token stored in the cookie payload.\n\n```ts\n\u002F\u002F Throws 403 with one of these codes:\n\u002F\u002F CSRF_MISSING: cookie not present\n\u002F\u002F CSRF_INVALID: signature check failed or cookie expired\n\u002F\u002F TOKEN_INVALID: header missing or does not match cookie payload\n```\n\nBoth the cookie payload and the `X-CSRF-Token` header are Base64-encoded. The server decodes both with `fromB64` and performs a timing‑safe comparison using `isSame` to avoid timing side‑channel attacks. On missing\u002Finvalid values the middleware throws `403` with codes `CSRF_MISSING`, `CSRF_INVALID`, or `TOKEN_INVALID`.\n\n`verifyCsrfCookie` is called automatically by `defineVerifiedCsrfHandler`, `defineAuthenticatedEventPostHandlers`, and `defineMfaCodeVerifierHandler`. You only need to call it directly when composing a custom pipeline:\n\n```ts [server\u002Fapi\u002Fcustom.post.ts]\nimport { defineEventHandler } from 'h3'\n\nexport default defineEventHandler(async (event) => {\n  await verifyCsrfCookie(event)\n  \u002F\u002F Proceed with the handler\n})\n```\n\n---\n\n## Client-side token reading\n\n`getCsrfToken()` is a browser-only helper exported from `auth-h3client\u002Fclient`. It reads the `__Host-csrf` cookie from [`document.cookie`](https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FDocument\u002Fcookie) and extracts the first segment (the raw token before the first `.`). It returns `undefined` if the cookie is absent. See [Client-side: getCsrfToken](\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fget-csrf-token) for the full client-side surface.\n\n```ts\nconst token = getCsrfToken()\n\n\nfetch('\u002Fapi\u002Faction', {\n  method: 'POST',\n  headers: {\n    'X-CSRF-Token': token ?? '',\n    'Content-Type': 'application\u002Fjson'\n  },\n  body: JSON.stringify({ ... })\n})\n```\n\n---\n\n## Using `executeRequest`\n\n`executeRequest` is the recommended way to make authenticated requests from Vue components and pages. It is exported from `auth-h3client\u002Fclient`. On the client it reads the CSRF token via `getCsrfToken()` and injects it as the `X-CSRF-Token` header automatically. On the server it proxies the incoming request headers so cookies are forwarded upstream. It also captures `Set-Cookie` headers from the response and forwards them to the browser, handling token rotation transparently. See [Client-side: executeRequest](\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fexecute-request) for full parameter and return-type details.\n\n```ts [composables\u002FuseProfile.ts]\nconst result = await executeRequest\u003C{ name: string }>('\u002Fapi\u002Fprofile', 'GET')\n\nif (result.ok) {\n  console.log(result.data.name)\n}\n```\n\nFor POST requests:\n\n```ts\nconst result = await executeRequest\u003C{ ok: boolean }>(\n  '\u002Fapi\u002Faccount\u002Fsettings',\n  'POST',\n  { theme: 'dark' }\n)\n```\n\n`executeRequest` returns a `Results\u003CT>` object:\n\n```ts\ntype Results\u003CT> =\n  | { ok: true; data: T; date: string }\n  | { ok: false; reason: string; date: string }\n```\n\nThe function accepts optional `customHeaders`, `customOptions`, and an `ApiContext` object for server-side usage where you want to pass a specific `event` or `fetcher`:\n\n```ts [server\u002Fapi\u002Fproxy.get.ts]\nexport default defineAuthenticatedEventHandler(async (event) => {\n  const headers = useRequestHeaders()\n  const fetcher = useRequestFetch()\n\n  const result = await executeRequest\u003CData>(\n    '\u002Fapi\u002Fdownstream',\n    'GET',\n    {},\n    {},\n    {},\n    { headers, event, fetcher }\n  )\n\n  return result\n})\n```\n\n---\n\n## Summary\n\n| Step | Function | Where it runs |\n|---|---|---|\n| Issue cookie | `generateCsrfCookie` | Server middleware (automatic) |\n| Read token | `getCsrfToken()` | Browser (client composable) |\n| Inject header | `executeRequest` | Automatic in client context |\n| Verify cookie + header | `verifyCsrfCookie` | Server, inside protected wrappers |",{"title":97,"description":1949},"xoDlosIbzUL7n9GbFNib0EFgJ3djoyexifc2C2QRKKI",[1958,1959],{"title":93,"path":94,"stem":95,"children":-1},{"title":101,"path":102,"stem":103,"children":-1},{"id":843,"title":97,"body":1961,"description":1949,"extension":1950,"icon":1951,"meta":2783,"module":1953,"navigation":8,"path":98,"rawbody":1954,"seo":2784,"stem":99,"__hash__":1956},{"type":845,"value":1962,"toc":2776},[1963,1965,1967,1969,1977,1981,1987,2019,2029,2037,2039,2041,2051,2071,2087,2097,2165,2167,2169,2188,2308,2310,2314,2328,2414,2416,2482,2488,2566,2578,2716,2718,2720,2774],[848,1964,850],{},[852,1966],{},[855,1968,858],{"id":857},[848,1970,1971,865,1973,869,1975,873],{},[862,1972,864],{},[862,1974,868],{},[862,1976,872],{},[848,1978,876,1979],{},[862,1980,879],{},[848,1982,882,1983,886,1985,890],{},[862,1984,885],{},[862,1986,889],{},[892,1988,1989],{"className":894,"code":895,"language":896,"meta":897,"style":897},[862,1990,1991,1995,1999,2003,2007,2011,2015],{"__ignoreMap":897},[901,1992,1993],{"class":903,"line":904},[901,1994,908],{"class":907},[901,1996,1997],{"class":903,"line":911},[901,1998,914],{"class":907},[901,2000,2001],{"class":903,"line":917},[901,2002,920],{"class":907},[901,2004,2005],{"class":903,"line":923},[901,2006,926],{"class":907},[901,2008,2009],{"class":903,"line":929},[901,2010,932],{"class":907},[901,2012,2013],{"class":903,"line":935},[901,2014,938],{"class":907},[901,2016,2017],{"class":903,"line":941},[901,2018,944],{"class":907},[848,2020,882,2021,950,2023,954,2025,958,2027,962],{},[862,2022,949],{},[862,2024,953],{},[862,2026,957],{},[862,2028,961],{},[848,2030,2031,967,2033,972,2035,976],{},[862,2032,864],{},[969,2034,971],{"href":177},[862,2036,975],{},[852,2038],{},[855,2040,982],{"id":981},[848,2042,2043,988,2045,992,2047,995,2049,998],{},[862,2044,987],{},[862,2046,991],{},[862,2048,868],{},[862,2050,991],{},[892,2052,2053],{"className":894,"code":1001,"language":896,"meta":897,"style":897},[862,2054,2055,2059,2063,2067],{"__ignoreMap":897},[901,2056,2057],{"class":903,"line":904},[901,2058,1008],{"class":907},[901,2060,2061],{"class":903,"line":911},[901,2062,1013],{"class":907},[901,2064,2065],{"class":903,"line":917},[901,2066,1018],{"class":907},[901,2068,2069],{"class":903,"line":923},[901,2070,1023],{"class":907},[848,2072,1026,2073,1029,2075,1033,2077,1037,2079,1041,2081,954,2083,1048,2085,1052],{},[862,2074,991],{},[862,2076,1032],{},[862,2078,1036],{},[862,2080,1040],{},[862,2082,1044],{},[862,2084,1047],{},[862,2086,1051],{},[848,2088,2089,1057,2091,954,2093,1064,2095,1068],{},[862,2090,987],{},[862,2092,1060],{},[862,2094,1063],{},[862,2096,1067],{},[892,2098,2099],{"className":894,"code":1071,"filename":1072,"language":896,"meta":897,"style":897},[862,2100,2101,2119,2123,2145,2157,2161],{"__ignoreMap":897},[901,2102,2103,2105,2107,2109,2111,2113,2115,2117],{"class":903,"line":904},[901,2104,1080],{"class":1079},[901,2106,1084],{"class":1083},[901,2108,1088],{"class":1087},[901,2110,1091],{"class":1083},[901,2112,1094],{"class":1079},[901,2114,1098],{"class":1097},[901,2116,1102],{"class":1101},[901,2118,1105],{"class":1097},[901,2120,2121],{"class":903,"line":911},[901,2122,1110],{"emptyLinePlaceholder":8},[901,2124,2125,2127,2129,2131,2133,2135,2137,2139,2141,2143],{"class":903,"line":917},[901,2126,1115],{"class":1079},[901,2128,1118],{"class":1079},[901,2130,1122],{"class":1121},[901,2132,1125],{"class":1083},[901,2134,1129],{"class":1128},[901,2136,1132],{"class":1083},[901,2138,1136],{"class":1135},[901,2140,1139],{"class":1083},[901,2142,1142],{"class":1128},[901,2144,1145],{"class":1083},[901,2146,2147,2149,2151,2153,2155],{"class":903,"line":923},[901,2148,1150],{"class":1079},[901,2150,1153],{"class":1121},[901,2152,1125],{"class":1083},[901,2154,1136],{"class":1087},[901,2156,1160],{"class":1083},[901,2158,2159],{"class":903,"line":929},[901,2160,1165],{"class":907},[901,2162,2163],{"class":903,"line":935},[901,2164,1170],{"class":1083},[852,2166],{},[855,2168,1176],{"id":1175},[848,2170,2171,1182,2173,1186,2175,1189,2177,1198,2182,1201,2184,1205,2186,1209],{},[862,2172,1181],{},[862,2174,1185],{},[862,2176,868],{},[969,2178,2180],{"href":1192,"rel":2179},[1194],[862,2181,1197],{},[862,2183,1052],{},[862,2185,1204],{},[969,2187,1208],{"href":165},[892,2189,2190],{"className":894,"code":1212,"language":896,"meta":897,"style":897},[862,2191,2192,2204,2208,2212,2226,2240,2248,2266,2282,2286,2304],{"__ignoreMap":897},[901,2193,2194,2196,2198,2200,2202],{"class":903,"line":904},[901,2195,1219],{"class":1128},[901,2197,1223],{"class":1222},[901,2199,1227],{"class":1226},[901,2201,1230],{"class":1121},[901,2203,1233],{"class":1083},[901,2205,2206],{"class":903,"line":911},[901,2207,1110],{"emptyLinePlaceholder":8},[901,2209,2210],{"class":903,"line":917},[901,2211,1110],{"emptyLinePlaceholder":8},[901,2213,2214,2216,2218,2220,2222,2224],{"class":903,"line":923},[901,2215,1246],{"class":1121},[901,2217,1125],{"class":1083},[901,2219,1251],{"class":1097},[901,2221,1254],{"class":1101},[901,2223,1251],{"class":1097},[901,2225,1259],{"class":1083},[901,2227,2228,2230,2232,2234,2236,2238],{"class":903,"line":929},[901,2229,1264],{"class":1087},[901,2231,1268],{"class":1267},[901,2233,1098],{"class":1097},[901,2235,1273],{"class":1101},[901,2237,1251],{"class":1097},[901,2239,1278],{"class":1083},[901,2241,2242,2244,2246],{"class":903,"line":935},[901,2243,1283],{"class":1087},[901,2245,1268],{"class":1267},[901,2247,1145],{"class":1083},[901,2249,2250,2252,2254,2256,2258,2260,2262,2264],{"class":903,"line":941},[901,2251,1292],{"class":1097},[901,2253,991],{"class":1101},[901,2255,1251],{"class":1097},[901,2257,1268],{"class":1267},[901,2259,1223],{"class":1087},[901,2261,1303],{"class":1226},[901,2263,1306],{"class":1097},[901,2265,1278],{"class":1083},[901,2267,2268,2270,2272,2274,2276,2278,2280],{"class":903,"line":1311},[901,2269,1292],{"class":1097},[901,2271,1316],{"class":1101},[901,2273,1251],{"class":1097},[901,2275,1268],{"class":1267},[901,2277,1098],{"class":1097},[901,2279,1325],{"class":1101},[901,2281,1105],{"class":1097},[901,2283,2284],{"class":903,"line":1330},[901,2285,1333],{"class":1083},[901,2287,2288,2290,2292,2294,2296,2298,2300,2302],{"class":903,"line":1336},[901,2289,1339],{"class":1087},[901,2291,1268],{"class":1267},[901,2293,1345],{"class":1344},[901,2295,1052],{"class":1083},[901,2297,1350],{"class":1121},[901,2299,1353],{"class":1083},[901,2301,1356],{"class":1226},[901,2303,1359],{"class":1083},[901,2305,2306],{"class":903,"line":1362},[901,2307,1170],{"class":1083},[852,2309],{},[855,2311,1370,2312],{"id":1369},[862,2313,160],{},[848,2315,2316,1377,2318,1380,2320,1383,2322,1386,2324,1390,2326,1394],{},[862,2317,160],{},[862,2319,1185],{},[862,2321,1181],{},[862,2323,991],{},[862,2325,1389],{},[969,2327,1393],{"href":161},[892,2329,2330],{"className":894,"code":1397,"filename":1398,"language":896,"meta":897,"style":897},[862,2331,2332,2370,2374,2388,2410],{"__ignoreMap":897},[901,2333,2334,2336,2338,2340,2342,2344,2346,2348,2350,2352,2354,2356,2358,2360,2362,2364,2366,2368],{"class":903,"line":904},[901,2335,1219],{"class":1128},[901,2337,1407],{"class":1222},[901,2339,1227],{"class":1226},[901,2341,1412],{"class":1079},[901,2343,1415],{"class":1121},[901,2345,1418],{"class":1083},[901,2347,1421],{"class":1087},[901,2349,1268],{"class":1226},[901,2351,1427],{"class":1426},[901,2353,1430],{"class":1083},[901,2355,1251],{"class":1097},[901,2357,1435],{"class":1101},[901,2359,1251],{"class":1097},[901,2361,954],{"class":1083},[901,2363,1251],{"class":1097},[901,2365,1444],{"class":1101},[901,2367,1251],{"class":1097},[901,2369,1160],{"class":1083},[901,2371,2372],{"class":903,"line":911},[901,2373,1110],{"emptyLinePlaceholder":8},[901,2375,2376,2378,2380,2382,2384,2386],{"class":903,"line":917},[901,2377,1457],{"class":1079},[901,2379,1132],{"class":1083},[901,2381,1462],{"class":1087},[901,2383,1052],{"class":1083},[901,2385,1467],{"class":1087},[901,2387,1470],{"class":1083},[901,2389,2390,2392,2394,2396,2398,2400,2402,2404,2406,2408],{"class":903,"line":923},[901,2391,1475],{"class":1087},[901,2393,1052],{"class":1083},[901,2395,1480],{"class":1121},[901,2397,1125],{"class":1083},[901,2399,1462],{"class":1087},[901,2401,1052],{"class":1083},[901,2403,1489],{"class":1087},[901,2405,1052],{"class":1083},[901,2407,1421],{"class":1087},[901,2409,1160],{"class":1083},[901,2411,2412],{"class":903,"line":929},[901,2413,1500],{"class":1083},[848,2415,1503],{},[892,2417,2418],{"className":894,"code":1506,"language":896,"meta":897,"style":897},[862,2419,2420,2442,2452,2462,2478],{"__ignoreMap":897},[901,2421,2422,2424,2426,2428,2430,2432,2434,2436,2438,2440],{"class":903,"line":904},[901,2423,1219],{"class":1128},[901,2425,1407],{"class":1222},[901,2427,1227],{"class":1226},[901,2429,1412],{"class":1079},[901,2431,1415],{"class":1121},[901,2433,1418],{"class":1083},[901,2435,1467],{"class":1087},[901,2437,1268],{"class":1226},[901,2439,1529],{"class":1426},[901,2441,1532],{"class":1083},[901,2443,2444,2446,2448,2450],{"class":903,"line":911},[901,2445,1537],{"class":1097},[901,2447,1540],{"class":1101},[901,2449,1251],{"class":1097},[901,2451,1278],{"class":1083},[901,2453,2454,2456,2458,2460],{"class":903,"line":917},[901,2455,1537],{"class":1097},[901,2457,1273],{"class":1101},[901,2459,1251],{"class":1097},[901,2461,1278],{"class":1083},[901,2463,2464,2466,2468,2470,2472,2474,2476],{"class":903,"line":923},[901,2465,1559],{"class":1083},[901,2467,1562],{"class":1087},[901,2469,1268],{"class":1267},[901,2471,1098],{"class":1097},[901,2473,1569],{"class":1101},[901,2475,1251],{"class":1097},[901,2477,1574],{"class":1083},[901,2479,2480],{"class":903,"line":929},[901,2481,1160],{"class":1083},[848,2483,2484,1583,2486,1587],{},[862,2485,160],{},[862,2487,1586],{},[892,2489,2490],{"className":894,"code":1590,"language":896,"meta":897,"style":897},[862,2491,2492,2506,2536],{"__ignoreMap":897},[901,2493,2494,2496,2498,2500,2502,2504],{"class":903,"line":904},[901,2495,1597],{"class":1128},[901,2497,1600],{"class":1426},[901,2499,1603],{"class":1083},[901,2501,1607],{"class":1606},[901,2503,1610],{"class":1083},[901,2505,1613],{"class":1226},[901,2507,2508,2510,2512,2514,2516,2518,2520,2522,2524,2526,2528,2530,2532,2534],{"class":903,"line":911},[901,2509,1618],{"class":1226},[901,2511,1084],{"class":1083},[901,2513,1467],{"class":1087},[901,2515,1268],{"class":1226},[901,2517,1627],{"class":1426},[901,2519,1630],{"class":1083},[901,2521,1489],{"class":1087},[901,2523,1268],{"class":1226},[901,2525,1637],{"class":1426},[901,2527,1630],{"class":1083},[901,2529,1642],{"class":1087},[901,2531,1268],{"class":1226},[901,2533,1427],{"class":1426},[901,2535,1574],{"class":1083},[901,2537,2538,2540,2542,2544,2546,2548,2550,2552,2554,2556,2558,2560,2562,2564],{"class":903,"line":917},[901,2539,1618],{"class":1226},[901,2541,1084],{"class":1083},[901,2543,1467],{"class":1087},[901,2545,1268],{"class":1226},[901,2547,1661],{"class":1426},[901,2549,1630],{"class":1083},[901,2551,1666],{"class":1087},[901,2553,1268],{"class":1226},[901,2555,1427],{"class":1426},[901,2557,1630],{"class":1083},[901,2559,1642],{"class":1087},[901,2561,1268],{"class":1226},[901,2563,1427],{"class":1426},[901,2565,1574],{"class":1083},[848,2567,1683,2568,954,2570,1690,2572,1694,2574,1697,2576,1268],{},[862,2569,1686],{},[862,2571,1689],{},[862,2573,1693],{},[862,2575,1136],{},[862,2577,1700],{},[892,2579,2580],{"className":894,"code":1703,"filename":1704,"language":896,"meta":897,"style":897},[862,2581,2582,2604,2616,2628,2632,2650,2660,2670,2674,2678,2682,2698,2702,2706,2712],{"__ignoreMap":897},[901,2583,2584,2586,2588,2590,2592,2594,2596,2598,2600,2602],{"class":903,"line":904},[901,2585,1115],{"class":1079},[901,2587,1118],{"class":1079},[901,2589,1715],{"class":1121},[901,2591,1125],{"class":1083},[901,2593,1129],{"class":1128},[901,2595,1132],{"class":1083},[901,2597,1136],{"class":1135},[901,2599,1139],{"class":1083},[901,2601,1142],{"class":1128},[901,2603,1145],{"class":1083},[901,2605,2606,2608,2610,2612,2614],{"class":903,"line":911},[901,2607,1734],{"class":1128},[901,2609,1737],{"class":1222},[901,2611,1227],{"class":1226},[901,2613,1742],{"class":1121},[901,2615,1233],{"class":1083},[901,2617,2618,2620,2622,2624,2626],{"class":903,"line":917},[901,2619,1734],{"class":1128},[901,2621,1751],{"class":1222},[901,2623,1227],{"class":1226},[901,2625,1756],{"class":1121},[901,2627,1233],{"class":1083},[901,2629,2630],{"class":903,"line":923},[901,2631,1110],{"emptyLinePlaceholder":8},[901,2633,2634,2636,2638,2640,2642,2644,2646,2648],{"class":903,"line":929},[901,2635,1734],{"class":1128},[901,2637,1407],{"class":1222},[901,2639,1227],{"class":1226},[901,2641,1412],{"class":1079},[901,2643,1415],{"class":1121},[901,2645,1603],{"class":1083},[901,2647,1779],{"class":1606},[901,2649,1782],{"class":1083},[901,2651,2652,2654,2656,2658],{"class":903,"line":935},[901,2653,1292],{"class":1097},[901,2655,1789],{"class":1101},[901,2657,1251],{"class":1097},[901,2659,1278],{"class":1083},[901,2661,2662,2664,2666,2668],{"class":903,"line":941},[901,2663,1292],{"class":1097},[901,2665,1444],{"class":1101},[901,2667,1251],{"class":1097},[901,2669,1278],{"class":1083},[901,2671,2672],{"class":903,"line":1311},[901,2673,1808],{"class":1083},[901,2675,2676],{"class":903,"line":1330},[901,2677,1808],{"class":1083},[901,2679,2680],{"class":903,"line":1336},[901,2681,1808],{"class":1083},[901,2683,2684,2686,2688,2690,2692,2694,2696],{"class":903,"line":1362},[901,2685,1821],{"class":1083},[901,2687,1824],{"class":1087},[901,2689,954],{"class":1083},[901,2691,1136],{"class":1087},[901,2693,954],{"class":1083},[901,2695,1700],{"class":1087},[901,2697,1574],{"class":1083},[901,2699,2700],{"class":903,"line":1837},[901,2701,1840],{"class":1083},[901,2703,2704],{"class":903,"line":1843},[901,2705,1110],{"emptyLinePlaceholder":8},[901,2707,2708,2710],{"class":903,"line":1848},[901,2709,1851],{"class":1079},[901,2711,1854],{"class":1087},[901,2713,2714],{"class":903,"line":1857},[901,2715,1170],{"class":1083},[852,2717],{},[855,2719,1865],{"id":1864},[1867,2721,2722,2732],{},[1870,2723,2724],{},[1873,2725,2726,2728,2730],{},[1876,2727,1878],{},[1876,2729,1881],{},[1876,2731,1884],{},[1886,2733,2734,2744,2754,2764],{},[1873,2735,2736,2738,2742],{},[1891,2737,1893],{},[1891,2739,2740],{},[862,2741,864],{},[1891,2743,1900],{},[1873,2745,2746,2748,2752],{},[1891,2747,1905],{},[1891,2749,2750],{},[862,2751,1181],{},[1891,2753,1912],{},[1873,2755,2756,2758,2762],{},[1891,2757,1917],{},[1891,2759,2760],{},[862,2761,160],{},[1891,2763,1924],{},[1873,2765,2766,2768,2772],{},[1891,2767,1929],{},[1891,2769,2770],{},[862,2771,987],{},[1891,2773,1936],{},[1938,2775,1940],{},{"title":897,"searchDepth":911,"depth":911,"links":2777},[2778,2779,2780,2781,2782],{"id":857,"depth":911,"text":858},{"id":981,"depth":911,"text":982},{"id":1175,"depth":911,"text":1176},{"id":1369,"depth":911,"text":1947},{"id":1864,"depth":911,"text":1865},{},{"title":97,"description":1949},1780436290772]