[{"data":1,"prerenderedAt":1119},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fiam":64,"navigation":287,"navLinks_footer":867,"\u002Fdocs\u002Fiam_page":880,"\u002Fdocs\u002Fiam_surround":1034,"\u002Fdocs\u002Fiam":1036},{"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":27,"path":29,"stem":70,"children":71,"page":-1,"icon":28},"docs\u002Fiam\u002Findex",[72,73,76,242,246,264,268],{"title":27,"path":29,"stem":70,"icon":28},{"title":14,"path":74,"stem":75,"icon":15},"\u002Fdocs\u002Fiam\u002Fgetting-started","docs\u002Fiam\u002F00.getting-started",{"title":77,"path":78,"stem":79,"children":80,"page":-1,"icon":10},"Essentials","\u002Fdocs\u002Fiam\u002Fessentials","docs\u002Fiam\u002F01.essentials\u002Findex",[81,82,86,90,95,100,105,110,115,120,125,130,135,140,145,149,154,159,164,169,174,178,182],{"title":77,"path":78,"stem":79,"icon":10},{"title":83,"path":84,"stem":85,"icon":21},"Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens","docs\u002Fiam\u002F01.essentials\u002F00.tokens",{"title":87,"path":88,"stem":89,"icon":28},"Access Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens","docs\u002Fiam\u002F01.essentials\u002F01.access-tokens",{"title":91,"path":92,"stem":93,"icon":94},"Refresh Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens","docs\u002Fiam\u002F01.essentials\u002F02.refresh-tokens","i-lucide-rotate-cw",{"title":96,"path":97,"stem":98,"icon":99},"Anomaly Detection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies","docs\u002Fiam\u002F01.essentials\u002F03.anomalies","i-lucide-scan-eye",{"title":101,"path":102,"stem":103,"icon":104},"Signup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fsignup","docs\u002Fiam\u002F01.essentials\u002F04.signup","i-lucide-user-plus",{"title":106,"path":107,"stem":108,"icon":109},"Login","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogin","docs\u002Fiam\u002F01.essentials\u002F05.login","i-lucide-log-in",{"title":111,"path":112,"stem":113,"icon":114},"Logout","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogout","docs\u002Fiam\u002F01.essentials\u002F06.logout","i-lucide-log-out",{"title":116,"path":117,"stem":118,"icon":119},"OAuth","\u002Fdocs\u002Fiam\u002Fessentials\u002Foauth","docs\u002Fiam\u002F01.essentials\u002F07.oauth","i-lucide-users",{"title":121,"path":122,"stem":123,"icon":124},"Magic Links","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmagic-links","docs\u002Fiam\u002F01.essentials\u002F08.magic-links","i-lucide-link",{"title":126,"path":127,"stem":128,"icon":129},"Emails","\u002Fdocs\u002Fiam\u002Fessentials\u002Femails","docs\u002Fiam\u002F01.essentials\u002F09.emails","i-lucide-mail",{"title":131,"path":132,"stem":133,"icon":134},"MFA","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa","docs\u002Fiam\u002F01.essentials\u002F10.mfa","i-lucide-shield-alert",{"title":136,"path":137,"stem":138,"icon":139},"Fingerprinting","\u002Fdocs\u002Fiam\u002Fessentials\u002Ffingerprinting","docs\u002Fiam\u002F01.essentials\u002F11.fingerprinting","i-lucide-fingerprint",{"title":141,"path":142,"stem":143,"icon":144},"Backend for Frontend","\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff","docs\u002Fiam\u002F01.essentials\u002F12.bff","i-lucide-layers",{"title":146,"path":147,"stem":148,"icon":21},"HMAC Authentication","\u002Fdocs\u002Fiam\u002Fessentials\u002Fhmac","docs\u002Fiam\u002F01.essentials\u002F13.hmac",{"title":150,"path":151,"stem":152,"icon":153},"XSS Protection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fxss","docs\u002Fiam\u002F01.essentials\u002F14.xss","i-lucide-shield-x",{"title":155,"path":156,"stem":157,"icon":158},"Logging","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogging","docs\u002Fiam\u002F01.essentials\u002F15.logging","i-lucide-file-text",{"title":160,"path":161,"stem":162,"icon":163},"Rate Limiting","\u002Fdocs\u002Fiam\u002Fessentials\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F16.rate-limiting","i-lucide-gauge",{"title":165,"path":166,"stem":167,"icon":168},"Database","\u002Fdocs\u002Fiam\u002Fessentials\u002Fdatabase","docs\u002Fiam\u002F01.essentials\u002F17.database","i-lucide-database",{"title":170,"path":171,"stem":172,"icon":173},"Cookies","\u002Fdocs\u002Fiam\u002Fessentials\u002Fcookies","docs\u002Fiam\u002F01.essentials\u002F18.cookies","i-lucide-cookie",{"title":175,"path":176,"stem":177,"icon":15},"Service Startup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fservice","docs\u002Fiam\u002F01.essentials\u002F19.service",{"title":179,"path":180,"stem":181,"icon":21},"Password Reset","\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset","docs\u002Fiam\u002F01.essentials\u002F20.password-reset",{"title":183,"path":184,"stem":185,"children":186,"page":-1,"icon":188},"API Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi","docs\u002Fiam\u002F01.essentials\u002F21.api\u002Findex",[187,189,194,199,236,239],{"title":183,"path":184,"stem":185,"icon":188},"i-lucide-key",{"title":190,"path":191,"stem":192,"icon":193},"Creating Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F00.creation","i-lucide-plus-circle",{"title":195,"path":196,"stem":197,"icon":198},"Verifying Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F01.verification","i-lucide-check-circle",{"title":200,"path":201,"stem":202,"children":203,"page":-1,"icon":205},"Management","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002Findex",[204,206,211,216,221,226,231],{"title":200,"path":201,"stem":202,"icon":205},"i-lucide-settings",{"title":207,"path":208,"stem":209,"icon":210},"Privilege and Scopes","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F00.privilege","i-lucide-shield",{"title":212,"path":213,"stem":214,"icon":215},"Revocation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F01.revocation","i-lucide-trash-2",{"title":217,"path":218,"stem":219,"icon":220},"Rotation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F02.rotation","i-lucide-refresh-cw",{"title":222,"path":223,"stem":224,"icon":225},"IP Restriction","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F03.ip-updates","i-lucide-globe",{"title":227,"path":228,"stem":229,"icon":230},"Metadata","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F04.metadata","i-lucide-file-search",{"title":232,"path":233,"stem":234,"icon":235},"Token Listing","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F05.list","i-lucide-list",{"title":160,"path":237,"stem":238,"icon":163},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F03.rate-limiting",{"title":38,"path":240,"stem":241,"icon":28},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fsecurity","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F04.security",{"title":38,"path":243,"stem":244,"icon":245},"\u002Fdocs\u002Fiam\u002Fsecurity","docs\u002Fiam\u002F02.security","i-lucide-lock-keyhole",{"title":247,"icon":10,"path":248,"stem":249,"children":250,"page":53},"Guides","\u002Fdocs\u002Fiam\u002Fguides","docs\u002Fiam\u002F03.guides",[251,255,260],{"title":252,"path":253,"stem":254,"icon":15},"Deployment","\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment","docs\u002Fiam\u002F03.guides\u002Fdeployment",{"title":256,"path":257,"stem":258,"icon":259},"Operation Scripts","\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts","docs\u002Fiam\u002F03.guides\u002Foperation-scripts","i-lucide-file-terminal",{"title":261,"path":262,"stem":263,"icon":28},"Role-Based Access Control","\u002Fdocs\u002Fiam\u002Fguides\u002Frbac","docs\u002Fiam\u002F03.guides\u002Frbac",{"title":265,"path":266,"stem":267,"icon":205},"Configuration","\u002Fdocs\u002Fiam\u002Fconfiguration","docs\u002Fiam\u002F04.configuration",{"title":269,"icon":270,"path":271,"stem":272,"children":273,"page":53},"Api","i-lucide-code","\u002Fdocs\u002Fiam\u002Fapi","docs\u002Fiam\u002F05.API",[274,278,282],{"title":275,"path":276,"stem":277,"icon":270},"API Reference","\u002Fdocs\u002Fiam\u002Fapi\u002Fapi","docs\u002Fiam\u002F05.API\u002F00.api",{"title":279,"path":280,"stem":281,"icon":210},"Middleware Reference","\u002Fdocs\u002Fiam\u002Fapi\u002Fmiddlewares","docs\u002Fiam\u002F05.API\u002F02.middlewares",{"title":283,"path":284,"stem":285,"icon":286},"Routes Reference","\u002Fdocs\u002Fiam\u002Fapi\u002Froutes","docs\u002Fiam\u002F05.API\u002F03.routes","i-lucide-route",[288],{"title":9,"path":66,"stem":67,"children":289,"page":53},[290,428,546,551,607,674],{"title":20,"path":22,"stem":291,"children":292},"docs\u002Fauth-h3client\u002Findex",[293,294,303,337,361,383,386,406,409],{"title":20,"path":22,"stem":291},{"title":14,"path":295,"stem":296,"children":297},"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started","docs\u002Fauth-h3client\u002F00.getting-started\u002Findex",[298,299],{"title":14,"path":295,"stem":296},{"title":300,"path":301,"stem":302},"Nuxt Module","\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt","docs\u002Fauth-h3client\u002F00.getting-started\u002F00.nuxt",{"title":77,"path":304,"stem":305,"children":306},"\u002Fdocs\u002Fauth-h3client\u002Fessentials","docs\u002Fauth-h3client\u002F01.essentials\u002Findex",[307,308,312,316,320,324,328,331,334],{"title":77,"path":304,"stem":305},{"title":309,"path":310,"stem":311},"Session Management","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession","docs\u002Fauth-h3client\u002F01.essentials\u002F00.session",{"title":313,"path":314,"stem":315},"Route Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection","docs\u002Fauth-h3client\u002F01.essentials\u002F01.route-protection",{"title":317,"path":318,"stem":319},"CSRF Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf","docs\u002Fauth-h3client\u002F01.essentials\u002F02.csrf",{"title":321,"path":322,"stem":323},"Auth Flows","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fauth-flows","docs\u002Fauth-h3client\u002F01.essentials\u002F03.auth-flows",{"title":325,"path":326,"stem":327},"OAuth and OIDC","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Foauth","docs\u002Fauth-h3client\u002F01.essentials\u002F04.oauth",{"title":33,"path":329,"stem":330},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fbot-detection","docs\u002Fauth-h3client\u002F01.essentials\u002F05.bot-detection",{"title":170,"path":332,"stem":333},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcookies","docs\u002Fauth-h3client\u002F01.essentials\u002F06.cookies",{"title":155,"path":335,"stem":336},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging","docs\u002Fauth-h3client\u002F01.essentials\u002F07.logging",{"title":131,"path":338,"stem":339,"children":340},"\u002Fdocs\u002Fauth-h3client\u002Fmfa","docs\u002Fauth-h3client\u002F02.mfa\u002Findex",[341,342,346,349,353,357],{"title":131,"path":338,"stem":339},{"title":343,"path":344,"stem":345},"Built-in MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fbuilt-in-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F01.built-in-flow",{"title":179,"path":347,"stem":348},"\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset","docs\u002Fauth-h3client\u002F02.mfa\u002F02.password-reset",{"title":350,"path":351,"stem":352},"Email Change","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Femail-change","docs\u002Fauth-h3client\u002F02.mfa\u002F03.email-change",{"title":354,"path":355,"stem":356},"Custom MFA Flow","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fcustom-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F04.custom-flow",{"title":358,"path":359,"stem":360},"Client-Side MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side","docs\u002Fauth-h3client\u002F02.mfa\u002F05.client-side",{"title":362,"path":363,"stem":364,"children":365},"Client-side","\u002Fdocs\u002Fauth-h3client\u002Fclient","docs\u002Fauth-h3client\u002F03.client\u002Findex",[366,367,371,375,379],{"title":362,"path":363,"stem":364},{"title":368,"path":369,"stem":370},"useAuthData","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-auth-data","docs\u002Fauth-h3client\u002F03.client\u002F00.use-auth-data",{"title":372,"path":373,"stem":374},"useMagicLink","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-magic-link","docs\u002Fauth-h3client\u002F03.client\u002F01.use-magic-link",{"title":376,"path":377,"stem":378},"executeRequest","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fexecute-request","docs\u002Fauth-h3client\u002F03.client\u002F02.execute-request",{"title":380,"path":381,"stem":382},"getCsrfToken","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fget-csrf-token","docs\u002Fauth-h3client\u002F03.client\u002F03.get-csrf-token",{"title":38,"path":384,"stem":385},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity","docs\u002Fauth-h3client\u002F04.security",{"title":247,"path":387,"stem":388,"children":389,"page":53},"\u002Fdocs\u002Fauth-h3client\u002Fguides","docs\u002Fauth-h3client\u002F05.guides",[390,394,398,402],{"title":391,"path":392,"stem":393},"H3 and Nitro Setup","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro","docs\u002Fauth-h3client\u002F05.guides\u002F00.h3-nitro",{"title":395,"path":396,"stem":397},"HMAC Inter-service Auth","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac","docs\u002Fauth-h3client\u002F05.guides\u002Fhmac",{"title":399,"path":400,"stem":401},"Image Upload","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fimage-upload","docs\u002Fauth-h3client\u002F05.guides\u002Fimage-upload",{"title":403,"path":404,"stem":405},"mTLS Configuration","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls","docs\u002Fauth-h3client\u002F05.guides\u002Fmtls",{"title":265,"path":407,"stem":408},"\u002Fdocs\u002Fauth-h3client\u002Fconfiguration","docs\u002Fauth-h3client\u002F06.configuration",{"title":275,"path":410,"stem":411,"children":412},"\u002Fdocs\u002Fauth-h3client\u002Fapi","docs\u002Fauth-h3client\u002F07.api\u002Findex",[413,414,417,420,424],{"title":275,"path":410,"stem":411},{"title":283,"path":415,"stem":416},"\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers","docs\u002Fauth-h3client\u002F07.api\u002F00.controllers",{"title":279,"path":418,"stem":419},"\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware","docs\u002Fauth-h3client\u002F07.api\u002F01.middleware",{"title":421,"path":422,"stem":423},"Client-side Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcomposables","docs\u002Fauth-h3client\u002F07.api\u002F02.composables",{"title":425,"path":426,"stem":427},"Utilities","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Futilities","docs\u002Fauth-h3client\u002F07.api\u002F03.utilities",{"title":429,"path":35,"stem":430,"children":431},"Bot Detector","docs\u002Fbot-detection\u002Findex",[432,433,436,440,444,463,537,540,543],{"title":429,"path":35,"stem":430},{"title":14,"path":434,"stem":435},"\u002Fdocs\u002Fbot-detection\u002Fgetting-started","docs\u002Fbot-detection\u002F00.getting-started",{"title":437,"path":438,"stem":439},"CLI","\u002Fdocs\u002Fbot-detection\u002Fcli","docs\u002Fbot-detection\u002F01.cli",{"title":441,"path":442,"stem":443},"Data Sources","\u002Fdocs\u002Fbot-detection\u002Fdata-sources","docs\u002Fbot-detection\u002F02.data-sources",{"title":247,"path":445,"stem":446,"children":447,"page":53},"\u002Fdocs\u002Fbot-detection\u002Fguides","docs\u002Fbot-detection\u002F03.guides",[448,452,456,459],{"title":449,"path":450,"stem":451},"Custom Checkers","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fcustom","docs\u002Fbot-detection\u002F03.guides\u002FCUSTOM",{"title":453,"path":454,"stem":455},"Scheduling Database Generation","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fgenerate","docs\u002Fbot-detection\u002F03.guides\u002FGENERATE",{"title":155,"path":457,"stem":458},"\u002Fdocs\u002Fbot-detection\u002Fguides\u002Flogging","docs\u002Fbot-detection\u002F03.guides\u002FLOGGING",{"title":460,"path":461,"stem":462},"Score Modes and Reputation Healing","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore","docs\u002Fbot-detection\u002F03.guides\u002FSCORE",{"title":464,"path":465,"stem":466,"children":467},"Checkers","\u002Fdocs\u002Fbot-detection\u002Fcheckers","docs\u002Fbot-detection\u002F04.checkers\u002Findex",[468,469,473,477,481,485,489,493,497,501,505,509,513,517,521,525,529,533],{"title":464,"path":465,"stem":466},{"title":470,"path":471,"stem":472},"IP Validation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fip-validation","docs\u002Fbot-detection\u002F04.checkers\u002F01.ip-validation",{"title":474,"path":475,"stem":476},"Good \u002F Bad Bot Verification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgood-bots","docs\u002Fbot-detection\u002F04.checkers\u002F02.good-bots",{"title":478,"path":479,"stem":480},"Browser & Device Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device","docs\u002Fbot-detection\u002F04.checkers\u002F03.browser-device",{"title":482,"path":483,"stem":484},"Locale Map","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Flocale-map","docs\u002Fbot-detection\u002F04.checkers\u002F04.locale-map",{"title":486,"path":487,"stem":488},"Known Threats","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-threats","docs\u002Fbot-detection\u002F04.checkers\u002F05.known-threats",{"title":490,"path":491,"stem":492},"ASN Classification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fasn-classification","docs\u002Fbot-detection\u002F04.checkers\u002F06.asn-classification",{"title":494,"path":495,"stem":496},"Tor Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftor-analysis","docs\u002Fbot-detection\u002F04.checkers\u002F07.tor-analysis",{"title":498,"path":499,"stem":500},"Timezone Consistency","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftimezone-consistency","docs\u002Fbot-detection\u002F04.checkers\u002F08.timezone-consistency",{"title":502,"path":503,"stem":504},"Honeypot","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fhoneypot","docs\u002Fbot-detection\u002F04.checkers\u002F09.honeypot",{"title":506,"path":507,"stem":508},"Known Bad IPs","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ips","docs\u002Fbot-detection\u002F04.checkers\u002F10.known-bad-ips",{"title":510,"path":511,"stem":512},"Behavior Rate","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbehavior-rate","docs\u002Fbot-detection\u002F04.checkers\u002F11.behavior-rate",{"title":514,"path":515,"stem":516},"Proxy \u002F ISP \u002F Cookie","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies","docs\u002Fbot-detection\u002F04.checkers\u002F12.proxy-isp-cookies",{"title":518,"path":519,"stem":520},"Session Coherence","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fsession-coherence","docs\u002Fbot-detection\u002F04.checkers\u002F13.session-coherence",{"title":522,"path":523,"stem":524},"Velocity Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fvelocity-fingerprint","docs\u002Fbot-detection\u002F04.checkers\u002F14.velocity-fingerprint",{"title":526,"path":527,"stem":528},"UA & Header Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header","docs\u002Fbot-detection\u002F04.checkers\u002F15.ua-header",{"title":530,"path":531,"stem":532},"Geolocation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgeolocation","docs\u002Fbot-detection\u002F04.checkers\u002F16.geolocation",{"title":534,"path":535,"stem":536},"Known Bad User-Agents","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ua","docs\u002Fbot-detection\u002F04.checkers\u002F17.known-bad-ua",{"title":38,"path":538,"stem":539},"\u002Fdocs\u002Fbot-detection\u002Fsecurity","docs\u002Fbot-detection\u002F04.security",{"title":275,"path":541,"stem":542},"\u002Fdocs\u002Fbot-detection\u002Fapi","docs\u002Fbot-detection\u002F05.api",{"title":265,"path":544,"stem":545},"\u002Fdocs\u002Fbot-detection\u002Fconfiguration","docs\u002Fbot-detection\u002F06.configuration",{"title":547,"path":11,"stem":548,"children":549},"Introduction","docs\u002Fgetting-started\u002Findex",[550],{"title":547,"path":11,"stem":548},{"title":27,"path":29,"stem":70,"children":552},[553,554,555,595,596,601,602],{"title":27,"path":29,"stem":70},{"title":14,"path":74,"stem":75},{"title":77,"path":78,"stem":79,"children":556},[557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579],{"title":77,"path":78,"stem":79},{"title":83,"path":84,"stem":85},{"title":87,"path":88,"stem":89},{"title":91,"path":92,"stem":93},{"title":96,"path":97,"stem":98},{"title":101,"path":102,"stem":103},{"title":106,"path":107,"stem":108},{"title":111,"path":112,"stem":113},{"title":116,"path":117,"stem":118},{"title":121,"path":122,"stem":123},{"title":126,"path":127,"stem":128},{"title":131,"path":132,"stem":133},{"title":136,"path":137,"stem":138},{"title":141,"path":142,"stem":143},{"title":146,"path":147,"stem":148},{"title":150,"path":151,"stem":152},{"title":155,"path":156,"stem":157},{"title":160,"path":161,"stem":162},{"title":165,"path":166,"stem":167},{"title":170,"path":171,"stem":172},{"title":175,"path":176,"stem":177},{"title":179,"path":180,"stem":181},{"title":183,"path":184,"stem":185,"children":580},[581,582,583,584,593,594],{"title":183,"path":184,"stem":185},{"title":190,"path":191,"stem":192},{"title":195,"path":196,"stem":197},{"title":200,"path":201,"stem":202,"children":585},[586,587,588,589,590,591,592],{"title":200,"path":201,"stem":202},{"title":207,"path":208,"stem":209},{"title":212,"path":213,"stem":214},{"title":217,"path":218,"stem":219},{"title":222,"path":223,"stem":224},{"title":227,"path":228,"stem":229},{"title":232,"path":233,"stem":234},{"title":160,"path":237,"stem":238},{"title":38,"path":240,"stem":241},{"title":38,"path":243,"stem":244},{"title":247,"path":248,"stem":249,"children":597,"page":53},[598,599,600],{"title":252,"path":253,"stem":254},{"title":256,"path":257,"stem":258},{"title":261,"path":262,"stem":263},{"title":265,"path":266,"stem":267},{"title":269,"path":271,"stem":272,"children":603,"page":53},[604,605,606],{"title":275,"path":276,"stem":277},{"title":279,"path":280,"stem":281},{"title":283,"path":284,"stem":285},{"title":40,"path":42,"stem":608,"children":609},"docs\u002Fshield-base\u002Findex",[610,611,614,618,659,663,667,671],{"title":40,"path":42,"stem":608},{"title":14,"path":612,"stem":613},"\u002Fdocs\u002Fshield-base\u002Fgetting-started","docs\u002Fshield-base\u002F00.getting-started",{"title":615,"path":616,"stem":617},"CLI Reference","\u002Fdocs\u002Fshield-base\u002Fcli","docs\u002Fshield-base\u002F01.cli",{"title":441,"path":619,"stem":620,"children":621},"\u002Fdocs\u002Fshield-base\u002Fdata-sources","docs\u002Fshield-base\u002F02.data-sources\u002Findex",[622,623,627,631,635,639,643,647,651,655],{"title":441,"path":619,"stem":620},{"title":624,"path":625,"stem":626},"BGP \u002F ASN","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fbgp","docs\u002Fshield-base\u002F02.data-sources\u002Fbgp",{"title":628,"path":629,"stem":630},"City Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcity","docs\u002Fshield-base\u002F02.data-sources\u002Fcity",{"title":632,"path":633,"stem":634},"Country Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcountry","docs\u002Fshield-base\u002F02.data-sources\u002Fcountry",{"title":636,"path":637,"stem":638},"Verified Crawlers","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcrawlers","docs\u002Fshield-base\u002F02.data-sources\u002Fcrawlers",{"title":640,"path":641,"stem":642},"Disposable Emails","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Femail","docs\u002Fshield-base\u002F02.data-sources\u002Femail",{"title":644,"path":645,"stem":646},"FireHOL Threat Intelligence","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ffirehol","docs\u002Fshield-base\u002F02.data-sources\u002Ffirehol",{"title":648,"path":649,"stem":650},"Proxy Detection","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fproxy","docs\u002Fshield-base\u002F02.data-sources\u002Fproxy",{"title":652,"path":653,"stem":654},"Tor Nodes","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor","docs\u002Fshield-base\u002F02.data-sources\u002Ftor",{"title":656,"path":657,"stem":658},"Suspicious User-Agents","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fuseragent","docs\u002Fshield-base\u002F02.data-sources\u002Fuseragent",{"title":660,"path":661,"stem":662},"Programmatic Usage","\u002Fdocs\u002Fshield-base\u002Fusage","docs\u002Fshield-base\u002F03.usage",{"title":664,"path":665,"stem":666},"Custom Data Sources","\u002Fdocs\u002Fshield-base\u002Fcustom-data-sources","docs\u002Fshield-base\u002F04.custom-data-sources",{"title":668,"path":669,"stem":670},"TypeScript Types","\u002Fdocs\u002Fshield-base\u002Ftypes","docs\u002Fshield-base\u002F05.types",{"title":275,"path":672,"stem":673},"\u002Fdocs\u002Fshield-base\u002Fapi","docs\u002Fshield-base\u002F06.api",{"title":425,"path":48,"stem":675,"children":676},"docs\u002Futils\u002Findex",[677,678,695,728,825],{"title":425,"path":48,"stem":675},{"title":679,"path":680,"stem":681,"children":682,"page":53},"Eslint","\u002Fdocs\u002Futils\u002Feslint","docs\u002Futils\u002Feslint",[683,687,691],{"title":684,"path":685,"stem":686},"React Config","\u002Fdocs\u002Futils\u002Feslint\u002Freact","docs\u002Futils\u002Feslint\u002Freact",{"title":688,"path":689,"stem":690},"TypeScript Config","\u002Fdocs\u002Futils\u002Feslint\u002Ftypescript","docs\u002Futils\u002Feslint\u002Ftypescript",{"title":692,"path":693,"stem":694},"Vue Config","\u002Fdocs\u002Futils\u002Feslint\u002Fvue","docs\u002Futils\u002Feslint\u002Fvue",{"title":696,"path":697,"stem":698,"children":699,"page":53},"Server","\u002Fdocs\u002Futils\u002Fserver","docs\u002Futils\u002Fserver",[700,704,708,712,716,720,724],{"title":701,"path":702,"stem":703},"Encryption","\u002Fdocs\u002Futils\u002Fserver\u002Fencryption","docs\u002Futils\u002Fserver\u002Fencryption",{"title":705,"path":706,"stem":707},"Path Resolver","\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver","docs\u002Futils\u002Fserver\u002FpathResolver",{"title":709,"path":710,"stem":711},"File Replacements","\u002Fdocs\u002Futils\u002Fserver\u002Freplace","docs\u002Futils\u002Fserver\u002Freplace",{"title":713,"path":714,"stem":715},"run","\u002Fdocs\u002Futils\u002Fserver\u002Frun","docs\u002Futils\u002Fserver\u002Frun",{"title":717,"path":718,"stem":719},"scheduleTask","\u002Fdocs\u002Futils\u002Fserver\u002Fscheduletask","docs\u002Futils\u002Fserver\u002FscheduleTask",{"title":721,"path":722,"stem":723},"spawnRun","\u002Fdocs\u002Futils\u002Fserver\u002Fspawnrun","docs\u002Futils\u002Fserver\u002FspawnRun",{"title":725,"path":726,"stem":727},"uploadCsv","\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv","docs\u002Futils\u002Fserver\u002FuploadCsv",{"title":729,"path":730,"stem":731,"children":732,"page":53},"Shared","\u002Fdocs\u002Futils\u002Fshared","docs\u002Futils\u002Fshared",[733,737,741,745,749,753,757,761,765,769,773,777,781,785,789,793,797,801,805,809,813,817,821],{"title":734,"path":735,"stem":736},"BatchQueue","\u002Fdocs\u002Futils\u002Fshared\u002Fbatchqueue","docs\u002Futils\u002Fshared\u002FbatchQueue",{"title":738,"path":739,"stem":740},"capitalize","\u002Fdocs\u002Futils\u002Fshared\u002Fcapitalize","docs\u002Futils\u002Fshared\u002Fcapitalize",{"title":742,"path":743,"stem":744},"chunkProcess","\u002Fdocs\u002Futils\u002Fshared\u002Fchunkprocess","docs\u002Futils\u002Fshared\u002FchunkProcess",{"title":746,"path":747,"stem":748},"cleanObject","\u002Fdocs\u002Futils\u002Fshared\u002Fcleanobject","docs\u002Futils\u002Fshared\u002FcleanObject",{"title":750,"path":751,"stem":752},"createConfigManager","\u002Fdocs\u002Futils\u002Fshared\u002Fconfigurationdefiner","docs\u002Futils\u002Fshared\u002FconfigurationDefiner",{"title":754,"path":755,"stem":756},"debounce","\u002Fdocs\u002Futils\u002Fshared\u002Fdebounce","docs\u002Futils\u002Fshared\u002Fdebounce",{"title":758,"path":759,"stem":760},"ensureArray","\u002Fdocs\u002Futils\u002Fshared\u002Fensurearray","docs\u002Futils\u002Fshared\u002FensureArray",{"title":762,"path":763,"stem":764},"fetchWithRetry","\u002Fdocs\u002Futils\u002Fshared\u002Ffetchwithretry","docs\u002Futils\u002Fshared\u002FfetchWithRetry",{"title":766,"path":767,"stem":768},"filterEmptyValues","\u002Fdocs\u002Futils\u002Fshared\u002Ffilteremptyvalues","docs\u002Futils\u002Fshared\u002FfilterEmptyValues",{"title":770,"path":771,"stem":772},"findStringsInObject","\u002Fdocs\u002Futils\u002Fshared\u002Ffindobjectvalues","docs\u002Futils\u002Fshared\u002FfindObjectValues",{"title":774,"path":775,"stem":776},"fisherYatesShuffle","\u002Fdocs\u002Futils\u002Fshared\u002Ffisheryatesshuffle","docs\u002Futils\u002Fshared\u002FfisherYatesShuffle",{"title":778,"path":779,"stem":780},"getRandomImage","\u002Fdocs\u002Futils\u002Fshared\u002Fgetrandomimage","docs\u002Futils\u002Fshared\u002FgetRandomImage",{"title":782,"path":783,"stem":784},"isObjectHasValues","\u002Fdocs\u002Futils\u002Fshared\u002Fisobjecthasvalues","docs\u002Futils\u002Fshared\u002FisObjectHasValues",{"title":786,"path":787,"stem":788},"isAsyncOrPromise","\u002Fdocs\u002Futils\u002Fshared\u002Fispromise","docs\u002Futils\u002Fshared\u002FisPromise",{"title":790,"path":791,"stem":792},"MiniCache","\u002Fdocs\u002Futils\u002Fshared\u002Fminicache","docs\u002Futils\u002Fshared\u002FminiCache",{"title":794,"path":795,"stem":796},"parseCookies","\u002Fdocs\u002Futils\u002Fshared\u002Fparserawcookies","docs\u002Futils\u002Fshared\u002FparseRawCookies",{"title":798,"path":799,"stem":800},"safeAction","\u002Fdocs\u002Futils\u002Fshared\u002Fpromiselocker","docs\u002Futils\u002Fshared\u002FpromiseLocker",{"title":802,"path":803,"stem":804},"Random","\u002Fdocs\u002Futils\u002Fshared\u002Frandom","docs\u002Futils\u002Fshared\u002Frandom",{"title":806,"path":807,"stem":808},"range","\u002Fdocs\u002Futils\u002Fshared\u002Frange","docs\u002Futils\u002Fshared\u002Frange",{"title":810,"path":811,"stem":812},"rateLimiters","\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters","docs\u002Futils\u002Fshared\u002FrateLimiters",{"title":814,"path":815,"stem":816},"safeObjectMerge","\u002Fdocs\u002Futils\u002Fshared\u002Fsafemerge","docs\u002Futils\u002Fshared\u002FsafeMerge",{"title":818,"path":819,"stem":820},"textTruncation","\u002Fdocs\u002Futils\u002Fshared\u002Ftexttruncation","docs\u002Futils\u002Fshared\u002FtextTruncation",{"title":822,"path":823,"stem":824},"validateZodSchema","\u002Fdocs\u002Futils\u002Fshared\u002Fvalidatezodschema","docs\u002Futils\u002Fshared\u002FvalidateZodSchema",{"title":826,"path":827,"stem":828,"children":829},"Utility Types","\u002Fdocs\u002Futils\u002Ftypes","docs\u002Futils\u002Ftypes\u002Findex",[830,831,835,839,843,847,851,855,859,863],{"title":826,"path":827,"stem":828},{"title":832,"path":833,"stem":834},"Brand","\u002Fdocs\u002Futils\u002Ftypes\u002Fbrand","docs\u002Futils\u002Ftypes\u002FBrand",{"title":836,"path":837,"stem":838},"DeepPartial","\u002Fdocs\u002Futils\u002Ftypes\u002Fdeeppartial","docs\u002Futils\u002Ftypes\u002FDeepPartial",{"title":840,"path":841,"stem":842},"Merge","\u002Fdocs\u002Futils\u002Ftypes\u002Fmerge","docs\u002Futils\u002Ftypes\u002FMerge",{"title":844,"path":845,"stem":846},"NonNullable","\u002Fdocs\u002Futils\u002Ftypes\u002Fnonnullable","docs\u002Futils\u002Ftypes\u002FNonNullable",{"title":848,"path":849,"stem":850},"Prettify","\u002Fdocs\u002Futils\u002Ftypes\u002Fprettify","docs\u002Futils\u002Ftypes\u002FPrettify",{"title":852,"path":853,"stem":854},"PromiseType","\u002Fdocs\u002Futils\u002Ftypes\u002Fpromisetype","docs\u002Futils\u002Ftypes\u002FPromiseType",{"title":856,"path":857,"stem":858},"RequireKeys","\u002Fdocs\u002Futils\u002Ftypes\u002Frequirekeys","docs\u002Futils\u002Ftypes\u002FRequireKeys",{"title":860,"path":861,"stem":862},"StandardResponse","\u002Fdocs\u002Futils\u002Ftypes\u002Fstandardresponse","docs\u002Futils\u002Ftypes\u002FStandardResponse",{"title":864,"path":865,"stem":866},"ValueOf","\u002Fdocs\u002Futils\u002Ftypes\u002Fvalueof","docs\u002Futils\u002Ftypes\u002FValueOf",{"id":4,"extension":5,"links":868,"meta":879,"stem":62,"__hash__":63},[869,877,878],{"nested":8,"label":9,"icon":10,"to":11,"children":870},[871,872,873,874,875,876],{"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":881,"title":27,"body":882,"description":1027,"extension":1028,"icon":28,"meta":1029,"module":1030,"navigation":8,"path":29,"rawbody":1031,"seo":1032,"stem":70,"__hash__":1033},"docs\u002Fdocs\u002Fiam\u002Findex.md",{"type":883,"value":884,"toc":1021},"minimark",[885,913,916,925,928,937,942,996,1000],[886,887,888,892,893,900,901,906,907,912],"p",{},[889,890,891],"code",{},"@riavzon\u002Fauth"," is a production-grade authentication service built on ",[894,895,899],"a",{"href":896,"rel":897},"https:\u002F\u002Fexpressjs.com\u002F",[898],"nofollow","Express 5"," and ",[894,902,905],{"href":903,"rel":904},"https:\u002F\u002Fwww.mysql.com\u002F",[898],"MySQL",". It ships ready to use route sets, middleware, and a fully typed programmatic API that cover every layer of a modern auth stack: JWT access and refresh tokens with configurable rotation, multi-factor authentication, OAuth social login, behavioral anomaly detection, rate limiting, and secure email flows powered by ",[894,908,911],{"href":909,"rel":910},"https:\u002F\u002Fresend.com\u002F",[898],"Resend",".",[886,914,915],{},"You can use this service, as library to build your own custom flows, configure different part of it to suite your apps needs, and use the standalone service thats already shipped with it.",[886,917,918,919,921,922,924],{},"The service integrates directly with ",[894,920,429],{"href":35}," for IP geolocation and device fingerprinting, and uses ",[894,923,40],{"href":42}," databases for disposable-email and threat-intelligence checks.",[886,926,927],{},"The service is also available as a docker image.",[929,930,931],"note",{},[886,932,933,934,936],{},"IAM is designed to run as a standalone Express service. The ",[894,935,20],{"href":22}," module connects your Nuxt\u002FH3\u002FNitro frontend to this service with full session management, different OAuth providers and many other boilerplate to get you started quickly to actual building your app.",[938,939,941],"h2",{"id":940},"features","Features",[943,944,947,952,955,959,963,966,969,973,977,982,987,991],"u-page-grid",{"className":945},[946],"lg:grid-cols-3",[948,949],"u-page-card",{"description":950,"icon":21,"title":951},"Short-lived access tokens cached in memory for fast verification, and long-lived refresh tokens stored hashed in MySQL with configurable rotation on every use.","JWT Token Lifecycle",[948,953],{"description":954,"icon":99,"title":96},"Every refresh-token use runs through nine behavioral checks including canary-cookie matching, IP range comparison, idle-time detection, device fingerprint consistency, and integrates natively with the Bot Detector service.",[948,956],{"description":957,"icon":134,"title":958},"Email OTP links are issued automatically when an anomaly is detected. Custom MFA flows let you trigger verification for any sensitive action in your application.","Adaptive MFA",[948,960],{"description":961,"icon":119,"title":962},"Add any OAuth provider by defining a name and field mapping. Built-in support for standard profile schemas with automatic deduplication against existing accounts.","OAuth Social Login",[948,964],{"description":965,"icon":163,"title":160},"Fully configurable rate limiters for every sensitive endpoint. Backed by in-memory or MySQL stores with black and white list support.",[948,967],{"description":968,"icon":124,"title":121},"Signed temporary JWTs power password reset and MFA email flows. All link tokens are cached and single use by design.",[948,970],{"description":971,"icon":245,"title":972},"Argon2id hashing with a configurable pepper, time cost, memory cost, and hash length. Built-in disposable-email detection via Shield Base LMDB.","Password Security",[948,974],{"description":975,"icon":139,"title":976},"Optional shared-secret HMAC authentication layer for inter-service calls with clock-skew tolerance and request signing.","HMAC Service Auth",[948,978],{"description":979,"icon":980,"title":981},"The Auth H3 Client allows you easily to configure mTLS to the auth service.","i-lucide-file-badge","mTLS support",[948,983],{"description":984,"icon":985,"title":986},"Uses the haveibeenpwned api and searches it by hash range using k-anonymity to detect if new signing up users, uses leaked password, and if logging in users password was found in a data breach.","i-lucide-radar","Detects Leaked Credentials",[948,988],{"description":989,"icon":990,"title":155},"Ships with both HTTP logger and a general logger powered by pino.","i-lucide-terminal",[948,992],{"description":993,"icon":994,"title":995},"Comes with a hardened docker image with your secrets encrypted at rest, and deleted after they loaded.","i-lucide-container","Docker",[938,997,999],{"id":998},"documentation","Documentation",[943,1001,1002,1005,1008,1011,1015,1018],{},[948,1003],{"description":1004,"icon":15,"title":14,"to":74},"Prerequisites, installation, and first run.",[948,1006],{"description":1007,"icon":10,"title":77,"to":78},"Token lifecycle, authentication flows, anomaly detection, MFA, rate limiting, database schema, and every core subsystem.",[948,1009],{"description":1010,"icon":245,"title":38,"to":243},"Password hashing with Argon2id, cookie security, XSS defenses, and an overview of the defense strategy.",[948,1012],{"description":1013,"icon":1014,"title":247,"to":262},"RBAC, deployment, etc for using this service.","i-lucide-book-marked",[948,1016],{"description":1017,"icon":205,"title":265,"to":266},"Complete reference for the configuration object passed to the IAM service, including database, JWT, email, and rate-limiter options.",[948,1019],{"description":1020,"icon":270,"title":275,"to":276},"Complete reference for all exported functions, middlewares, and routes.",{"title":1022,"searchDepth":1023,"depth":1023,"links":1024},"",2,[1025,1026],{"id":940,"depth":1023,"text":941},{"id":998,"depth":1023,"text":999},"Production-grade Identity and Access Management for Node.js and Express","md",{},null,"---\ntitle: IAM\ndescription: Production-grade Identity and Access Management for Node.js and Express\nicon: i-lucide-shield-check\n---\n\n`@riavzon\u002Fauth` is a production-grade authentication service built on [Express 5](https:\u002F\u002Fexpressjs.com\u002F) and [MySQL](https:\u002F\u002Fwww.mysql.com\u002F). It ships ready to use route sets, middleware, and a fully typed programmatic API that cover every layer of a modern auth stack: JWT access and refresh tokens with configurable rotation, multi-factor authentication, OAuth social login, behavioral anomaly detection, rate limiting, and secure email flows powered by [Resend](https:\u002F\u002Fresend.com\u002F).\n\nYou can use this service, as library to build your own custom flows, configure different part of it to suite your apps needs, and use the standalone service thats already shipped with it.\n\nThe service integrates directly with [Bot Detector](\u002Fdocs\u002Fbot-detection) for IP geolocation and device fingerprinting, and uses [Shield Base](\u002Fdocs\u002Fshield-base) databases for disposable-email and threat-intelligence checks.\n\nThe service is also available as a docker image.\n\n::note\nIAM is designed to run as a standalone Express service. The [Auth H3 Client](\u002Fdocs\u002Fauth-h3client) module connects your Nuxt\u002FH3\u002FNitro frontend to this service with full session management, different OAuth providers and many other boilerplate to get you started quickly to actual building your app. \n::\n\n## Features\n\n::UPageGrid{class=\"lg:grid-cols-3\"}\n  ::UPageCard\n  ---\n  title: JWT Token Lifecycle\n  description: Short-lived access tokens cached in memory for fast verification, and long-lived refresh tokens stored hashed in MySQL with configurable rotation on every use.\n  icon: i-lucide-key-round\n  ---\n  ::\n\n  ::UPageCard\n  ---\n  title: Anomaly Detection\n  description: Every refresh-token use runs through nine behavioral checks including canary-cookie matching, IP range comparison, idle-time detection, device fingerprint consistency, and integrates natively with the Bot Detector service.\n  icon: i-lucide-scan-eye\n  ---\n  ::\n\n  ::UPageCard\n  ---\n  title: Adaptive MFA\n  description: Email OTP links are issued automatically when an anomaly is detected. Custom MFA flows let you trigger verification for any sensitive action in your application.\n  icon: i-lucide-shield-alert\n  ---\n  ::\n\n  ::UPageCard\n  ---\n  title: OAuth Social Login\n  description: Add any OAuth provider by defining a name and field mapping. Built-in support for standard profile schemas with automatic deduplication against existing accounts.\n  icon: i-lucide-users\n  ---\n  ::\n\n  ::UPageCard\n  ---\n  title: Rate Limiting\n  description: Fully configurable rate limiters for every sensitive endpoint. Backed by in-memory or MySQL stores with black and white list support.\n  icon: i-lucide-gauge\n  ---\n  ::\n\n  ::UPageCard\n  ---\n  title: Magic Links\n  description: Signed temporary JWTs power password reset and MFA email flows. All link tokens are cached and single use by design.\n  icon: i-lucide-link\n  ---\n  ::\n\n  ::UPageCard\n  ---\n  title: Password Security\n  description: Argon2id hashing with a configurable pepper, time cost, memory cost, and hash length. Built-in disposable-email detection via Shield Base LMDB.\n  icon: i-lucide-lock-keyhole\n  ---\n  ::\n\n  ::UPageCard\n  ---\n  title: HMAC Service Auth\n  description: Optional shared-secret HMAC authentication layer for inter-service calls with clock-skew tolerance and request signing.\n  icon: i-lucide-fingerprint\n  ---\n  ::\n\n  ::UPageCard\n  ---\n  title: mTLS support\n  description: The Auth H3 Client allows you easily to configure mTLS to the auth service.\n  icon: i-lucide-file-badge\n  ---\n  ::\n\n  ::UPageCard\n  ---\n  title: Detects Leaked Credentials\n  description: Uses the haveibeenpwned api and searches it by hash range using k-anonymity to detect if new signing up users, uses leaked password, and if logging in users password was found in a data breach.\n  icon: i-lucide-radar\n  ---\n  ::\n\n  ::UPageCard\n  ---\n  title: Logging\n  description: Ships with both HTTP logger and a general logger powered by pino.\n  icon: i-lucide-terminal\n  ---\n  ::\n\n  ::UPageCard\n  ---\n  title: Docker\n  description: Comes with a hardened docker image with your secrets encrypted at rest, and deleted after they loaded.\n  icon: i-lucide-container\n  ---\n  ::\n::\n\n## Documentation\n::UPageGrid\n  ::UPageCard\n  ---\n  title: Getting Started\n  description: Prerequisites, installation, and first run.\n  icon: i-lucide-rocket\n  to: \u002Fdocs\u002Fiam\u002Fgetting-started\n  ---\n  ::\n\n  ::UPageCard\n  ---\n  title: Essentials\n  description: Token lifecycle, authentication flows, anomaly detection, MFA, rate limiting, database schema, and every core subsystem.\n  icon: i-lucide-book-open\n  to: \u002Fdocs\u002Fiam\u002Fessentials\n  ---\n  ::\n\n  ::UPageCard\n  ---\n  title: Security\n  description: Password hashing with Argon2id, cookie security, XSS defenses, and an overview of the defense strategy.\n  icon: i-lucide-lock-keyhole\n  to: \u002Fdocs\u002Fiam\u002Fsecurity\n  ---\n  ::\n\n  ::UPageCard\n  ---\n  title: Guides\n  description: RBAC, deployment, etc for using this service.\n  icon: i-lucide-book-marked\n  to: \u002Fdocs\u002Fiam\u002Fguides\u002Frbac\n  ---\n  ::\n\n  ::UPageCard\n  ---\n  title: Configuration\n  description: Complete reference for the configuration object passed to the IAM service, including database, JWT, email, and rate-limiter options.\n  icon: i-lucide-settings\n  to: \u002Fdocs\u002Fiam\u002Fconfiguration\n  ---\n  ::\n\n  ::UPageCard\n  ---\n  title: API Reference\n  description: Complete reference for all exported functions, middlewares, and routes.\n  icon: i-lucide-code\n  to: \u002Fdocs\u002Fiam\u002Fapi\u002Fapi\n  ---\n  ::\n::",{"title":27,"description":1027},"19gAnx_Gfa5RpJ3LB15BTZYSUvsTU7DQDkcasVd0FTg",[1030,1035],{"title":14,"path":74,"stem":75,"children":-1},{"id":881,"title":27,"body":1037,"description":1027,"extension":1028,"icon":28,"meta":1117,"module":1030,"navigation":8,"path":29,"rawbody":1031,"seo":1118,"stem":70,"__hash__":1033},{"type":883,"value":1038,"toc":1113},[1039,1052,1054,1060,1062,1068,1070,1097,1099],[886,1040,1041,892,1043,900,1046,906,1049,912],{},[889,1042,891],{},[894,1044,899],{"href":896,"rel":1045},[898],[894,1047,905],{"href":903,"rel":1048},[898],[894,1050,911],{"href":909,"rel":1051},[898],[886,1053,915],{},[886,1055,918,1056,921,1058,924],{},[894,1057,429],{"href":35},[894,1059,40],{"href":42},[886,1061,927],{},[929,1063,1064],{},[886,1065,933,1066,936],{},[894,1067,20],{"href":22},[938,1069,941],{"id":940},[943,1071,1073,1075,1077,1079,1081,1083,1085,1087,1089,1091,1093,1095],{"className":1072},[946],[948,1074],{"description":950,"icon":21,"title":951},[948,1076],{"description":954,"icon":99,"title":96},[948,1078],{"description":957,"icon":134,"title":958},[948,1080],{"description":961,"icon":119,"title":962},[948,1082],{"description":965,"icon":163,"title":160},[948,1084],{"description":968,"icon":124,"title":121},[948,1086],{"description":971,"icon":245,"title":972},[948,1088],{"description":975,"icon":139,"title":976},[948,1090],{"description":979,"icon":980,"title":981},[948,1092],{"description":984,"icon":985,"title":986},[948,1094],{"description":989,"icon":990,"title":155},[948,1096],{"description":993,"icon":994,"title":995},[938,1098,999],{"id":998},[943,1100,1101,1103,1105,1107,1109,1111],{},[948,1102],{"description":1004,"icon":15,"title":14,"to":74},[948,1104],{"description":1007,"icon":10,"title":77,"to":78},[948,1106],{"description":1010,"icon":245,"title":38,"to":243},[948,1108],{"description":1013,"icon":1014,"title":247,"to":262},[948,1110],{"description":1017,"icon":205,"title":265,"to":266},[948,1112],{"description":1020,"icon":270,"title":275,"to":276},{"title":1022,"searchDepth":1023,"depth":1023,"links":1114},[1115,1116],{"id":940,"depth":1023,"text":941},{"id":998,"depth":1023,"text":999},{},{"title":27,"description":1027},1780564513104]