[{"data":1,"prerenderedAt":2249},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fauth-h3client":64,"navigation":217,"navLinks_footer":829,"\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls_page":842,"\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls_surround":1661,"\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls":1664},{"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":188,"body":844,"description":1653,"extension":1654,"icon":1655,"meta":1656,"module":1657,"navigation":8,"path":189,"rawbody":1658,"seo":1659,"stem":190,"__hash__":1660},"docs\u002Fdocs\u002Fauth-h3client\u002F05.guides\u002Fmtls.md",{"type":845,"value":846,"toc":1647},"minimark",[847,851,871,874,879,882,895,898,1102,1105,1113,1116,1122,1124,1127,1142,1419,1464,1466,1470,1480,1551,1562,1564,1568,1571,1614,1617,1626,1643],[848,849,850],"p",{},"Mutual TLS (mTLS) adds client certificate authentication to every connection between the module and the IAM service. The server verifies that the client presents a certificate signed by the trusted CA, and the client verifies the server certificate against the same CA. This prevents unauthorized services from calling the IAM service even if they know the HMAC secret.",[848,852,853,854,861,862,866,867,870],{},"The module uses ",[855,856,860],"a",{"href":857,"rel":858},"https:\u002F\u002Fundici.nodejs.org\u002F",[859],"nofollow","Undici"," as the HTTP client. When SSL is enabled, ",[863,864,865],"code",{},"getAuthAgent"," builds an Undici ",[863,868,869],{},"Agent"," configured with the certificate bundle and returns it for all outbound connections.",[872,873],"hr",{},[875,876,878],"h2",{"id":877},"certificate-setup","Certificate setup",[848,880,881],{},"You need three files:",[883,884,885,889,892],"ul",{},[886,887,888],"li",{},"A CA certificate (the root certificate that signs both the server and client certificates)",[886,890,891],{},"A client certificate signed by the CA",[886,893,894],{},"The private key corresponding to the client certificate",[848,896,897],{},"A minimal setup using OpenSSL:",[899,900,906],"pre",{"className":901,"code":902,"filename":903,"language":904,"meta":905,"style":905},"language-bash shiki shiki-themes light-plus light-plus dracula","# Generate a CA key and self-signed certificate\nopenssl genrsa -out ca.key 4096\nopenssl req -new -x509 -days 3650 -key ca.key -out ca.crt \\\n  -subj \"\u002FCN=Internal CA\"\n\n# Generate a client key and certificate signing request\nopenssl genrsa -out client.key 4096\nopenssl req -new -key client.key -out client.csr \\\n  -subj \"\u002FCN=nuxt-gateway\"\n\n# Sign the client certificate with the CA\nopenssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key \\\n  -CAcreateserial -out client.crt\n","Terminal","bash","",[863,907,908,917,939,973,989,995,1001,1015,1035,1047,1052,1058,1091],{"__ignoreMap":905},[909,910,913],"span",{"class":911,"line":912},"line",1,[909,914,916],{"class":915},"sghk6","# Generate a CA key and self-signed certificate\n",[909,918,920,924,928,932,935],{"class":911,"line":919},2,[909,921,923],{"class":922},"sHOzp","openssl",[909,925,927],{"class":926},"sFB1V"," genrsa",[909,929,931],{"class":930},"sjR7W"," -out",[909,933,934],{"class":926}," ca.key",[909,936,938],{"class":937},"spgvN"," 4096\n",[909,940,942,944,947,950,953,956,959,962,964,966,969],{"class":911,"line":941},3,[909,943,923],{"class":922},[909,945,946],{"class":926}," req",[909,948,949],{"class":930}," -new",[909,951,952],{"class":930}," -x509",[909,954,955],{"class":930}," -days",[909,957,958],{"class":937}," 3650",[909,960,961],{"class":930}," -key",[909,963,934],{"class":926},[909,965,931],{"class":930},[909,967,968],{"class":926}," ca.crt",[909,970,972],{"class":971},"st6lo"," \\\n",[909,974,976,979,983,986],{"class":911,"line":975},4,[909,977,978],{"class":930},"  -subj",[909,980,982],{"class":981},"sFkSl"," \"",[909,984,985],{"class":926},"\u002FCN=Internal CA",[909,987,988],{"class":981},"\"\n",[909,990,992],{"class":911,"line":991},5,[909,993,994],{"emptyLinePlaceholder":8},"\n",[909,996,998],{"class":911,"line":997},6,[909,999,1000],{"class":915},"# Generate a client key and certificate signing request\n",[909,1002,1004,1006,1008,1010,1013],{"class":911,"line":1003},7,[909,1005,923],{"class":922},[909,1007,927],{"class":926},[909,1009,931],{"class":930},[909,1011,1012],{"class":926}," client.key",[909,1014,938],{"class":937},[909,1016,1018,1020,1022,1024,1026,1028,1030,1033],{"class":911,"line":1017},8,[909,1019,923],{"class":922},[909,1021,946],{"class":926},[909,1023,949],{"class":930},[909,1025,961],{"class":930},[909,1027,1012],{"class":926},[909,1029,931],{"class":930},[909,1031,1032],{"class":926}," client.csr",[909,1034,972],{"class":971},[909,1036,1038,1040,1042,1045],{"class":911,"line":1037},9,[909,1039,978],{"class":930},[909,1041,982],{"class":981},[909,1043,1044],{"class":926},"\u002FCN=nuxt-gateway",[909,1046,988],{"class":981},[909,1048,1050],{"class":911,"line":1049},10,[909,1051,994],{"emptyLinePlaceholder":8},[909,1053,1055],{"class":911,"line":1054},11,[909,1056,1057],{"class":915},"# Sign the client certificate with the CA\n",[909,1059,1061,1063,1066,1069,1071,1074,1077,1079,1082,1084,1087,1089],{"class":911,"line":1060},12,[909,1062,923],{"class":922},[909,1064,1065],{"class":926}," x509",[909,1067,1068],{"class":930}," -req",[909,1070,955],{"class":930},[909,1072,1073],{"class":937}," 365",[909,1075,1076],{"class":930}," -in",[909,1078,1032],{"class":926},[909,1080,1081],{"class":930}," -CA",[909,1083,968],{"class":926},[909,1085,1086],{"class":930}," -CAkey",[909,1088,934],{"class":926},[909,1090,972],{"class":971},[909,1092,1094,1097,1099],{"class":911,"line":1093},13,[909,1095,1096],{"class":930},"  -CAcreateserial",[909,1098,931],{"class":930},[909,1100,1101],{"class":926}," client.crt\n",[848,1103,1104],{},"Place all files in a single directory and configure the paths relative to that directory:",[899,1106,1111],{"className":1107,"code":1109,"language":1110},[1108],"language-text","certs\u002F\n├── ca.crt         # CA certificate (rootCertsPath)\n├── client.crt     # Client certificate (clientCertsPath)\n└── client.key     # Client private key (clientKeyPath)\n","text",[863,1112,1109],{"__ignoreMap":905},[848,1114,1115],{},"The IAM service must be configured with the same CA certificate to verify the client certificate.",[1117,1118,1119],"note",{},[848,1120,1121],{},"That should be configured in the proxy layer",[872,1123],{},[875,1125,192],{"id":1126},"configuration",[848,1128,1129,1130,1133,1134,1137,1138,1141],{},"Set ",[863,1131,1132],{},"ssl.enableSSL"," to ",[863,1135,1136],{},"true"," and provide the paths to your certificate files in the ",[863,1139,1140],{},"ssl"," block of the configuration:",[899,1143,1148],{"className":1144,"code":1145,"filename":1146,"language":1147,"meta":905,"style":905},"language-ts shiki shiki-themes light-plus light-plus dracula","configuration({\n  server: {\n    auth_location: {\n      serverOrDNS: 'iam.internal',\n      port: 10000\n    },\n    hmac: {\n      enableHmac: true,\n      clientId: process.env.HMAC_CLIENT_ID!,\n      sharedSecret: process.env.HMAC_SHARED_SECRET!\n    },\n    ssl: {\n      enableSSL: true,\n      mainDirPath: '\u002Fapp\u002Fcerts',\n      rootCertsPath: 'ca.crt',\n      clientCertsPath: 'client.crt',\n      clientKeyPath: 'client.key'\n    },\n    cryptoCookiesSecret: process.env.AUTH_CRYPTO_COOKIES!\n  },\n  \u002F\u002F ... rest of configuration\n})\n","server\u002Fplugins\u002Fauth.ts","ts",[863,1149,1150,1158,1171,1180,1199,1209,1214,1223,1235,1263,1284,1288,1297,1308,1325,1342,1359,1375,1380,1401,1407,1413],{"__ignoreMap":905},[909,1151,1152,1154],{"class":911,"line":912},[909,1153,1126],{"class":922},[909,1155,1157],{"class":1156},"sDd4n","({\n",[909,1159,1160,1164,1168],{"class":911,"line":919},[909,1161,1163],{"class":1162},"sjsA6","  server",[909,1165,1167],{"class":1166},"s34zl",":",[909,1169,1170],{"class":1156}," {\n",[909,1172,1173,1176,1178],{"class":911,"line":941},[909,1174,1175],{"class":1162},"    auth_location",[909,1177,1167],{"class":1166},[909,1179,1170],{"class":1156},[909,1181,1182,1185,1187,1190,1193,1196],{"class":911,"line":975},[909,1183,1184],{"class":1162},"      serverOrDNS",[909,1186,1167],{"class":1166},[909,1188,1189],{"class":981}," '",[909,1191,1192],{"class":926},"iam.internal",[909,1194,1195],{"class":981},"'",[909,1197,1198],{"class":1156},",\n",[909,1200,1201,1204,1206],{"class":911,"line":991},[909,1202,1203],{"class":1162},"      port",[909,1205,1167],{"class":1166},[909,1207,1208],{"class":937}," 10000\n",[909,1210,1211],{"class":911,"line":997},[909,1212,1213],{"class":1156},"    },\n",[909,1215,1216,1219,1221],{"class":911,"line":1003},[909,1217,1218],{"class":1162},"    hmac",[909,1220,1167],{"class":1166},[909,1222,1170],{"class":1156},[909,1224,1225,1228,1230,1233],{"class":911,"line":1017},[909,1226,1227],{"class":1162},"      enableHmac",[909,1229,1167],{"class":1166},[909,1231,1232],{"class":930}," true",[909,1234,1198],{"class":1156},[909,1236,1237,1240,1242,1245,1248,1251,1253,1257,1261],{"class":911,"line":1037},[909,1238,1239],{"class":1162},"      clientId",[909,1241,1167],{"class":1166},[909,1243,1244],{"class":1162}," process",[909,1246,1247],{"class":1156},".",[909,1249,1250],{"class":1162},"env",[909,1252,1247],{"class":1156},[909,1254,1256],{"class":1255},"sPzPf","HMAC_CLIENT_ID",[909,1258,1260],{"class":1259},"saOXh","!",[909,1262,1198],{"class":1156},[909,1264,1265,1268,1270,1272,1274,1276,1278,1281],{"class":911,"line":1049},[909,1266,1267],{"class":1162},"      sharedSecret",[909,1269,1167],{"class":1166},[909,1271,1244],{"class":1162},[909,1273,1247],{"class":1156},[909,1275,1250],{"class":1162},[909,1277,1247],{"class":1156},[909,1279,1280],{"class":1255},"HMAC_SHARED_SECRET",[909,1282,1283],{"class":1259},"!\n",[909,1285,1286],{"class":911,"line":1054},[909,1287,1213],{"class":1156},[909,1289,1290,1293,1295],{"class":911,"line":1060},[909,1291,1292],{"class":1162},"    ssl",[909,1294,1167],{"class":1166},[909,1296,1170],{"class":1156},[909,1298,1299,1302,1304,1306],{"class":911,"line":1093},[909,1300,1301],{"class":1162},"      enableSSL",[909,1303,1167],{"class":1166},[909,1305,1232],{"class":930},[909,1307,1198],{"class":1156},[909,1309,1311,1314,1316,1318,1321,1323],{"class":911,"line":1310},14,[909,1312,1313],{"class":1162},"      mainDirPath",[909,1315,1167],{"class":1166},[909,1317,1189],{"class":981},[909,1319,1320],{"class":926},"\u002Fapp\u002Fcerts",[909,1322,1195],{"class":981},[909,1324,1198],{"class":1156},[909,1326,1328,1331,1333,1335,1338,1340],{"class":911,"line":1327},15,[909,1329,1330],{"class":1162},"      rootCertsPath",[909,1332,1167],{"class":1166},[909,1334,1189],{"class":981},[909,1336,1337],{"class":926},"ca.crt",[909,1339,1195],{"class":981},[909,1341,1198],{"class":1156},[909,1343,1345,1348,1350,1352,1355,1357],{"class":911,"line":1344},16,[909,1346,1347],{"class":1162},"      clientCertsPath",[909,1349,1167],{"class":1166},[909,1351,1189],{"class":981},[909,1353,1354],{"class":926},"client.crt",[909,1356,1195],{"class":981},[909,1358,1198],{"class":1156},[909,1360,1362,1365,1367,1369,1372],{"class":911,"line":1361},17,[909,1363,1364],{"class":1162},"      clientKeyPath",[909,1366,1167],{"class":1166},[909,1368,1189],{"class":981},[909,1370,1371],{"class":926},"client.key",[909,1373,1374],{"class":981},"'\n",[909,1376,1378],{"class":911,"line":1377},18,[909,1379,1213],{"class":1156},[909,1381,1383,1386,1388,1390,1392,1394,1396,1399],{"class":911,"line":1382},19,[909,1384,1385],{"class":1162},"    cryptoCookiesSecret",[909,1387,1167],{"class":1166},[909,1389,1244],{"class":1162},[909,1391,1247],{"class":1156},[909,1393,1250],{"class":1162},[909,1395,1247],{"class":1156},[909,1397,1398],{"class":1255},"AUTH_CRYPTO_COOKIES",[909,1400,1283],{"class":1259},[909,1402,1404],{"class":911,"line":1403},20,[909,1405,1406],{"class":1156},"  },\n",[909,1408,1410],{"class":911,"line":1409},21,[909,1411,1412],{"class":915},"  \u002F\u002F ... rest of configuration\n",[909,1414,1416],{"class":911,"line":1415},22,[909,1417,1418],{"class":1156},"})\n",[1420,1421,1422,1432,1439,1448,1456],"field-group",{},[1423,1424,1426],"field",{"name":1132,"type":1425,":required":1136},"boolean",[848,1427,1428,1429,1431],{},"Activates mTLS. When ",[863,1430,1136],{},", all outbound requests to the IAM service use the configured certificate bundle.",[1423,1433,1436],{"name":1434,"type":1435},"ssl.mainDirPath","string",[848,1437,1438],{},"Absolute path to the directory containing the certificate files. All other paths are resolved relative to this directory.",[1423,1440,1442],{"name":1441,"type":1435},"ssl.rootCertsPath",[848,1443,1444,1445,1247],{},"Filename of the CA certificate relative to ",[863,1446,1447],{},"mainDirPath",[1423,1449,1451],{"name":1450,"type":1435},"ssl.clientCertsPath",[848,1452,1453,1454,1247],{},"Filename of the client certificate relative to ",[863,1455,1447],{},[1423,1457,1459],{"name":1458,"type":1435},"ssl.clientKeyPath",[848,1460,1461,1462,1247],{},"Filename of the client private key relative to ",[863,1463,1447],{},[872,1465],{},[875,1467,1469],{"id":1468},"how-it-works","How it works",[848,1471,1472,1475,1476,1479],{},[863,1473,1474],{},"getAuthAgent(botDetector, ssl?)"," builds the Undici agent. When called without arguments it reads the SSL configuration from the stored configuration object. Pass a ",[863,1477,1478],{},"ProgrammaticSSL"," object to override the file paths at call time.",[899,1481,1483],{"className":1144,"code":1482,"language":1147,"meta":905,"style":905},"const agent = getAuthAgent(false)\n\u002F\u002F Returns an Agent with the client certificate loaded,\n\u002F\u002F or undefined when SSL is disabled or paths are missing.\n\nconst botAgent = getAuthAgent(true)\n\u002F\u002F Returns an Agent with both the client certificate and\n\u002F\u002F high-throughput connection pool settings for bot detection polling.\n",[863,1484,1485,1510,1515,1520,1524,1541,1546],{"__ignoreMap":905},[909,1486,1487,1491,1495,1498,1501,1504,1507],{"class":911,"line":912},[909,1488,1490],{"class":1489},"sl46w","const",[909,1492,1494],{"class":1493},"s3JHE"," agent",[909,1496,1497],{"class":1259}," =",[909,1499,1500],{"class":922}," getAuthAgent",[909,1502,1503],{"class":1156},"(",[909,1505,1506],{"class":930},"false",[909,1508,1509],{"class":1156},")\n",[909,1511,1512],{"class":911,"line":919},[909,1513,1514],{"class":915},"\u002F\u002F Returns an Agent with the client certificate loaded,\n",[909,1516,1517],{"class":911,"line":941},[909,1518,1519],{"class":915},"\u002F\u002F or undefined when SSL is disabled or paths are missing.\n",[909,1521,1522],{"class":911,"line":975},[909,1523,994],{"emptyLinePlaceholder":8},[909,1525,1526,1528,1531,1533,1535,1537,1539],{"class":911,"line":991},[909,1527,1490],{"class":1489},[909,1529,1530],{"class":1493}," botAgent",[909,1532,1497],{"class":1259},[909,1534,1500],{"class":922},[909,1536,1503],{"class":1156},[909,1538,1136],{"class":930},[909,1540,1509],{"class":1156},[909,1542,1543],{"class":911,"line":997},[909,1544,1545],{"class":915},"\u002F\u002F Returns an Agent with both the client certificate and\n",[909,1547,1548],{"class":911,"line":1003},[909,1549,1550],{"class":915},"\u002F\u002F high-throughput connection pool settings for bot detection polling.\n",[848,1552,1553,1554,1557,1558,1561],{},"The agent is used internally by ",[863,1555,1556],{},"serviceToService"," (the ",[863,1559,1560],{},"sendToServer"," function) for all calls from the module to the IAM service. You do not need to pass it manually.",[872,1563],{},[875,1565,1567],{"id":1566},"verification","Verification",[848,1569,1570],{},"After configuring mTLS, verify the connection from outside the application:",[899,1572,1574],{"className":901,"code":1573,"filename":903,"language":904,"meta":905,"style":905},"curl --cert certs\u002Fclient.crt \\\n     --key certs\u002Fclient.key \\\n     --cacert certs\u002Fca.crt \\\n     https:\u002F\u002Fiam.internal:10000\u002Fhealth\n",[863,1575,1576,1589,1599,1609],{"__ignoreMap":905},[909,1577,1578,1581,1584,1587],{"class":911,"line":912},[909,1579,1580],{"class":922},"curl",[909,1582,1583],{"class":930}," --cert",[909,1585,1586],{"class":926}," certs\u002Fclient.crt",[909,1588,972],{"class":971},[909,1590,1591,1594,1597],{"class":911,"line":919},[909,1592,1593],{"class":930},"     --key",[909,1595,1596],{"class":926}," certs\u002Fclient.key",[909,1598,972],{"class":971},[909,1600,1601,1604,1607],{"class":911,"line":941},[909,1602,1603],{"class":930},"     --cacert",[909,1605,1606],{"class":926}," certs\u002Fca.crt",[909,1608,972],{"class":971},[909,1610,1611],{"class":911,"line":975},[909,1612,1613],{"class":926},"     https:\u002F\u002Fiam.internal:10000\u002Fhealth\n",[848,1615,1616],{},"A successful response confirms both sides are presenting and accepting certificates. A TLS handshake error indicates a mismatch in the certificate chain or an incorrect path in the configuration.",[1618,1619,1620],"tip",{},[848,1621,1622,1623,1625],{},"In a Docker environment, mount the certificate directory as a read-only volume and set ",[863,1624,1447],{}," to the container path. Do not bake certificates into the image.",[848,1627,1628,1629,1633,1634,1637,1638,1642],{},"See ",[855,1630,1632],{"href":1631},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity#inter-service-authentication","Security: Inter-service Authentication"," for how mTLS relates to HMAC signing and when to use each. See ",[855,1635,1636],{"href":181},"HMAC guide"," for the application-layer authentication layer that runs alongside mTLS. See ",[855,1639,1641],{"href":1640},"\u002Fdocs\u002Fiam\u002Fsecurity#network-isolation","IAM Security: Network Isolation"," for the deployment topology mTLS is designed to protect.",[1644,1645,1646],"style",{},"html pre.shiki code .sghk6, html code.shiki .sghk6{--shiki-light:#008000;--shiki-default:#008000;--shiki-dark:#6272A4}html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}html pre.shiki code .sFB1V, html code.shiki .sFB1V{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#F1FA8C}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 .st6lo, html code.shiki .st6lo{--shiki-light:#EE0000;--shiki-default:#EE0000;--shiki-dark:#FF79C6}html pre.shiki code .sFkSl, html code.shiki .sFkSl{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#E9F284}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 .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 .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 .saOXh, html code.shiki .saOXh{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#FF79C6}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}",{"title":905,"searchDepth":919,"depth":919,"links":1648},[1649,1650,1651,1652],{"id":877,"depth":919,"text":878},{"id":1126,"depth":919,"text":192},{"id":1468,"depth":919,"text":1469},{"id":1566,"depth":919,"text":1567},"How to configure mutual TLS so every outbound connection from the module to the IAM service presents a client certificate and verifies the server certificate.","md","i-lucide-file-badge",{},null,"---\ntitle: mTLS Configuration\ndescription: How to configure mutual TLS so every outbound connection from the module to the IAM service presents a client certificate and verifies the server certificate.\nicon: i-lucide-file-badge\n---\n\nMutual TLS (mTLS) adds client certificate authentication to every connection between the module and the IAM service. The server verifies that the client presents a certificate signed by the trusted CA, and the client verifies the server certificate against the same CA. This prevents unauthorized services from calling the IAM service even if they know the HMAC secret.\n\nThe module uses [Undici](https:\u002F\u002Fundici.nodejs.org\u002F) as the HTTP client. When SSL is enabled, `getAuthAgent` builds an Undici `Agent` configured with the certificate bundle and returns it for all outbound connections.\n\n---\n\n## Certificate setup\n\nYou need three files:\n\n- A CA certificate (the root certificate that signs both the server and client certificates)\n- A client certificate signed by the CA\n- The private key corresponding to the client certificate\n\nA minimal setup using OpenSSL:\n\n```bash [Terminal]\n# Generate a CA key and self-signed certificate\nopenssl genrsa -out ca.key 4096\nopenssl req -new -x509 -days 3650 -key ca.key -out ca.crt \\\n  -subj \"\u002FCN=Internal CA\"\n\n# Generate a client key and certificate signing request\nopenssl genrsa -out client.key 4096\nopenssl req -new -key client.key -out client.csr \\\n  -subj \"\u002FCN=nuxt-gateway\"\n\n# Sign the client certificate with the CA\nopenssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key \\\n  -CAcreateserial -out client.crt\n```\n\nPlace all files in a single directory and configure the paths relative to that directory:\n\n```\ncerts\u002F\n├── ca.crt         # CA certificate (rootCertsPath)\n├── client.crt     # Client certificate (clientCertsPath)\n└── client.key     # Client private key (clientKeyPath)\n```\n\nThe IAM service must be configured with the same CA certificate to verify the client certificate. \n\n::note\nThat should be configured in the proxy layer\n::\n\n---\n\n## Configuration\n\nSet `ssl.enableSSL` to `true` and provide the paths to your certificate files in the `ssl` block of the configuration:\n\n```ts [server\u002Fplugins\u002Fauth.ts]\nconfiguration({\n  server: {\n    auth_location: {\n      serverOrDNS: 'iam.internal',\n      port: 10000\n    },\n    hmac: {\n      enableHmac: true,\n      clientId: process.env.HMAC_CLIENT_ID!,\n      sharedSecret: process.env.HMAC_SHARED_SECRET!\n    },\n    ssl: {\n      enableSSL: true,\n      mainDirPath: '\u002Fapp\u002Fcerts',\n      rootCertsPath: 'ca.crt',\n      clientCertsPath: 'client.crt',\n      clientKeyPath: 'client.key'\n    },\n    cryptoCookiesSecret: process.env.AUTH_CRYPTO_COOKIES!\n  },\n  \u002F\u002F ... rest of configuration\n})\n```\n\n::field-group\n\n::field{name=\"ssl.enableSSL\" type=\"boolean\" required}\nActivates mTLS. When `true`, all outbound requests to the IAM service use the configured certificate bundle.\n::\n\n::field{name=\"ssl.mainDirPath\" type=\"string\"}\nAbsolute path to the directory containing the certificate files. All other paths are resolved relative to this directory.\n::\n\n::field{name=\"ssl.rootCertsPath\" type=\"string\"}\nFilename of the CA certificate relative to `mainDirPath`.\n::\n\n::field{name=\"ssl.clientCertsPath\" type=\"string\"}\nFilename of the client certificate relative to `mainDirPath`.\n::\n\n::field{name=\"ssl.clientKeyPath\" type=\"string\"}\nFilename of the client private key relative to `mainDirPath`.\n::\n\n::\n\n---\n\n## How it works\n\n`getAuthAgent(botDetector, ssl?)` builds the Undici agent. When called without arguments it reads the SSL configuration from the stored configuration object. Pass a `ProgrammaticSSL` object to override the file paths at call time.\n\n```ts\nconst agent = getAuthAgent(false)\n\u002F\u002F Returns an Agent with the client certificate loaded,\n\u002F\u002F or undefined when SSL is disabled or paths are missing.\n\nconst botAgent = getAuthAgent(true)\n\u002F\u002F Returns an Agent with both the client certificate and\n\u002F\u002F high-throughput connection pool settings for bot detection polling.\n```\n\nThe agent is used internally by `serviceToService` (the `sendToServer` function) for all calls from the module to the IAM service. You do not need to pass it manually.\n\n---\n\n## Verification\n\nAfter configuring mTLS, verify the connection from outside the application:\n\n```bash [Terminal]\ncurl --cert certs\u002Fclient.crt \\\n     --key certs\u002Fclient.key \\\n     --cacert certs\u002Fca.crt \\\n     https:\u002F\u002Fiam.internal:10000\u002Fhealth\n```\n\nA successful response confirms both sides are presenting and accepting certificates. A TLS handshake error indicates a mismatch in the certificate chain or an incorrect path in the configuration.\n\n::tip\nIn a Docker environment, mount the certificate directory as a read-only volume and set `mainDirPath` to the container path. Do not bake certificates into the image.\n::\n\nSee [Security: Inter-service Authentication](\u002Fdocs\u002Fauth-h3client\u002Fsecurity#inter-service-authentication) for how mTLS relates to HMAC signing and when to use each. See [HMAC guide](\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac) for the application-layer authentication layer that runs alongside mTLS. See [IAM Security: Network Isolation](\u002Fdocs\u002Fiam\u002Fsecurity#network-isolation) for the deployment topology mTLS is designed to protect.\n",{"title":188,"description":1653},"vZYcjZb2ZvdRoLN1nRFeAiF9wKBjaxf6375feZHJNus",[1662,1663],{"title":184,"path":185,"stem":186,"children":-1},{"title":192,"path":193,"stem":194,"children":-1},{"id":843,"title":188,"body":1665,"description":1653,"extension":1654,"icon":1655,"meta":2247,"module":1657,"navigation":8,"path":189,"rawbody":1658,"seo":2248,"stem":190,"__hash__":1660},{"type":845,"value":1666,"toc":2241},[1667,1669,1678,1680,1682,1684,1692,1694,1838,1840,1845,1847,1851,1853,1855,1863,2081,2111,2113,2115,2121,2177,2183,2185,2187,2189,2223,2225,2231,2239],[848,1668,850],{},[848,1670,853,1671,861,1674,866,1676,870],{},[855,1672,860],{"href":857,"rel":1673},[859],[863,1675,865],{},[863,1677,869],{},[872,1679],{},[875,1681,878],{"id":877},[848,1683,881],{},[883,1685,1686,1688,1690],{},[886,1687,888],{},[886,1689,891],{},[886,1691,894],{},[848,1693,897],{},[899,1695,1696],{"className":901,"code":902,"filename":903,"language":904,"meta":905,"style":905},[863,1697,1698,1702,1714,1738,1748,1752,1756,1768,1786,1796,1800,1804,1830],{"__ignoreMap":905},[909,1699,1700],{"class":911,"line":912},[909,1701,916],{"class":915},[909,1703,1704,1706,1708,1710,1712],{"class":911,"line":919},[909,1705,923],{"class":922},[909,1707,927],{"class":926},[909,1709,931],{"class":930},[909,1711,934],{"class":926},[909,1713,938],{"class":937},[909,1715,1716,1718,1720,1722,1724,1726,1728,1730,1732,1734,1736],{"class":911,"line":941},[909,1717,923],{"class":922},[909,1719,946],{"class":926},[909,1721,949],{"class":930},[909,1723,952],{"class":930},[909,1725,955],{"class":930},[909,1727,958],{"class":937},[909,1729,961],{"class":930},[909,1731,934],{"class":926},[909,1733,931],{"class":930},[909,1735,968],{"class":926},[909,1737,972],{"class":971},[909,1739,1740,1742,1744,1746],{"class":911,"line":975},[909,1741,978],{"class":930},[909,1743,982],{"class":981},[909,1745,985],{"class":926},[909,1747,988],{"class":981},[909,1749,1750],{"class":911,"line":991},[909,1751,994],{"emptyLinePlaceholder":8},[909,1753,1754],{"class":911,"line":997},[909,1755,1000],{"class":915},[909,1757,1758,1760,1762,1764,1766],{"class":911,"line":1003},[909,1759,923],{"class":922},[909,1761,927],{"class":926},[909,1763,931],{"class":930},[909,1765,1012],{"class":926},[909,1767,938],{"class":937},[909,1769,1770,1772,1774,1776,1778,1780,1782,1784],{"class":911,"line":1017},[909,1771,923],{"class":922},[909,1773,946],{"class":926},[909,1775,949],{"class":930},[909,1777,961],{"class":930},[909,1779,1012],{"class":926},[909,1781,931],{"class":930},[909,1783,1032],{"class":926},[909,1785,972],{"class":971},[909,1787,1788,1790,1792,1794],{"class":911,"line":1037},[909,1789,978],{"class":930},[909,1791,982],{"class":981},[909,1793,1044],{"class":926},[909,1795,988],{"class":981},[909,1797,1798],{"class":911,"line":1049},[909,1799,994],{"emptyLinePlaceholder":8},[909,1801,1802],{"class":911,"line":1054},[909,1803,1057],{"class":915},[909,1805,1806,1808,1810,1812,1814,1816,1818,1820,1822,1824,1826,1828],{"class":911,"line":1060},[909,1807,923],{"class":922},[909,1809,1065],{"class":926},[909,1811,1068],{"class":930},[909,1813,955],{"class":930},[909,1815,1073],{"class":937},[909,1817,1076],{"class":930},[909,1819,1032],{"class":926},[909,1821,1081],{"class":930},[909,1823,968],{"class":926},[909,1825,1086],{"class":930},[909,1827,934],{"class":926},[909,1829,972],{"class":971},[909,1831,1832,1834,1836],{"class":911,"line":1093},[909,1833,1096],{"class":930},[909,1835,931],{"class":930},[909,1837,1101],{"class":926},[848,1839,1104],{},[899,1841,1843],{"className":1842,"code":1109,"language":1110},[1108],[863,1844,1109],{"__ignoreMap":905},[848,1846,1115],{},[1117,1848,1849],{},[848,1850,1121],{},[872,1852],{},[875,1854,192],{"id":1126},[848,1856,1129,1857,1133,1859,1137,1861,1141],{},[863,1858,1132],{},[863,1860,1136],{},[863,1862,1140],{},[899,1864,1865],{"className":1144,"code":1145,"filename":1146,"language":1147,"meta":905,"style":905},[863,1866,1867,1873,1881,1889,1903,1911,1915,1923,1933,1953,1971,1975,1983,1993,2007,2021,2035,2047,2051,2069,2073,2077],{"__ignoreMap":905},[909,1868,1869,1871],{"class":911,"line":912},[909,1870,1126],{"class":922},[909,1872,1157],{"class":1156},[909,1874,1875,1877,1879],{"class":911,"line":919},[909,1876,1163],{"class":1162},[909,1878,1167],{"class":1166},[909,1880,1170],{"class":1156},[909,1882,1883,1885,1887],{"class":911,"line":941},[909,1884,1175],{"class":1162},[909,1886,1167],{"class":1166},[909,1888,1170],{"class":1156},[909,1890,1891,1893,1895,1897,1899,1901],{"class":911,"line":975},[909,1892,1184],{"class":1162},[909,1894,1167],{"class":1166},[909,1896,1189],{"class":981},[909,1898,1192],{"class":926},[909,1900,1195],{"class":981},[909,1902,1198],{"class":1156},[909,1904,1905,1907,1909],{"class":911,"line":991},[909,1906,1203],{"class":1162},[909,1908,1167],{"class":1166},[909,1910,1208],{"class":937},[909,1912,1913],{"class":911,"line":997},[909,1914,1213],{"class":1156},[909,1916,1917,1919,1921],{"class":911,"line":1003},[909,1918,1218],{"class":1162},[909,1920,1167],{"class":1166},[909,1922,1170],{"class":1156},[909,1924,1925,1927,1929,1931],{"class":911,"line":1017},[909,1926,1227],{"class":1162},[909,1928,1167],{"class":1166},[909,1930,1232],{"class":930},[909,1932,1198],{"class":1156},[909,1934,1935,1937,1939,1941,1943,1945,1947,1949,1951],{"class":911,"line":1037},[909,1936,1239],{"class":1162},[909,1938,1167],{"class":1166},[909,1940,1244],{"class":1162},[909,1942,1247],{"class":1156},[909,1944,1250],{"class":1162},[909,1946,1247],{"class":1156},[909,1948,1256],{"class":1255},[909,1950,1260],{"class":1259},[909,1952,1198],{"class":1156},[909,1954,1955,1957,1959,1961,1963,1965,1967,1969],{"class":911,"line":1049},[909,1956,1267],{"class":1162},[909,1958,1167],{"class":1166},[909,1960,1244],{"class":1162},[909,1962,1247],{"class":1156},[909,1964,1250],{"class":1162},[909,1966,1247],{"class":1156},[909,1968,1280],{"class":1255},[909,1970,1283],{"class":1259},[909,1972,1973],{"class":911,"line":1054},[909,1974,1213],{"class":1156},[909,1976,1977,1979,1981],{"class":911,"line":1060},[909,1978,1292],{"class":1162},[909,1980,1167],{"class":1166},[909,1982,1170],{"class":1156},[909,1984,1985,1987,1989,1991],{"class":911,"line":1093},[909,1986,1301],{"class":1162},[909,1988,1167],{"class":1166},[909,1990,1232],{"class":930},[909,1992,1198],{"class":1156},[909,1994,1995,1997,1999,2001,2003,2005],{"class":911,"line":1310},[909,1996,1313],{"class":1162},[909,1998,1167],{"class":1166},[909,2000,1189],{"class":981},[909,2002,1320],{"class":926},[909,2004,1195],{"class":981},[909,2006,1198],{"class":1156},[909,2008,2009,2011,2013,2015,2017,2019],{"class":911,"line":1327},[909,2010,1330],{"class":1162},[909,2012,1167],{"class":1166},[909,2014,1189],{"class":981},[909,2016,1337],{"class":926},[909,2018,1195],{"class":981},[909,2020,1198],{"class":1156},[909,2022,2023,2025,2027,2029,2031,2033],{"class":911,"line":1344},[909,2024,1347],{"class":1162},[909,2026,1167],{"class":1166},[909,2028,1189],{"class":981},[909,2030,1354],{"class":926},[909,2032,1195],{"class":981},[909,2034,1198],{"class":1156},[909,2036,2037,2039,2041,2043,2045],{"class":911,"line":1361},[909,2038,1364],{"class":1162},[909,2040,1167],{"class":1166},[909,2042,1189],{"class":981},[909,2044,1371],{"class":926},[909,2046,1374],{"class":981},[909,2048,2049],{"class":911,"line":1377},[909,2050,1213],{"class":1156},[909,2052,2053,2055,2057,2059,2061,2063,2065,2067],{"class":911,"line":1382},[909,2054,1385],{"class":1162},[909,2056,1167],{"class":1166},[909,2058,1244],{"class":1162},[909,2060,1247],{"class":1156},[909,2062,1250],{"class":1162},[909,2064,1247],{"class":1156},[909,2066,1398],{"class":1255},[909,2068,1283],{"class":1259},[909,2070,2071],{"class":911,"line":1403},[909,2072,1406],{"class":1156},[909,2074,2075],{"class":911,"line":1409},[909,2076,1412],{"class":915},[909,2078,2079],{"class":911,"line":1415},[909,2080,1418],{"class":1156},[1420,2082,2083,2089,2093,2099,2105],{},[1423,2084,2085],{"name":1132,"type":1425,":required":1136},[848,2086,1428,2087,1431],{},[863,2088,1136],{},[1423,2090,2091],{"name":1434,"type":1435},[848,2092,1438],{},[1423,2094,2095],{"name":1441,"type":1435},[848,2096,1444,2097,1247],{},[863,2098,1447],{},[1423,2100,2101],{"name":1450,"type":1435},[848,2102,1453,2103,1247],{},[863,2104,1447],{},[1423,2106,2107],{"name":1458,"type":1435},[848,2108,1461,2109,1247],{},[863,2110,1447],{},[872,2112],{},[875,2114,1469],{"id":1468},[848,2116,2117,1475,2119,1479],{},[863,2118,1474],{},[863,2120,1478],{},[899,2122,2123],{"className":1144,"code":1482,"language":1147,"meta":905,"style":905},[863,2124,2125,2141,2145,2149,2153,2169,2173],{"__ignoreMap":905},[909,2126,2127,2129,2131,2133,2135,2137,2139],{"class":911,"line":912},[909,2128,1490],{"class":1489},[909,2130,1494],{"class":1493},[909,2132,1497],{"class":1259},[909,2134,1500],{"class":922},[909,2136,1503],{"class":1156},[909,2138,1506],{"class":930},[909,2140,1509],{"class":1156},[909,2142,2143],{"class":911,"line":919},[909,2144,1514],{"class":915},[909,2146,2147],{"class":911,"line":941},[909,2148,1519],{"class":915},[909,2150,2151],{"class":911,"line":975},[909,2152,994],{"emptyLinePlaceholder":8},[909,2154,2155,2157,2159,2161,2163,2165,2167],{"class":911,"line":991},[909,2156,1490],{"class":1489},[909,2158,1530],{"class":1493},[909,2160,1497],{"class":1259},[909,2162,1500],{"class":922},[909,2164,1503],{"class":1156},[909,2166,1136],{"class":930},[909,2168,1509],{"class":1156},[909,2170,2171],{"class":911,"line":997},[909,2172,1545],{"class":915},[909,2174,2175],{"class":911,"line":1003},[909,2176,1550],{"class":915},[848,2178,1553,2179,1557,2181,1561],{},[863,2180,1556],{},[863,2182,1560],{},[872,2184],{},[875,2186,1567],{"id":1566},[848,2188,1570],{},[899,2190,2191],{"className":901,"code":1573,"filename":903,"language":904,"meta":905,"style":905},[863,2192,2193,2203,2211,2219],{"__ignoreMap":905},[909,2194,2195,2197,2199,2201],{"class":911,"line":912},[909,2196,1580],{"class":922},[909,2198,1583],{"class":930},[909,2200,1586],{"class":926},[909,2202,972],{"class":971},[909,2204,2205,2207,2209],{"class":911,"line":919},[909,2206,1593],{"class":930},[909,2208,1596],{"class":926},[909,2210,972],{"class":971},[909,2212,2213,2215,2217],{"class":911,"line":941},[909,2214,1603],{"class":930},[909,2216,1606],{"class":926},[909,2218,972],{"class":971},[909,2220,2221],{"class":911,"line":975},[909,2222,1613],{"class":926},[848,2224,1616],{},[1618,2226,2227],{},[848,2228,1622,2229,1625],{},[863,2230,1447],{},[848,2232,1628,2233,1633,2235,1637,2237,1642],{},[855,2234,1632],{"href":1631},[855,2236,1636],{"href":181},[855,2238,1641],{"href":1640},[1644,2240,1646],{},{"title":905,"searchDepth":919,"depth":919,"links":2242},[2243,2244,2245,2246],{"id":877,"depth":919,"text":878},{"id":1126,"depth":919,"text":192},{"id":1468,"depth":919,"text":1469},{"id":1566,"depth":919,"text":1567},{},{"title":188,"description":1653},1780436292804]