[{"data":1,"prerenderedAt":3125},["ShallowReactive",2],{"navigation_docs":3,"-modules-identity-auth-reference":587,"-modules-identity-auth-reference-surround":3120},[4,50,155,441,504],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":49},"Get Started","i-lucide-rocket","\u002Fget-started","1.get-started",[10,15,20,25,30,35,40,45],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fget-started\u002Fintroduction","1.get-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fget-started\u002Finstallation","1.get-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Project structure","\u002Fget-started\u002Fproject-structure","1.get-started\u002F3.project-structure","i-lucide-folder-tree",{"title":26,"path":27,"stem":28,"icon":29},"Configuration","\u002Fget-started\u002Fconfiguration","1.get-started\u002F4.configuration","i-lucide-settings",{"title":31,"path":32,"stem":33,"icon":34},"Authentication","\u002Fget-started\u002Fauthentication","1.get-started\u002F5.authentication","i-lucide-lock",{"title":36,"path":37,"stem":38,"icon":39},"Adding modules","\u002Fget-started\u002Fadding-modules","1.get-started\u002F6.adding-modules","i-lucide-puzzle",{"title":41,"path":42,"stem":43,"icon":44},"Database","\u002Fget-started\u002Fdatabase","1.get-started\u002F7.database","i-lucide-database",{"title":46,"path":47,"stem":48,"icon":6},"Deployment","\u002Fget-started\u002Fdeployment","1.get-started\u002F8.deployment",false,{"title":51,"icon":52,"path":53,"stem":54,"children":55,"page":49},"Guide","i-lucide-book-open","\u002Fguide","2.guide",[56,90,115,125],{"title":57,"icon":49,"path":58,"stem":59,"children":60,"page":49},"Concepts","\u002Fguide\u002Fconcepts","2.guide\u002F1.concepts",[61,66,71,76,80,85],{"title":62,"path":63,"stem":64,"icon":65},"Architecture","\u002Fguide\u002Fconcepts\u002Farchitecture","2.guide\u002F1.concepts\u002F1.architecture","i-lucide-blocks",{"title":67,"path":68,"stem":69,"icon":70},"Access control","\u002Fguide\u002Fconcepts\u002Fauth-and-scopes","2.guide\u002F1.concepts\u002F2.auth-and-scopes","i-lucide-shield-check",{"title":72,"path":73,"stem":74,"icon":75},"Extension points","\u002Fguide\u002Fconcepts\u002Fextension-points","2.guide\u002F1.concepts\u002F3.extension-points","i-lucide-plug",{"title":77,"path":78,"stem":79,"icon":44},"Database extensions","\u002Fguide\u002Fconcepts\u002Fdatabase-extensions","2.guide\u002F1.concepts\u002F4.database-extensions",{"title":81,"path":82,"stem":83,"icon":84},"Identity","\u002Fguide\u002Fconcepts\u002Fidentity","2.guide\u002F1.concepts\u002F5.identity","i-lucide-fingerprint",{"title":86,"path":87,"stem":88,"icon":89},"Glossary","\u002Fguide\u002Fconcepts\u002Fglossary","2.guide\u002F1.concepts\u002F6.glossary","i-lucide-book-a",{"title":91,"icon":49,"path":92,"stem":93,"children":94,"page":49},"UX patterns","\u002Fguide\u002Fux-patterns","2.guide\u002F2.ux-patterns",[95,100,105,110],{"title":96,"path":97,"stem":98,"icon":99},"Layouts and navigation","\u002Fguide\u002Fux-patterns\u002Flayouts-and-navigation","2.guide\u002F2.ux-patterns\u002F1.layouts-and-navigation","i-lucide-layout-template",{"title":101,"path":102,"stem":103,"icon":104},"Pages","\u002Fguide\u002Fux-patterns\u002Fpages","2.guide\u002F2.ux-patterns\u002F2.pages","i-lucide-table",{"title":106,"path":107,"stem":108,"icon":109},"Forms and actions","\u002Fguide\u002Fux-patterns\u002Fforms-and-actions","2.guide\u002F2.ux-patterns\u002F3.forms-and-actions","i-lucide-square-pen",{"title":111,"path":112,"stem":113,"icon":114},"Text and formatting","\u002Fguide\u002Fux-patterns\u002Ftext-and-formatting","2.guide\u002F2.ux-patterns\u002F4.text-and-formatting","i-lucide-type",{"title":116,"icon":49,"path":117,"stem":118,"children":119,"page":49},"Best practices","\u002Fguide\u002Fbest-practices","2.guide\u002F3.best-practices",[120],{"title":121,"path":122,"stem":123,"icon":124},"HTTP routes","\u002Fguide\u002Fbest-practices\u002Fhttp-routes","2.guide\u002F3.best-practices\u002F1.http-routes","i-lucide-route",{"title":126,"icon":49,"path":127,"stem":128,"children":129,"page":49},"Going further","\u002Fguide\u002Fgoing-further","2.guide\u002F4.going-further",[130,135,140,145,150],{"title":131,"path":132,"stem":133,"icon":134},"Use your own OAuth server","\u002Fguide\u002Fgoing-further\u002Fown-oauth-server","2.guide\u002F4.going-further\u002F1.own-oauth-server","i-lucide-key-round",{"title":136,"path":137,"stem":138,"icon":139},"Create an OAuth application","\u002Fguide\u002Fgoing-further\u002Foauth-application","2.guide\u002F4.going-further\u002F2.oauth-application","i-lucide-app-window",{"title":141,"path":142,"stem":143,"icon":144},"Signing keys","\u002Fguide\u002Fgoing-further\u002Fsigning-keys","2.guide\u002F4.going-further\u002F3.signing-keys","i-lucide-key-square",{"title":146,"path":147,"stem":148,"icon":149},"Stripe setup","\u002Fguide\u002Fgoing-further\u002Fstripe-setup","2.guide\u002F4.going-further\u002F4.stripe-setup","i-lucide-credit-card",{"title":151,"path":152,"stem":153,"icon":154},"Migrate to the permission model","\u002Fguide\u002Fgoing-further\u002Fmigrate-access-control","2.guide\u002F4.going-further\u002F5.migrate-access-control","i-lucide-arrow-right-left",{"title":156,"icon":157,"path":158,"stem":159,"children":160},"Modules","i-lucide-boxes","\u002Fmodules","3.modules",[161,163,244,273,320,375],{"title":156,"path":158,"stem":162},"3.modules\u002Findex",{"title":81,"icon":49,"path":164,"stem":165,"children":166,"page":49},"\u002Fmodules\u002Fidentity","3.modules\u002F1.identity",[167,190,194,198,220,224,240],{"title":168,"path":169,"stem":170,"children":171},"Auth","\u002Fmodules\u002Fidentity\u002Fauth","3.modules\u002F1.identity\u002F1.auth\u002Findex",[172,174,178,182,186],{"title":173,"path":169,"stem":170},"Overview",{"title":175,"path":176,"stem":177},"Server API","\u002Fmodules\u002Fidentity\u002Fauth\u002Fserver","3.modules\u002F1.identity\u002F1.auth\u002F2.server",{"title":179,"path":180,"stem":181},"Reference","\u002Fmodules\u002Fidentity\u002Fauth\u002Freference","3.modules\u002F1.identity\u002F1.auth\u002F3.reference",{"title":183,"path":184,"stem":185},"Client mode","\u002Fmodules\u002Fidentity\u002Fauth\u002Fclient-mode","3.modules\u002F1.identity\u002F1.auth\u002F4.client-mode",{"title":187,"path":188,"stem":189},"OAuth providers","\u002Fmodules\u002Fidentity\u002Fauth\u002Foauth-providers","3.modules\u002F1.identity\u002F1.auth\u002F5.oauth-providers",{"title":191,"path":192,"stem":193},"Users","\u002Fmodules\u002Fidentity\u002Fusers","3.modules\u002F1.identity\u002F2.users",{"title":195,"path":196,"stem":197},"Account","\u002Fmodules\u002Fidentity\u002Faccount","3.modules\u002F1.identity\u002F3.account",{"title":199,"path":200,"stem":201,"children":202},"Authorization","\u002Fmodules\u002Fidentity\u002Fauthorization","3.modules\u002F1.identity\u002F4.authorization\u002Findex",[203,204,208,212,216],{"title":173,"path":200,"stem":201},{"title":205,"path":206,"stem":207},"Roles and requirements","\u002Fmodules\u002Fidentity\u002Fauthorization\u002Froles-and-requirements","3.modules\u002F1.identity\u002F4.authorization\u002F2.roles-and-requirements",{"title":209,"path":210,"stem":211},"Policies","\u002Fmodules\u002Fidentity\u002Fauthorization\u002Fpolicies","3.modules\u002F1.identity\u002F4.authorization\u002F3.policies",{"title":213,"path":214,"stem":215},"Client","\u002Fmodules\u002Fidentity\u002Fauthorization\u002Fclient","3.modules\u002F1.identity\u002F4.authorization\u002F4.client",{"title":217,"path":218,"stem":219},"Admin","\u002Fmodules\u002Fidentity\u002Fauthorization\u002Fadmin","3.modules\u002F1.identity\u002F4.authorization\u002F5.admin",{"title":221,"path":222,"stem":223},"Preferences","\u002Fmodules\u002Fidentity\u002Fpreferences","3.modules\u002F1.identity\u002F5.preferences",{"title":225,"path":226,"stem":227,"children":228},"OAuth Server","\u002Fmodules\u002Fidentity\u002Foauth-server","3.modules\u002F1.identity\u002F6.oauth-server\u002Findex",[229,230,233,237],{"title":173,"path":226,"stem":227},{"title":175,"path":231,"stem":232},"\u002Fmodules\u002Fidentity\u002Foauth-server\u002Fserver","3.modules\u002F1.identity\u002F6.oauth-server\u002F2.server",{"title":234,"path":235,"stem":236},"Hooks","\u002Fmodules\u002Fidentity\u002Foauth-server\u002Fhooks","3.modules\u002F1.identity\u002F6.oauth-server\u002F3.hooks",{"title":179,"path":238,"stem":239},"\u002Fmodules\u002Fidentity\u002Foauth-server\u002Froutes-and-clients","3.modules\u002F1.identity\u002F6.oauth-server\u002F4.routes-and-clients",{"title":241,"path":242,"stem":243},"OAuth Resource","\u002Fmodules\u002Fidentity\u002Foauth-resource","3.modules\u002F1.identity\u002F8.oauth-resource",{"title":245,"icon":49,"path":246,"stem":247,"children":248,"page":49},"Commerce","\u002Fmodules\u002Fcommerce","3.modules\u002F2.commerce",[249,253,257],{"title":250,"path":251,"stem":252},"Stripe","\u002Fmodules\u002Fcommerce\u002Fstripe","3.modules\u002F2.commerce\u002F1.stripe",{"title":254,"path":255,"stem":256},"Payments","\u002Fmodules\u002Fcommerce\u002Fpayments","3.modules\u002F2.commerce\u002F2.payments",{"title":258,"path":259,"stem":260,"children":261},"Subscriptions","\u002Fmodules\u002Fcommerce\u002Fsubscriptions","3.modules\u002F2.commerce\u002F3.subscriptions\u002Findex",[262,263,266,270],{"title":173,"path":259,"stem":260},{"title":175,"path":264,"stem":265},"\u002Fmodules\u002Fcommerce\u002Fsubscriptions\u002Fserver","3.modules\u002F2.commerce\u002F3.subscriptions\u002F2.server",{"title":267,"path":268,"stem":269},"App","\u002Fmodules\u002Fcommerce\u002Fsubscriptions\u002Fapp","3.modules\u002F2.commerce\u002F3.subscriptions\u002F3.app",{"title":179,"path":271,"stem":272},"\u002Fmodules\u002Fcommerce\u002Fsubscriptions\u002Freference","3.modules\u002F2.commerce\u002F3.subscriptions\u002F4.reference",{"title":274,"icon":49,"path":275,"stem":276,"children":277,"page":49},"Features","\u002Fmodules\u002Ffeatures","3.modules\u002F3.features",[278,293,312,316],{"title":279,"path":280,"stem":281,"children":282},"Events","\u002Fmodules\u002Ffeatures\u002Fevents","3.modules\u002F3.features\u002F1.events\u002Findex",[283,284,287,290],{"title":173,"path":280,"stem":281},{"title":175,"path":285,"stem":286},"\u002Fmodules\u002Ffeatures\u002Fevents\u002Fserver","3.modules\u002F3.features\u002F1.events\u002F2.server",{"title":267,"path":288,"stem":289},"\u002Fmodules\u002Ffeatures\u002Fevents\u002Fapp","3.modules\u002F3.features\u002F1.events\u002F3.app",{"title":179,"path":291,"stem":292},"\u002Fmodules\u002Ffeatures\u002Fevents\u002Freference","3.modules\u002F3.features\u002F1.events\u002F4.reference",{"title":294,"path":295,"stem":296,"children":297},"Forms","\u002Fmodules\u002Ffeatures\u002Fforms","3.modules\u002F3.features\u002F2.forms\u002Findex",[298,299,303,306,309],{"title":173,"path":295,"stem":296},{"title":300,"path":301,"stem":302},"Definition","\u002Fmodules\u002Ffeatures\u002Fforms\u002Fdefinition","3.modules\u002F3.features\u002F2.forms\u002F2.definition",{"title":175,"path":304,"stem":305},"\u002Fmodules\u002Ffeatures\u002Fforms\u002Fserver","3.modules\u002F3.features\u002F2.forms\u002F3.server",{"title":267,"path":307,"stem":308},"\u002Fmodules\u002Ffeatures\u002Fforms\u002Fapp","3.modules\u002F3.features\u002F2.forms\u002F4.app",{"title":179,"path":310,"stem":311},"\u002Fmodules\u002Ffeatures\u002Fforms\u002Freference","3.modules\u002F3.features\u002F2.forms\u002F5.reference",{"title":313,"path":314,"stem":315},"Cookie Consent","\u002Fmodules\u002Ffeatures\u002Fcookie-consent","3.modules\u002F3.features\u002F3.cookie-consent",{"title":317,"path":318,"stem":319},"MCP","\u002Fmodules\u002Ffeatures\u002Fmcp","3.modules\u002F3.features\u002F4.mcp",{"title":321,"icon":49,"path":322,"stem":323,"children":324,"page":49},"Interface","\u002Fmodules\u002Finterface","3.modules\u002F4.interface",[325,350,353,357,361],{"title":326,"path":327,"stem":328,"children":329},"UI","\u002Fmodules\u002Finterface\u002Fui","3.modules\u002F4.interface\u002F1.ui\u002Findex",[330,331,335,339,343,347],{"title":173,"path":327,"stem":328},{"title":332,"path":333,"stem":334},"Page components","\u002Fmodules\u002Finterface\u002Fui\u002Fpage-components","3.modules\u002F4.interface\u002F1.ui\u002F2.page-components",{"title":336,"path":337,"stem":338},"App shell","\u002Fmodules\u002Finterface\u002Fui\u002Fapp-shell","3.modules\u002F4.interface\u002F1.ui\u002F3.app-shell",{"title":340,"path":341,"stem":342},"Form inputs","\u002Fmodules\u002Finterface\u002Fui\u002Fform-inputs","3.modules\u002F4.interface\u002F1.ui\u002F4.form-inputs",{"title":344,"path":345,"stem":346},"Composables and helpers","\u002Fmodules\u002Finterface\u002Fui\u002Fcomposables","3.modules\u002F4.interface\u002F1.ui\u002F5.composables",{"title":179,"path":348,"stem":349},"\u002Fmodules\u002Finterface\u002Fui\u002Freference","3.modules\u002F4.interface\u002F1.ui\u002F6.reference",{"title":217,"path":351,"stem":352},"\u002Fmodules\u002Finterface\u002Fadmin","3.modules\u002F4.interface\u002F2.admin",{"title":354,"path":355,"stem":356},"Menu","\u002Fmodules\u002Finterface\u002Fmenu","3.modules\u002F4.interface\u002F3.menu",{"title":358,"path":359,"stem":360},"Widget","\u002Fmodules\u002Finterface\u002Fwidget","3.modules\u002F4.interface\u002F4.widget",{"title":362,"path":363,"stem":364,"children":365},"Mobile","\u002Fmodules\u002Finterface\u002Fmobile","3.modules\u002F4.interface\u002F5.mobile\u002Findex",[366,367,371],{"title":173,"path":363,"stem":364},{"title":368,"path":369,"stem":370},"CLI and devices","\u002Fmodules\u002Finterface\u002Fmobile\u002Fcli-and-devices","3.modules\u002F4.interface\u002F5.mobile\u002F2.cli-and-devices",{"title":372,"path":373,"stem":374},"Splash screen","\u002Fmodules\u002Finterface\u002Fmobile\u002Fsplash-screen","3.modules\u002F4.interface\u002F5.mobile\u002F3.splash-screen",{"title":376,"icon":49,"path":377,"stem":378,"children":379,"page":49},"Platform","\u002Fmodules\u002Fplatform","3.modules\u002F5.platform",[380,402,406,423],{"title":381,"path":382,"stem":383,"children":384},"Module Kit","\u002Fmodules\u002Fplatform\u002Fmodule-kit","3.modules\u002F5.platform\u002F1.module-kit\u002Findex",[385,386,390,394,398],{"title":173,"path":382,"stem":383},{"title":387,"path":388,"stem":389},"Server toolkit","\u002Fmodules\u002Fplatform\u002Fmodule-kit\u002Fserver-toolkit","3.modules\u002F5.platform\u002F1.module-kit\u002F2.server-toolkit",{"title":391,"path":392,"stem":393},"Registries and menus","\u002Fmodules\u002Fplatform\u002Fmodule-kit\u002Fregistries-and-menus","3.modules\u002F5.platform\u002F1.module-kit\u002F3.registries-and-menus",{"title":395,"path":396,"stem":397},"Translations","\u002Fmodules\u002Fplatform\u002Fmodule-kit\u002Fi18n","3.modules\u002F5.platform\u002F1.module-kit\u002F4.i18n",{"title":399,"path":400,"stem":401},"Database helpers","\u002Fmodules\u002Fplatform\u002Fmodule-kit\u002Fdatabase","3.modules\u002F5.platform\u002F1.module-kit\u002F5.database",{"title":403,"path":404,"stem":405},"Notify","\u002Fmodules\u002Fplatform\u002Fnotify","3.modules\u002F5.platform\u002F2.notify",{"title":407,"path":408,"stem":409,"children":410},"Email Templates","\u002Fmodules\u002Fplatform\u002Femail-templates","3.modules\u002F5.platform\u002F3.email-templates\u002Findex",[411,412,416,419],{"title":173,"path":408,"stem":409},{"title":413,"path":414,"stem":415},"Email components","\u002Fmodules\u002Fplatform\u002Femail-templates\u002Fcomponents","3.modules\u002F5.platform\u002F3.email-templates\u002F2.components",{"title":175,"path":417,"stem":418},"\u002Fmodules\u002Fplatform\u002Femail-templates\u002Fserver","3.modules\u002F5.platform\u002F3.email-templates\u002F3.server",{"title":420,"path":421,"stem":422},"Module emails","\u002Fmodules\u002Fplatform\u002Femail-templates\u002Fmodule-emails","3.modules\u002F5.platform\u002F3.email-templates\u002F4.module-emails",{"title":424,"path":425,"stem":426,"children":427},"Base Layer","\u002Fmodules\u002Fplatform\u002Fbase-layer","3.modules\u002F5.platform\u002F4.base-layer\u002Findex",[428,429,433,437],{"title":173,"path":425,"stem":426},{"title":430,"path":431,"stem":432},"Content collections","\u002Fmodules\u002Fplatform\u002Fbase-layer\u002Fcontent-collections","3.modules\u002F5.platform\u002F4.base-layer\u002F2.content-collections",{"title":434,"path":435,"stem":436},"Layouts and routing","\u002Fmodules\u002Fplatform\u002Fbase-layer\u002Flayouts-and-routing","3.modules\u002F5.platform\u002F4.base-layer\u002F3.layouts-and-routing",{"title":438,"path":439,"stem":440},"Composables and utils","\u002Fmodules\u002Fplatform\u002Fbase-layer\u002Fcomposables-and-utils","3.modules\u002F5.platform\u002F4.base-layer\u002F4.composables-and-utils",{"title":442,"icon":443,"path":444,"stem":445,"children":446,"page":49},"Examples","i-lucide-code-xml","\u002Fexamples","4.examples",[447,466,476],{"title":448,"icon":49,"path":449,"stem":450,"children":451,"page":49},"Starters","\u002Fexamples\u002Fstarters","4.examples\u002F1.starters",[452,456,461],{"title":453,"path":454,"stem":455,"icon":6},"Workspace starter","\u002Fexamples\u002Fstarters\u002Fworkspace","4.examples\u002F1.starters\u002F1.workspace",{"title":457,"path":458,"stem":459,"icon":460},"Mobile starter","\u002Fexamples\u002Fstarters\u002Fmobile","4.examples\u002F1.starters\u002F2.mobile","i-lucide-smartphone",{"title":462,"path":463,"stem":464,"icon":465},"Standalone mobile starter","\u002Fexamples\u002Fstarters\u002Fmobile-standalone","4.examples\u002F1.starters\u002F3.mobile-standalone","i-lucide-tablet-smartphone",{"title":467,"icon":49,"path":468,"stem":469,"children":470,"page":49},"Apps","\u002Fexamples\u002Fapps","4.examples\u002F2.apps",[471],{"title":472,"path":473,"stem":474,"icon":475},"Frigear website app","\u002Fexamples\u002Fapps\u002Ffrigear-nu-website","4.examples\u002F2.apps\u002F1.frigear-nu-website","i-lucide-layout-dashboard",{"title":477,"icon":49,"path":478,"stem":479,"children":480,"page":49},"Tasks","\u002Fexamples\u002Ftasks","4.examples\u002F3.tasks",[481,485,489,494,499],{"title":482,"path":483,"stem":484,"icon":70},"Protect a route","\u002Fexamples\u002Ftasks\u002Fprotect-a-route","4.examples\u002F3.tasks\u002F1.protect-a-route",{"title":486,"path":487,"stem":488,"icon":475},"Add an admin page","\u002Fexamples\u002Ftasks\u002Fadd-an-admin-page","4.examples\u002F3.tasks\u002F2.add-an-admin-page",{"title":490,"path":491,"stem":492,"icon":493},"Sell event tickets","\u002Fexamples\u002Ftasks\u002Fsell-event-tickets","4.examples\u002F3.tasks\u002F3.sell-event-tickets","i-lucide-ticket",{"title":495,"path":496,"stem":497,"icon":498},"Build a form","\u002Fexamples\u002Ftasks\u002Fbuild-a-form","4.examples\u002F3.tasks\u002F4.build-a-form","i-lucide-clipboard-list",{"title":500,"path":501,"stem":502,"icon":503},"Send an email","\u002Fexamples\u002Ftasks\u002Fsend-an-email","4.examples\u002F3.tasks\u002F5.send-an-email","i-lucide-mail",{"title":505,"icon":506,"path":507,"stem":508,"children":509,"page":49},"Contribute","i-lucide-git-pull-request","\u002Fcontribute","5.contribute",[510,513,518,544,549,552,556,571],{"title":173,"path":511,"stem":512,"icon":506},"\u002Fcontribute\u002Foverview","5.contribute\u002F1.overview",{"title":514,"path":515,"stem":516,"icon":517},"Local development","\u002Fcontribute\u002Flocal-development","5.contribute\u002F2.local-development","i-lucide-terminal",{"title":519,"icon":49,"path":520,"stem":521,"children":522,"page":49},"Writing a module","\u002Fcontribute\u002Fwriting-a-module","5.contribute\u002F3.writing-a-module",[523,527,532,536,541],{"title":524,"path":525,"stem":526,"icon":39},"Scaffold a module","\u002Fcontribute\u002Fwriting-a-module\u002Fscaffold","5.contribute\u002F3.writing-a-module\u002F1.scaffold",{"title":528,"path":529,"stem":530,"icon":531},"Setup checklist","\u002Fcontribute\u002Fwriting-a-module\u002Fsetup-checklist","5.contribute\u002F3.writing-a-module\u002F2.setup-checklist","i-lucide-list-checks",{"title":533,"path":534,"stem":535,"icon":44},"Database tables","\u002Fcontribute\u002Fwriting-a-module\u002Fdatabase-tables","5.contribute\u002F3.writing-a-module\u002F3.database-tables",{"title":537,"path":538,"stem":539,"icon":540},"Testing","\u002Fcontribute\u002Fwriting-a-module\u002Ftesting","5.contribute\u002F3.writing-a-module\u002F4.testing","i-lucide-flask-conical",{"title":67,"path":542,"stem":543,"icon":70},"\u002Fcontribute\u002Fwriting-a-module\u002Faccess-control","5.contribute\u002F3.writing-a-module\u002F5.access-control",{"title":545,"path":546,"stem":547,"icon":548},"Publishing","\u002Fcontribute\u002Fpublishing","5.contribute\u002F4.publishing","i-lucide-package-check",{"title":448,"path":550,"stem":551,"icon":6},"\u002Fcontribute\u002Fstarters","5.contribute\u002F5.starters",{"title":553,"path":554,"stem":555,"icon":52},"Documentation","\u002Fcontribute\u002Fdocumentation","5.contribute\u002F6.documentation",{"title":557,"icon":49,"path":558,"stem":559,"children":560,"page":49},"Tooling","\u002Fcontribute\u002Ftooling","5.contribute\u002F7.tooling",[561,566],{"title":562,"path":563,"stem":564,"icon":565},"CLI","\u002Fcontribute\u002Ftooling\u002Fcli","5.contribute\u002F7.tooling\u002F1.cli","i-lucide-square-terminal",{"title":567,"path":568,"stem":569,"icon":570},"ESLint config","\u002Fcontribute\u002Ftooling\u002Feslint-config","5.contribute\u002F7.tooling\u002F2.eslint-config","i-lucide-spell-check",{"title":572,"icon":49,"path":573,"stem":574,"children":575},"Decisions","\u002Fcontribute\u002Fdecisions","5.contribute\u002F8.decisions\u002Findex",[576,578,583],{"title":572,"path":573,"stem":574,"icon":577},"i-lucide-scale",{"title":579,"path":580,"stem":581,"icon":582},"Session lifetimes per OAuth client","\u002Fcontribute\u002Fdecisions\u002Foauth-token-lifetimes","5.contribute\u002F8.decisions\u002F1.oauth-token-lifetimes","i-lucide-timer",{"title":584,"path":585,"stem":586,"icon":70},"One permission model","\u002Fcontribute\u002Fdecisions\u002Fpermission-model","5.contribute\u002F8.decisions\u002F2.permission-model",{"id":588,"title":589,"body":590,"description":3113,"extension":3114,"links":3115,"meta":3116,"navigation":3117,"path":180,"seo":3118,"stem":181,"__hash__":3119},"docs\u002F3.modules\u002F1.identity\u002F1.auth\u002F3.reference.md","Auth reference",{"type":591,"value":592,"toc":3098},"minimark",[593,601,605,612,617,633,885,969,1002,1023,1063,1073,1077,1092,1111,1127,1131,1649,1656,1660,1674,1798,1824,1827,1834,1973,1999,2003,2024,2053,2627,2648,2658,2665,2676,2679,2683,2689,2728,2741,2744,2752,2875,2894,2904,2907,2933,3008,3073,3077,3094],[594,595,596,597,600],"p",{},"This page lists what Auth adds to your app: composables, hooks, routes, tables and translations. It is for app\ndevelopers and module authors. Server mode, except where a row says client mode. Set up the module first:\n",[598,599,173],"a",{"href":169},".",[602,603,267],"h2",{"id":604},"app",[594,606,607,608,611],{},"All composables are auto-imported. Re-declare one with the same name in your app to override it. Client mode has its\nown ",[598,609,267],{"href":610},"\u002Fmodules\u002Fidentity\u002Fauth\u002Fclient-mode#app"," section.",[613,614,616],"h3",{"id":615},"session-actions-and-the-api","Session, actions and the API",[594,618,619,620,623,624,628,629,632],{},"These are the same names as in ",[598,621,622],{"href":184},"client mode",". Code that only reads ",[625,626,627],"code",{},"loggedIn"," and\n",[625,630,631],{},"user"," runs in either kind of app:",[634,635,640],"pre",{"className":636,"code":637,"language":638,"meta":639,"style":639},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const { ready, loggedIn, user, fetch, clear } = useUserSession() \u002F\u002F nuxt-auth-utils' own\nconst { status, authenticated, login, logout } = useAuth()\nawait login({ returnTo: '\u002Forders' }) \u002F\u002F the login page, with ?redirect=\u002Forders\nawait logout() \u002F\u002F POST \u002Fapi\u002Fauth\u002Flogout, clears the session, then `\u002F` (`redirect: false` stays, a string goes there)\n\nconst { data: orders } = await useApi\u003COrder[]>('\u002Fapi\u002Fshop\u002Fme\u002Forders')\nconst me = await useNuxtApp().$api\u003CMe>('\u002Fapi\u002Fme')\n","ts","",[625,641,642,697,732,773,786,793,843],{"__ignoreMap":639},[643,644,647,651,655,659,662,665,667,670,672,675,677,680,683,686,690,693],"span",{"class":645,"line":646},"line",1,[643,648,650],{"class":649},"spNyl","const",[643,652,654],{"class":653},"sMK4o"," {",[643,656,658],{"class":657},"sTEyZ"," ready",[643,660,661],{"class":653},",",[643,663,664],{"class":657}," loggedIn",[643,666,661],{"class":653},[643,668,669],{"class":657}," user",[643,671,661],{"class":653},[643,673,674],{"class":657}," fetch",[643,676,661],{"class":653},[643,678,679],{"class":657}," clear ",[643,681,682],{"class":653},"}",[643,684,685],{"class":653}," =",[643,687,689],{"class":688},"s2Zo4"," useUserSession",[643,691,692],{"class":657},"() ",[643,694,696],{"class":695},"sHwdD","\u002F\u002F nuxt-auth-utils' own\n",[643,698,700,702,704,707,709,712,714,717,719,722,724,726,729],{"class":645,"line":699},2,[643,701,650],{"class":649},[643,703,654],{"class":653},[643,705,706],{"class":657}," status",[643,708,661],{"class":653},[643,710,711],{"class":657}," authenticated",[643,713,661],{"class":653},[643,715,716],{"class":657}," login",[643,718,661],{"class":653},[643,720,721],{"class":657}," logout ",[643,723,682],{"class":653},[643,725,685],{"class":653},[643,727,728],{"class":688}," useAuth",[643,730,731],{"class":657},"()\n",[643,733,735,739,741,744,747,751,754,757,761,764,767,770],{"class":645,"line":734},3,[643,736,738],{"class":737},"s7zQu","await",[643,740,716],{"class":688},[643,742,743],{"class":657},"(",[643,745,746],{"class":653},"{",[643,748,750],{"class":749},"swJcz"," returnTo",[643,752,753],{"class":653},":",[643,755,756],{"class":653}," '",[643,758,760],{"class":759},"sfazB","\u002Forders",[643,762,763],{"class":653},"'",[643,765,766],{"class":653}," }",[643,768,769],{"class":657},") ",[643,771,772],{"class":695},"\u002F\u002F the login page, with ?redirect=\u002Forders\n",[643,774,776,778,781,783],{"class":645,"line":775},4,[643,777,738],{"class":737},[643,779,780],{"class":688}," logout",[643,782,692],{"class":657},[643,784,785],{"class":695},"\u002F\u002F POST \u002Fapi\u002Fauth\u002Flogout, clears the session, then `\u002F` (`redirect: false` stays, a string goes there)\n",[643,787,789],{"class":645,"line":788},5,[643,790,792],{"emptyLinePlaceholder":791},true,"\n",[643,794,796,798,800,803,805,808,810,812,815,818,821,825,828,831,833,835,838,840],{"class":645,"line":795},6,[643,797,650],{"class":649},[643,799,654],{"class":653},[643,801,802],{"class":749}," data",[643,804,753],{"class":653},[643,806,807],{"class":657}," orders ",[643,809,682],{"class":653},[643,811,685],{"class":653},[643,813,814],{"class":737}," await",[643,816,817],{"class":688}," useApi",[643,819,820],{"class":653},"\u003C",[643,822,824],{"class":823},"sBMFI","Order",[643,826,827],{"class":657},"[]",[643,829,830],{"class":653},">",[643,832,743],{"class":657},[643,834,763],{"class":653},[643,836,837],{"class":759},"\u002Fapi\u002Fshop\u002Fme\u002Forders",[643,839,763],{"class":653},[643,841,842],{"class":657},")\n",[643,844,846,848,851,854,856,859,862,864,867,869,872,874,876,878,881,883],{"class":645,"line":845},7,[643,847,650],{"class":649},[643,849,850],{"class":657}," me ",[643,852,853],{"class":653},"=",[643,855,814],{"class":737},[643,857,858],{"class":688}," useNuxtApp",[643,860,861],{"class":657},"()",[643,863,600],{"class":653},[643,865,866],{"class":688},"$api",[643,868,820],{"class":653},[643,870,871],{"class":823},"Me",[643,873,830],{"class":653},[643,875,743],{"class":657},[643,877,763],{"class":653},[643,879,880],{"class":759},"\u002Fapi\u002Fme",[643,882,763],{"class":653},[643,884,842],{"class":657},[886,887,888,901],"table",{},[889,890,891],"thead",{},[892,893,894,898],"tr",{},[895,896,897],"th",{},"Name",[895,899,900],{},"In server mode",[902,903,904,936,954],"tbody",{},[892,905,906,912],{},[907,908,909],"td",{},[625,910,911],{},"useAuth()",[907,913,914,917,918,917,921,924,925,928,929,932,933,600],{},[625,915,916],{},"status",", ",[625,919,920],{},"authenticated",[625,922,923],{},"signingIn"," (always ",[625,926,927],{},"false","), ",[625,930,931],{},"login({ returnTo? })"," and ",[625,934,935],{},"logout({ redirect? })",[892,937,938,942],{},[907,939,940],{},[625,941,866],{},[907,943,944,947,948,932,951,953],{},[625,945,946],{},"$fetch"," for your app's own API. During a server render it forwards the incoming ",[625,949,950],{},"Cookie",[625,952,199],{}," headers.",[892,955,956,961],{},[907,957,958],{},[625,959,960],{},"useApi(url, options)",[907,962,963,966,967,600],{},[625,964,965],{},"useFetch"," through ",[625,968,866],{},[594,970,971,977,978,981,982,985,986,989,990,981,993,985,995,932,998,1001],{},[972,973,974,976],"strong",{},[625,975,911],{}," in server mode."," The cookie is the credential, so ",[625,979,980],{},"getAccessToken()"," returns ",[625,983,984],{},"null",". ",[625,987,988],{},"completeLogin()","\nthrows and ",[625,991,992],{},"isCallbackUrl()",[625,994,927],{},[625,996,997],{},"claims",[625,999,1000],{},"getClient()"," exist in client mode only.",[594,1003,1004,1006,1007,1010,1011,1014,1015,1018,1019,1022],{},[625,1005,866],{}," sends the caller's credentials ",[972,1008,1009],{},"only to this app",": a path (",[625,1012,1013],{},"\u002Fx",", not ",[625,1016,1017],{},"\u002F\u002Fx",") or a URL on the request's own\norigin. A ",[625,1020,1021],{},"baseURL"," is checked the same way. Any other URL goes out without them.",[1024,1025,1026,1034,1046,1053],"ul",{},[1027,1028,1029,1030,1033],"li",{},"During a server render, an own-origin URL is rewritten to its path, so the forwarded credentials stay in-process. The\nrequest's origin comes from the ",[625,1031,1032],{},"Host"," header, which a client can choose.",[1027,1035,1036,1037,932,1039,1041,1042,1045],{},"Only ",[625,1038,950],{},[625,1040,199],{}," are forwarded. They never replace a header the caller set, so a service token in\n",[625,1043,1044],{},"headers"," wins.",[1027,1047,1048,1049,1052],{},"They are attached after the caller's own ",[625,1050,1051],{},"onRequest"," hooks.",[1027,1054,1055,1056,1059,1060,600],{},"A ",[625,1057,1058],{},"401"," from this app while signed in clears the session. The user then goes to the sign-in page with ",[625,1061,1062],{},"?redirect=",[1064,1065,1066,1067,1069,1070,1072],"warning",{},"Your app must not provide its own ",[625,1068,866],{}," plugin, because Nuxt cannot define ",[625,1071,866],{}," twice. Remove yours and use Auth's.",[613,1074,1076],{"id":1075},"redirects","Redirects",[594,1078,1079,1080,917,1082,1085,1086,932,1089,600],{},"Every redirect after sign-in is followed only when it is a path on this site. That covers ",[625,1081,1062],{},[625,1083,1084],{},"afterLogin",",\nthe redirects of emailed links, ",[625,1087,1088],{},"login({ returnTo })",[625,1090,1091],{},"logout({ redirect })",[594,1093,1094,1095,1098,1099,1102,1103,1106,1107,1110],{},"The one check is ",[625,1096,1097],{},"isSafeRedirect(value)"," from ",[625,1100,1101],{},"@frigear-nu\u002Fauth\u002Fmode",". It rejects anything that does not start with\n",[625,1104,1105],{},"\u002F",", as well as ",[625,1108,1109],{},"\u002F\u002Fhost",", any backslash and ASCII control characters.",[594,1112,1113,1115,1116,1118,1119,1122,1123,1126],{},[598,1114,199],{"href":200}," uses the same function for the ",[625,1117,1062],{}," it passes along. Its\nconfigured ",[625,1120,1121],{},"redirectTo"," may be an absolute URL and is used as configured. ",[625,1124,1125],{},"client.redirect.login"," must be a path.",[613,1128,1130],{"id":1129},"sign-in-composables","Sign-in composables",[634,1132,1134],{"className":636,"code":1133,"language":638,"meta":639,"style":639},"const { login, pending, error, isEnabled, passwordLoginEnabled, passkeyLoginEnabled, oauthProviders } = useLogin()\nawait login({ email: 'ada@example.com', password: 'secret' })\n\nconst { register, pending, error, isEnabled } = useRegistration()\nawait register({ name: 'Ada', email: 'ada@example.com', password: 'secret' })\n\nconst { requestReset, resetPassword, pending, error, isEnabled } = usePasswordReset()\nawait requestReset({ email: 'ada@example.com' })\nawait resetPassword({ code, password, confirmPassword }) \u002F\u002F signs the user in\n\nconst { sendMagicLink, pending, error, isEnabled } = useMagicLink()\nawait sendMagicLink({ email: 'ada@example.com', name: 'Ada', redirect: '\u002Fdashboard' }) \u002F\u002F redirect: same-origin path\n\nconst { isEnabled, registerPasskey, authenticateWithPasskey, listPasskeys, removePasskey } = usePasskeys()\nawait registerPasskey(user.email, 'MacBook') \u002F\u002F the name is optional\nconst passkeys = await listPasskeys() \u002F\u002F [{ id, name, backedUp, transports, createdAt }], never the public key\nawait removePasskey(passkeys[0].id) \u002F\u002F only the signed-in user's own (404 otherwise)\n\nconst { login: loginPath, register: registerPath } = useAuthPages() \u002F\u002F '\u002Flogin' by default\n",[625,1135,1136,1183,1223,1227,1258,1308,1312,1347,1372,1402,1407,1438,1492,1497,1535,1564,1583,1609,1614],{"__ignoreMap":639},[643,1137,1138,1140,1142,1144,1146,1149,1151,1154,1156,1159,1161,1164,1166,1169,1171,1174,1176,1178,1181],{"class":645,"line":646},[643,1139,650],{"class":649},[643,1141,654],{"class":653},[643,1143,716],{"class":657},[643,1145,661],{"class":653},[643,1147,1148],{"class":657}," pending",[643,1150,661],{"class":653},[643,1152,1153],{"class":657}," error",[643,1155,661],{"class":653},[643,1157,1158],{"class":657}," isEnabled",[643,1160,661],{"class":653},[643,1162,1163],{"class":657}," passwordLoginEnabled",[643,1165,661],{"class":653},[643,1167,1168],{"class":657}," passkeyLoginEnabled",[643,1170,661],{"class":653},[643,1172,1173],{"class":657}," oauthProviders ",[643,1175,682],{"class":653},[643,1177,685],{"class":653},[643,1179,1180],{"class":688}," useLogin",[643,1182,731],{"class":657},[643,1184,1185,1187,1189,1191,1193,1196,1198,1200,1203,1205,1207,1210,1212,1214,1217,1219,1221],{"class":645,"line":699},[643,1186,738],{"class":737},[643,1188,716],{"class":688},[643,1190,743],{"class":657},[643,1192,746],{"class":653},[643,1194,1195],{"class":749}," email",[643,1197,753],{"class":653},[643,1199,756],{"class":653},[643,1201,1202],{"class":759},"ada@example.com",[643,1204,763],{"class":653},[643,1206,661],{"class":653},[643,1208,1209],{"class":749}," password",[643,1211,753],{"class":653},[643,1213,756],{"class":653},[643,1215,1216],{"class":759},"secret",[643,1218,763],{"class":653},[643,1220,766],{"class":653},[643,1222,842],{"class":657},[643,1224,1225],{"class":645,"line":734},[643,1226,792],{"emptyLinePlaceholder":791},[643,1228,1229,1231,1233,1236,1238,1240,1242,1244,1246,1249,1251,1253,1256],{"class":645,"line":775},[643,1230,650],{"class":649},[643,1232,654],{"class":653},[643,1234,1235],{"class":657}," register",[643,1237,661],{"class":653},[643,1239,1148],{"class":657},[643,1241,661],{"class":653},[643,1243,1153],{"class":657},[643,1245,661],{"class":653},[643,1247,1248],{"class":657}," isEnabled ",[643,1250,682],{"class":653},[643,1252,685],{"class":653},[643,1254,1255],{"class":688}," useRegistration",[643,1257,731],{"class":657},[643,1259,1260,1262,1264,1266,1268,1271,1273,1275,1278,1280,1282,1284,1286,1288,1290,1292,1294,1296,1298,1300,1302,1304,1306],{"class":645,"line":788},[643,1261,738],{"class":737},[643,1263,1235],{"class":688},[643,1265,743],{"class":657},[643,1267,746],{"class":653},[643,1269,1270],{"class":749}," name",[643,1272,753],{"class":653},[643,1274,756],{"class":653},[643,1276,1277],{"class":759},"Ada",[643,1279,763],{"class":653},[643,1281,661],{"class":653},[643,1283,1195],{"class":749},[643,1285,753],{"class":653},[643,1287,756],{"class":653},[643,1289,1202],{"class":759},[643,1291,763],{"class":653},[643,1293,661],{"class":653},[643,1295,1209],{"class":749},[643,1297,753],{"class":653},[643,1299,756],{"class":653},[643,1301,1216],{"class":759},[643,1303,763],{"class":653},[643,1305,766],{"class":653},[643,1307,842],{"class":657},[643,1309,1310],{"class":645,"line":795},[643,1311,792],{"emptyLinePlaceholder":791},[643,1313,1314,1316,1318,1321,1323,1326,1328,1330,1332,1334,1336,1338,1340,1342,1345],{"class":645,"line":845},[643,1315,650],{"class":649},[643,1317,654],{"class":653},[643,1319,1320],{"class":657}," requestReset",[643,1322,661],{"class":653},[643,1324,1325],{"class":657}," resetPassword",[643,1327,661],{"class":653},[643,1329,1148],{"class":657},[643,1331,661],{"class":653},[643,1333,1153],{"class":657},[643,1335,661],{"class":653},[643,1337,1248],{"class":657},[643,1339,682],{"class":653},[643,1341,685],{"class":653},[643,1343,1344],{"class":688}," usePasswordReset",[643,1346,731],{"class":657},[643,1348,1350,1352,1354,1356,1358,1360,1362,1364,1366,1368,1370],{"class":645,"line":1349},8,[643,1351,738],{"class":737},[643,1353,1320],{"class":688},[643,1355,743],{"class":657},[643,1357,746],{"class":653},[643,1359,1195],{"class":749},[643,1361,753],{"class":653},[643,1363,756],{"class":653},[643,1365,1202],{"class":759},[643,1367,763],{"class":653},[643,1369,766],{"class":653},[643,1371,842],{"class":657},[643,1373,1375,1377,1379,1381,1383,1386,1388,1390,1392,1395,1397,1399],{"class":645,"line":1374},9,[643,1376,738],{"class":737},[643,1378,1325],{"class":688},[643,1380,743],{"class":657},[643,1382,746],{"class":653},[643,1384,1385],{"class":657}," code",[643,1387,661],{"class":653},[643,1389,1209],{"class":657},[643,1391,661],{"class":653},[643,1393,1394],{"class":657}," confirmPassword ",[643,1396,682],{"class":653},[643,1398,769],{"class":657},[643,1400,1401],{"class":695},"\u002F\u002F signs the user in\n",[643,1403,1405],{"class":645,"line":1404},10,[643,1406,792],{"emptyLinePlaceholder":791},[643,1408,1410,1412,1414,1417,1419,1421,1423,1425,1427,1429,1431,1433,1436],{"class":645,"line":1409},11,[643,1411,650],{"class":649},[643,1413,654],{"class":653},[643,1415,1416],{"class":657}," sendMagicLink",[643,1418,661],{"class":653},[643,1420,1148],{"class":657},[643,1422,661],{"class":653},[643,1424,1153],{"class":657},[643,1426,661],{"class":653},[643,1428,1248],{"class":657},[643,1430,682],{"class":653},[643,1432,685],{"class":653},[643,1434,1435],{"class":688}," useMagicLink",[643,1437,731],{"class":657},[643,1439,1441,1443,1445,1447,1449,1451,1453,1455,1457,1459,1461,1463,1465,1467,1469,1471,1473,1476,1478,1480,1483,1485,1487,1489],{"class":645,"line":1440},12,[643,1442,738],{"class":737},[643,1444,1416],{"class":688},[643,1446,743],{"class":657},[643,1448,746],{"class":653},[643,1450,1195],{"class":749},[643,1452,753],{"class":653},[643,1454,756],{"class":653},[643,1456,1202],{"class":759},[643,1458,763],{"class":653},[643,1460,661],{"class":653},[643,1462,1270],{"class":749},[643,1464,753],{"class":653},[643,1466,756],{"class":653},[643,1468,1277],{"class":759},[643,1470,763],{"class":653},[643,1472,661],{"class":653},[643,1474,1475],{"class":749}," redirect",[643,1477,753],{"class":653},[643,1479,756],{"class":653},[643,1481,1482],{"class":759},"\u002Fdashboard",[643,1484,763],{"class":653},[643,1486,766],{"class":653},[643,1488,769],{"class":657},[643,1490,1491],{"class":695},"\u002F\u002F redirect: same-origin path\n",[643,1493,1495],{"class":645,"line":1494},13,[643,1496,792],{"emptyLinePlaceholder":791},[643,1498,1500,1502,1504,1506,1508,1511,1513,1516,1518,1521,1523,1526,1528,1530,1533],{"class":645,"line":1499},14,[643,1501,650],{"class":649},[643,1503,654],{"class":653},[643,1505,1158],{"class":657},[643,1507,661],{"class":653},[643,1509,1510],{"class":657}," registerPasskey",[643,1512,661],{"class":653},[643,1514,1515],{"class":657}," authenticateWithPasskey",[643,1517,661],{"class":653},[643,1519,1520],{"class":657}," listPasskeys",[643,1522,661],{"class":653},[643,1524,1525],{"class":657}," removePasskey ",[643,1527,682],{"class":653},[643,1529,685],{"class":653},[643,1531,1532],{"class":688}," usePasskeys",[643,1534,731],{"class":657},[643,1536,1538,1540,1542,1545,1547,1550,1552,1554,1557,1559,1561],{"class":645,"line":1537},15,[643,1539,738],{"class":737},[643,1541,1510],{"class":688},[643,1543,1544],{"class":657},"(user",[643,1546,600],{"class":653},[643,1548,1549],{"class":657},"email",[643,1551,661],{"class":653},[643,1553,756],{"class":653},[643,1555,1556],{"class":759},"MacBook",[643,1558,763],{"class":653},[643,1560,769],{"class":657},[643,1562,1563],{"class":695},"\u002F\u002F the name is optional\n",[643,1565,1567,1569,1572,1574,1576,1578,1580],{"class":645,"line":1566},16,[643,1568,650],{"class":649},[643,1570,1571],{"class":657}," passkeys ",[643,1573,853],{"class":653},[643,1575,814],{"class":737},[643,1577,1520],{"class":688},[643,1579,692],{"class":657},[643,1581,1582],{"class":695},"\u002F\u002F [{ id, name, backedUp, transports, createdAt }], never the public key\n",[643,1584,1586,1588,1591,1594,1598,1601,1603,1606],{"class":645,"line":1585},17,[643,1587,738],{"class":737},[643,1589,1590],{"class":688}," removePasskey",[643,1592,1593],{"class":657},"(passkeys[",[643,1595,1597],{"class":1596},"sbssI","0",[643,1599,1600],{"class":657},"]",[643,1602,600],{"class":653},[643,1604,1605],{"class":657},"id) ",[643,1607,1608],{"class":695},"\u002F\u002F only the signed-in user's own (404 otherwise)\n",[643,1610,1612],{"class":645,"line":1611},18,[643,1613,792],{"emptyLinePlaceholder":791},[643,1615,1617,1619,1621,1623,1625,1628,1630,1632,1634,1637,1639,1641,1644,1646],{"class":645,"line":1616},19,[643,1618,650],{"class":649},[643,1620,654],{"class":653},[643,1622,716],{"class":749},[643,1624,753],{"class":653},[643,1626,1627],{"class":657}," loginPath",[643,1629,661],{"class":653},[643,1631,1235],{"class":749},[643,1633,753],{"class":653},[643,1635,1636],{"class":657}," registerPath ",[643,1638,682],{"class":653},[643,1640,685],{"class":653},[643,1642,1643],{"class":688}," useAuthPages",[643,1645,692],{"class":657},[643,1647,1648],{"class":695},"\u002F\u002F '\u002Flogin' by default\n",[594,1650,1651,1652,1655],{},"The module also registers the ",[625,1653,1654],{},"AuthCard"," component when a sign-in page or a local sign-up page is on.",[602,1657,1659],{"id":1658},"access-declarations","Access declarations",[594,1661,1662,1665,1666,1669,1670,1673],{},[625,1663,1664],{},"@frigear-nu\u002Fauth\u002Faccess"," is framework-free: import it from ",[625,1667,1668],{},"nuxt.config.ts",", a module's ",[625,1671,1672],{},"module.ts",", server routes,\napp code and tests.",[886,1675,1676,1686],{},[889,1677,1678],{},[892,1679,1680,1683],{},[895,1681,1682],{},"Export",[895,1684,1685],{},"What it is",[902,1687,1688,1727,1749,1767,1786],{},[892,1689,1690,1695],{},[907,1691,1692],{},[625,1693,1694],{},"defineAccess(resource, { i18n?, permissions, scopes?, roles? })",[907,1696,1697,1698,1701,1702,1705,1706,1709,1710,1713,1714,917,1717,917,1720,1723,1724,600],{},"A module's permissions, named scopes and roles, keyed so the names are typed: ",[625,1699,1700],{},"eventsAccess.permissions.manage"," is ",[625,1703,1704],{},"'events:manage'",". Derives ",[625,1707,1708],{},"labelKey"," \u002F ",[625,1711,1712],{},"descriptionKey"," (",[625,1715,1716],{},"\u003Ci18n>.permissions.\u003Ckey>",[625,1718,1719],{},".scopes.\u003Ckey>",[625,1721,1722],{},".roles.\u003Ckey>","). See ",[598,1725,1726],{"href":542},"Access control for module authors",[892,1728,1729,1734],{},[907,1730,1731],{},[625,1732,1733],{},"defineRoles(roles)",[907,1735,1736,1737,1740,1741,1744,1745,1748],{},"Types the host's ",[625,1738,1739],{},"authorization.roles",": ",[625,1742,1743],{},"grant"," against the registered permissions, ",[625,1746,1747],{},"inherit"," against these and the modules' roles. Returns the roles unchanged.",[892,1750,1751,1756],{},[907,1752,1753],{},[625,1754,1755],{},"Permission",[907,1757,1758,1759,1762,1763,1766],{},"Every registered permission (from ",[625,1760,1761],{},".nuxt\u002Ftypes\u002Fauth-access.d.ts","); ",[625,1764,1765],{},"string"," where no app types are generated.",[892,1768,1769,1774],{},[907,1770,1771],{},[625,1772,1773],{},"PermissionGrant",[907,1775,1776,917,1778,1781,1782,1785],{},[625,1777,1755],{},[625,1779,1780],{},"*"," or ",[625,1783,1784],{},"resource:*",": what a role or a named scope may grant.",[892,1787,1788,1793],{},[907,1789,1790],{},[625,1791,1792],{},"RoleName",[907,1794,1795,1796,600],{},"Every compiled role: modules' roles and ",[625,1797,1739],{},[594,1799,1800,1098,1803,1806,1807,1810,1811,1814,1815,1818,1819,932,1821,1823],{},[625,1801,1802],{},"registerAccess(nuxt, access, { permissions?, scopes?, roles?, from? })",[625,1804,1805],{},"@frigear-nu\u002Fauth\u002Futils"," registers an\naccess declaration from a module's ",[625,1808,1809],{},"setup()",". The generated types augment the global interfaces ",[625,1812,1813],{},"FrigearPermissions","\nand ",[625,1816,1817],{},"FrigearRoles","; ",[625,1820,1755],{},[625,1822,1792],{}," are their keys.",[602,1825,234],{"id":1826},"hooks",[594,1828,1829,1830,1833],{},"Your app answers the Nitro hooks from a server plugin (",[625,1831,1832],{},"server\u002Fplugins\u002F*.ts","). The other rows are build-time and app\nhooks.",[886,1835,1836,1849],{},[889,1837,1838],{},[892,1839,1840,1843,1846],{},[895,1841,1842],{},"Hook",[895,1844,1845],{},"When",[895,1847,1848],{},"Payload",[902,1850,1851,1880,1896,1911,1926,1947],{},[892,1852,1853,1859,1862],{},[907,1854,1855,1858],{},[625,1856,1857],{},"authorization:before"," (Nitro)",[907,1860,1861],{},"Every permission check that passes the credential's own limits",[907,1863,1864,1867,1868,1871,1872,1875,1876,600],{},[625,1865,1866],{},"{ event, principal, user, permission, record, allow(), deny() }",". Any ",[625,1869,1870],{},"deny()"," or a throw denies; otherwise any ",[625,1873,1874],{},"allow()"," allows. See ",[598,1877,1879],{"href":1878},"\u002Fmodules\u002Fidentity\u002Fauth\u002Fserver#answer-with-the-before-hook","Answer with the before hook",[892,1881,1882,1887,1890],{},[907,1883,1884,1858],{},[625,1885,1886],{},"authorization:roles",[907,1888,1889],{},"A user's effective roles are resolved",[907,1891,1892,1895],{},[625,1893,1894],{},"{ event, user, roles }",". Add or remove roles.",[892,1897,1898,1903,1906],{},[907,1899,1900,1858],{},[625,1901,1902],{},"auth:email",[907,1904,1905],{},"A sign-in link or verification email is about to be sent",[907,1907,1908],{},[625,1909,1910],{},"{ type, notification, data: { name, url } }",[892,1912,1913,1918,1921],{},[907,1914,1915,1858],{},[625,1916,1917],{},"auth:credentials:changed",[907,1919,1920],{},"A user's password was changed or reset, their email changed or the change was reverted, or an unverified account's credentials were cleared when its address was first verified another way",[907,1922,1923],{},[625,1924,1925],{},"{ userId, reason: 'password' | 'password-reset' | 'email' | 'email-revert' | 'unverified-account', event? }",[892,1927,1928,1937,1940],{},[907,1929,1930,917,1933,1936],{},[625,1931,1932],{},"auth:resolvers",[625,1934,1935],{},"auth:user-store"," (Nuxt)",[907,1938,1939],{},"Build time, when the virtual modules are generated",[907,1941,1942,1943],{},"See ",[598,1944,1946],{"href":1945},"\u002Fmodules\u002Fidentity\u002Fauth\u002Fserver#extend-auth-at-build-time","Extend Auth at build time",[892,1948,1949,1964,1967],{},[907,1950,1951,917,1954,917,1957,917,1960,1963],{},[625,1952,1953],{},"auth:signed-in",[625,1955,1956],{},"auth:signed-out",[625,1958,1959],{},"auth:refresh-failed",[625,1961,1962],{},"auth:user-failed"," (app)",[907,1965,1966],{},"Client mode only",[907,1968,1942,1969],{},[598,1970,1972],{"href":1971},"\u002Fmodules\u002Fidentity\u002Fauth\u002Fclient-mode#hooks","Client mode hooks",[594,1974,1975,1979,1980,1983,1984,1987,1988,932,1991,1994,1995,1998],{},[972,1976,1977],{},[625,1978,1917],{}," lets other modules react to a credential change.\n",[598,1981,225],{"href":1982},"\u002Fmodules\u002Fidentity\u002Foauth-server\u002Froutes-and-clients#ending-sign-ins"," uses it to end the user's sign-ins\nin applications. Fire it from your own credential flows with\n",[625,1985,1986],{},"notifyAuthCredentialsChanged(ctx)",". Before the listeners run, it ends the user's other sessions and, for\n",[625,1989,1990],{},"password-reset",[625,1992,1993],{},"email-revert",", revokes their API tokens (",[625,1996,1997],{},"apiTokens.revokeOnReset","). A failing listener is logged,\nnever thrown.",[602,2000,2002],{"id":2001},"routes","Routes",[594,2004,2005,2006,2009,2010,2013,2014,1098,2017,2020,2021,600],{},"Routes the module registers, and who may call them. They live under ",[625,2007,2008],{},"\u002Fapi\u002Fauth",", registered with ",[625,2011,2012],{},"addModuleRoutes",".\n",[625,2015,2016],{},"authApi",[625,2018,2019],{},"@frigear-nu\u002Fauth\u002Fapi"," builds every path, for example ",[625,2022,2023],{},"authApi.me.token(id)",[1024,2025,2026,2040,2050],{},[1027,2027,2028,2029,2032,2033,2036,2037,600],{},"Errors carry ",[625,2030,2031],{},"statusMessage"," and a snake_case ",[625,2034,2035],{},"data.code",". Validation failures are h3's ",[625,2038,2039],{},"400",[1027,2041,2042,2043,932,2046,2049],{},"The OAuth callbacks (",[625,2044,2045],{},"\u002Fapi\u002Fauth\u002F\u003Cprovider>",[625,2047,2048],{},"\u002Fauth\u002Ffrigear",") are redirect URIs registered at the provider. They\nnever move.",[1027,2051,2052],{},"The option in brackets at the end of a row is the one that turns the route on.",[886,2054,2055,2073],{},[889,2056,2057],{},[892,2058,2059,2062,2065,2067,2070],{},[895,2060,2061],{},"Method",[895,2063,2064],{},"Path",[895,2066,168],{},[895,2068,2069],{},"Status",[895,2071,2072],{},"Purpose",[902,2074,2075,2098,2132,2163,2190,2221,2244,2273,2302,2328,2354,2379,2401,2432,2453,2478,2506,2535,2556,2581,2604],{},[892,2076,2077,2082,2087,2090,2093],{},[907,2078,2079],{},[625,2080,2081],{},"POST",[907,2083,2084],{},[625,2085,2086],{},"\u002Fapi\u002Fauth\u002Flogout",[907,2088,2089],{},"none",[907,2091,2092],{},"204",[907,2094,2095,2096,600],{},"Clears the session. The account menu's sign-out item posts here, then reloads ",[625,2097,1105],{},[892,2099,2100,2104,2109,2111,2114],{},[907,2101,2102],{},[625,2103,2081],{},[907,2105,2106],{},[625,2107,2108],{},"\u002Fapi\u002Fauth\u002Flogin",[907,2110,2089],{},[907,2112,2113],{},"200",[907,2115,2116,2117,2120,2121,2124,2125,1713,2128,2131],{},"Email and password sign-in. ",[625,2118,2119],{},"401 invalid_credentials",", or ",[625,2122,2123],{},"403 email_not_verified"," with ",[625,2126,2127],{},"verifyEmail",[625,2129,2130],{},"password",").",[892,2133,2134,2138,2143,2145,2148],{},[907,2135,2136],{},[625,2137,2081],{},[907,2139,2140],{},[625,2141,2142],{},"\u002Fapi\u002Fauth\u002Fregister",[907,2144,2089],{},[907,2146,2147],{},"201",[907,2149,2150,2153,2154,985,2157,2160,2161,2131],{},[625,2151,2152],{},"{ name (max 120), email, password }",". Returns ",[625,2155,2156],{},"{ id, verificationRequired }",[625,2158,2159],{},"409 conflict"," when the email is taken (",[625,2162,2130],{},[892,2164,2165,2169,2174,2176,2178],{},[907,2166,2167],{},[625,2168,2081],{},[907,2170,2171],{},[625,2172,2173],{},"\u002Fapi\u002Fauth\u002Fforgot-password",[907,2175,2089],{},[907,2177,2113],{},[907,2179,2180,2181,2183,2184,1713,2187,2131],{},"Emails a reset link for ",[625,2182,1549],{},". Always answers ",[625,2185,2186],{},"{ ok: true }",[625,2188,2189],{},"passwordReset",[892,2191,2192,2196,2201,2203,2205],{},[907,2193,2194],{},[625,2195,2081],{},[907,2197,2198],{},[625,2199,2200],{},"\u002Fapi\u002Fauth\u002Freset-password",[907,2202,2089],{},[907,2204,2113],{},[907,2206,2207,2208,917,2210,917,2212,2215,2216,1713,2219,2131],{},"Resets with ",[625,2209,625],{},[625,2211,2130],{},[625,2213,2214],{},"confirmPassword",", then signs in. ",[625,2217,2218],{},"400 invalid_link",[625,2220,2189],{},[892,2222,2223,2227,2232,2234,2236],{},[907,2224,2225],{},[625,2226,2081],{},[907,2228,2229],{},[625,2230,2231],{},"\u002Fapi\u002Fauth\u002Fmagic-link",[907,2233,2089],{},[907,2235,2113],{},[907,2237,2238,2239,1713,2241,2131],{},"Emails a single-use sign-in link. Always answers ",[625,2240,2186],{},[625,2242,2243],{},"magicLink",[892,2245,2246,2250,2255,2258,2260],{},[907,2247,2248],{},[625,2249,2081],{},[907,2251,2252],{},[625,2253,2254],{},"\u002Fapi\u002Fauth\u002Fmagic-link\u002Fconfirm",[907,2256,2257],{},"none (the code)",[907,2259,2113],{},[907,2261,2262,2265,2266,1713,2269,1781,2271,2131],{},[625,2263,2264],{},"{ code }",". Uses up the link, verifies the email, signs in and returns ",[625,2267,2268],{},"{ redirect }",[625,2270,2243],{},[625,2272,2127],{},[892,2274,2275,2279,2284,2287,2289],{},[907,2276,2277],{},[625,2278,2081],{},[907,2280,2281],{},[625,2282,2283],{},"\u002Fapi\u002Fauth\u002Fwebauthn\u002Fregister",[907,2285,2286],{},"session for existing users",[907,2288,2113],{},[907,2290,2291,2292,2294,2295,2298,2299,2131],{},"Registers a passkey. An unknown email creates the account, unless ",[625,2293,2127],{}," is on (",[625,2296,2297],{},"403 email_verification_required",") (",[625,2300,2301],{},"webAuthn",[892,2303,2304,2308,2313,2315,2317],{},[907,2305,2306],{},[625,2307,2081],{},[907,2309,2310],{},[625,2311,2312],{},"\u002Fapi\u002Fauth\u002Fwebauthn\u002Fauthenticate",[907,2314,2089],{},[907,2316,2113],{},[907,2318,2319,2320,2120,2322,2124,2324,1713,2326,2131],{},"Signs in with a passkey. Every failure is the same ",[625,2321,2119],{},[625,2323,2123],{},[625,2325,2127],{},[625,2327,2301],{},[892,2329,2330,2335,2340,2343,2345],{},[907,2331,2332],{},[625,2333,2334],{},"GET",[907,2336,2337],{},[625,2338,2339],{},"\u002Fapi\u002Fauth\u002Fme\u002Fpasskeys",[907,2341,2342],{},"session only",[907,2344,2113],{},[907,2346,2347,2348,2351,2352,2131],{},"Your passkeys: ",[625,2349,2350],{},"[{ id, name, backedUp, transports, createdAt }]",", never the public key (",[625,2353,2301],{},[892,2355,2356,2361,2366,2368,2370],{},[907,2357,2358],{},[625,2359,2360],{},"DELETE",[907,2362,2363],{},[625,2364,2365],{},"\u002Fapi\u002Fauth\u002Fme\u002Fpasskeys\u002F:id",[907,2367,2342],{},[907,2369,2092],{},[907,2371,2372,2373,2376,2377,2131],{},"Removes one of your passkeys. ",[625,2374,2375],{},"404 not_found"," for anyone else's (",[625,2378,2301],{},[892,2380,2381,2385,2390,2392,2394],{},[907,2382,2383],{},[625,2384,2334],{},[907,2386,2387],{},[625,2388,2389],{},"\u002Fapi\u002Fauth\u002Fme\u002Ftokens",[907,2391,2342],{},[907,2393,2113],{},[907,2395,2396,2397,2400],{},"Your API tokens: ",[625,2398,2399],{},"[{ id, name, prefix, last4, scopes, expiresAt, lastUsedAt, createdAt, status }]"," (ISO dates).",[892,2402,2403,2407,2411,2413,2415],{},[907,2404,2405],{},[625,2406,2081],{},[907,2408,2409],{},[625,2410,2389],{},[907,2412,2342],{},[907,2414,2147],{},[907,2416,2417,2418,2421,2422,2425,2426,917,2429,600],{},"Creates ",[625,2419,2420],{},"{ name, scopes (1 to 50), expiresInDays? }",". The permissions the scopes stand for are frozen on the token. The plaintext ",[625,2423,2424],{},"token"," is in this response only. ",[625,2427,2428],{},"400 unknown_scope",[625,2430,2431],{},"403 insufficient_permission",[892,2433,2434,2438,2443,2445,2447],{},[907,2435,2436],{},[625,2437,2360],{},[907,2439,2440],{},[625,2441,2442],{},"\u002Fapi\u002Fauth\u002Fme\u002Ftokens\u002F:id",[907,2444,2342],{},[907,2446,2092],{},[907,2448,2449,2450,2452],{},"Revokes a token. The row is kept for the audit trail. ",[625,2451,2375],{}," for anyone else's.",[892,2454,2455,2459,2464,2466,2468],{},[907,2456,2457],{},[625,2458,2334],{},[907,2460,2461],{},[625,2462,2463],{},"\u002Fapi\u002Fauth\u002Fscopes",[907,2465,2342],{},[907,2467,2113],{},[907,2469,2470,2471,2474,2475,2477],{},"The scopes you may give a token (",[625,2472,2473],{},"canGrantScope","): ",[625,2476,1780],{},", the named scopes, then the permissions.",[892,2479,2480,2484,2489,2492,2494],{},[907,2481,2482],{},[625,2483,2334],{},[907,2485,2486],{},[625,2487,2488],{},"\u002Fapi\u002Fauth\u002Fme\u002Faccess",[907,2490,2491],{},"any credential",[907,2493,2113],{},[907,2495,2496,2497,917,2500,985,2503,2505],{},"What the caller may do: ",[625,2498,2499],{},"{ kind, scopes, permissions, roles? }",[625,2501,2502],{},"Cache-Control: private, no-store",[625,2504,1058],{}," without a credential.",[892,2507,2508,2512,2517,2520,2522],{},[907,2509,2510],{},[625,2511,2334],{},[907,2513,2514],{},[625,2515,2516],{},"\u002Fapi\u002Fauth\u002Fbootstrap?scope=\u003Cscope>",[907,2518,2519],{},"session or token",[907,2521,2113],{},[907,2523,2524,2525,2528,2529,917,2532,2534],{},"An area's user-scoped data in one request. ",[625,2526,2527],{},"400 bad_request"," without ",[625,2530,2531],{},"scope",[625,2533,2375],{}," for an unknown one.",[892,2536,2537,2541,2546,2548,2550],{},[907,2538,2539],{},[625,2540,2334],{},[907,2542,2543],{},[625,2544,2545],{},"\u002Fapi\u002Fauth\u002Fproviders",[907,2547,2089],{},[907,2549,2113],{},[907,2551,2552,2553,600],{},"The OAuth buttons for this request: ",[625,2554,2555],{},"[{ key, to, label?, icon?, external? }]",[892,2557,2558,2562,2566,2568,2571],{},[907,2559,2560],{},[625,2561,2334],{},[907,2563,2564],{},[625,2565,2045],{},[907,2567,2089],{},[907,2569,2570],{},"302",[907,2572,2573,2574,2577,2578,600],{},"Sign-in and callback through any nuxt-auth-utils provider. ",[625,2575,2576],{},"404"," until its credentials are set, or with ",[625,2579,2580],{},"oauth.\u003Cprovider>: false",[892,2582,2583,2587,2591,2593,2595],{},[907,2584,2585],{},[625,2586,2334],{},[907,2588,2589],{},[625,2590,2048],{},[907,2592,2089],{},[907,2594,2570],{},[907,2596,2597,2598,2600,2601,2131],{},"Sign in with frigear.nu, and its callback. ",[625,2599,2576],{}," unless it is on (",[625,2602,2603],{},"oauth.frigear",[892,2605,2606,2610,2615,2617,2619],{},[907,2607,2608],{},[625,2609,2334],{},[907,2611,2612],{},[625,2613,2614],{},"\u002Fapi\u002Fauth\u002Ffrigear-status",[907,2616,2089],{},[907,2618,2113],{},[907,2620,2621,2624,2625,2131],{},[625,2622,2623],{},"{ enabled }",": whether Sign in with frigear.nu is active (",[625,2626,2603],{},[594,2628,2629,2633,2634,2637,2638,2640,2641,2643,2644,2647],{},[972,2630,2631,600],{},[625,2632,2254],{}," The returned ",[625,2635,2636],{},"redirect"," is the link's internal redirect, or ",[625,2639,1084],{},". An\ninvalid, used or expired link answers ",[625,2642,2218],{},". The emailed link opens the page ",[625,2645,2646],{},"\u002Fauth\u002Fmagic-link?code=",",\nwhich calls this route.",[594,2649,2650,2654,2655,2657],{},[972,2651,2652,600],{},[625,2653,2283],{}," Adding a passkey to an existing account needs that user's session. With\n",[625,2656,2127],{}," on, an unknown email is refused instead of signed up: the passkey would prove nothing about the address.",[594,2659,2660,2664],{},[972,2661,2662,600],{},[625,2663,2312],{}," The failures it unifies are an unknown email, no passkeys, and an unknown or\nunverified credential. Only the error is unified: a known address with passkeys still gets its credential ids. So this\ndoes not prevent account enumeration. That needs discoverable (usernameless) passkeys.",[594,2666,2667,2672,2673,2675],{},[972,2668,2669,600],{},[625,2670,2671],{},"\u002Fapi\u002Fauth\u002Fbootstrap"," See ",[598,2674,381],{"href":382}," for what an area's bootstrap data is.",[594,2677,2678],{},"Sign-in links and verification links expire after 2 hours and are used up atomically.",[613,2680,2682],{"id":2681},"anonymous-paths","Anonymous paths",[594,2684,2685,2688],{},[625,2686,2687],{},"runtimeConfig.public.authentication.publicPaths"," lists the anonymous entry points Auth owns, as route patterns.",[1024,2690,2691,2722],{},[1027,2692,2693,2696,2697,932,2700,2703,2704,928,2706,917,2709,932,2712,2715,2716,2718,2719,2721],{},[972,2694,2695],{},"In server mode:"," the sign-in and sign-up pages that are on, ",[625,2698,2699],{},"\u002Fforgot-password",[625,2701,2702],{},"\u002Freset-password"," (with\n",[625,2705,2189],{},[625,2707,2708],{},"\u002Fauth\u002F**",[625,2710,2711],{},"\u002Fapi\u002Fauth\u002F**",[625,2713,2714],{},"\u002Fapi\u002F_auth\u002F**"," (nuxt-auth-utils' session endpoint). ",[625,2717,2708],{},"\ncovers the emailed-link page, ",[625,2720,2048],{}," and the email change pages of Users.",[1027,2723,2724,2727],{},[972,2725,2726],{},"In client mode:"," the sign-in page and the callback.",[594,2729,2730,2733,2734,2737,2738,2740],{},[598,2731,199],{"href":2732},"\u002Fmodules\u002Fidentity\u002Fauthorization\u002Fclient#sign-in-paths"," keeps them reachable under any less specific guard,\nsuch as ",[625,2735,2736],{},"'\u002F**': { authenticated: true }",". Every handler under ",[625,2739,2008],{}," that needs a user checks it itself.",[602,2742,41],{"id":2743},"database",[594,2745,2746,2747,2751],{},"Tables the module adds. Generate and commit a ",[598,2748,2750],{"href":2749},"\u002Fget-started\u002Fdatabase#migrations","migration"," after installing.",[886,2753,2754,2767],{},[889,2755,2756],{},[892,2757,2758,2761,2764],{},[895,2759,2760],{},"Table",[895,2762,2763],{},"Present when",[895,2765,2766],{},"Holds",[902,2768,2769,2782,2796,2818,2844],{},[892,2770,2771,2776,2779],{},[907,2772,2773],{},[625,2774,2775],{},"auth_user_tokens",[907,2777,2778],{},"always",[907,2780,2781],{},"Hashed API tokens: name, prefix, last 4, scopes, the frozen permissions, expiry, and revoke and last-use timestamps.",[892,2783,2784,2789,2793],{},[907,2785,2786],{},[625,2787,2788],{},"user_credentials",[907,2790,2791],{},[625,2792,2301],{},[907,2794,2795],{},"One row per passkey.",[892,2797,2798,2803,2807],{},[907,2799,2800],{},[625,2801,2802],{},"password_resets",[907,2804,2805],{},[625,2806,2189],{},[907,2808,2809,2810,2124,2812,1709,2815,600],{},"A unique reset ",[625,2811,625],{},[625,2813,2814],{},"expiresAt",[625,2816,2817],{},"usedAt",[892,2819,2820,2825,2831],{},[907,2821,2822],{},[625,2823,2824],{},"magic_links",[907,2826,2827,1781,2829],{},[625,2828,2243],{},[625,2830,2127],{},[907,2832,2833,2834,2836,2837,917,2840,1709,2842,600],{},"A unique single-use ",[625,2835,625],{},", an optional internal ",[625,2838,2839],{},"redirectUrl",[625,2841,2814],{},[625,2843,2817],{},[892,2845,2846,2851,2857],{},[907,2847,2848],{},[625,2849,2850],{},"auth_oauth_tokens",[907,2852,2853,2856],{},[625,2854,2855],{},"keepTokens"," on a provider",[907,2858,2859,2860,917,2863,917,2866,2868,2869,917,2872,2131],{},"Encrypted access and refresh token, ",[625,2861,2862],{},"tokenType",[625,2864,2865],{},"scopes",[625,2867,2814],{},". Unique per (",[625,2870,2871],{},"userId",[625,2873,2874],{},"provider",[594,2876,2877,2878,917,2880,932,2883,2886,2887,2890,2891,2893],{},"Auth also adds ",[625,2879,2130],{},[625,2881,2882],{},"email_verified_at",[625,2884,2885],{},"last_login_at"," to the ",[625,2888,2889],{},"users"," table owned by\n",[598,2892,191],{"href":192},". Without Users, these columns are ignored.",[1064,2895,2896,2897,2899,2900,2903],{},"None of these tables has a foreign key to ",[625,2898,2889],{},", because Auth sits below Users. Whoever deletes a user calls\n",[625,2901,2902],{},"deleteUserAuthData(userId)",", as user management in the admin area does.",[602,2905,395],{"id":2906},"translations",[594,2908,2909,2910,2913,2914,932,2917,2920,2921,2924,2925,2928,2929,600],{},"Override any string in your app's ",[625,2911,2912],{},"i18n\u002Flocales\u002F\u003Ccode>.json",". The module registers ",[625,2915,2916],{},"da",[625,2918,2919],{},"en"," locale files under the\n",[625,2922,2923],{},"auth.*"," namespace, read through ",[625,2926,2927],{},"@nuxtjs\u002Fi18n",". Without it the English defaults are used. See\n",[598,2930,2932],{"href":2931},"\u002Fmodules\u002Fplatform\u002Fmodule-kit\u002Fi18n#overriding-module-strings-in-your-app","overriding module strings",[634,2934,2938],{"className":2935,"code":2936,"language":2937,"meta":639,"style":639},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{ \"auth\": { \"signIn\": \"Log in\", \"email\": { \"label\": \"Your email\" } } }\n","json",[625,2939,2940],{"__ignoreMap":639},[643,2941,2942,2944,2947,2950,2953,2955,2957,2959,2962,2964,2966,2968,2971,2973,2975,2977,2979,2981,2983,2985,2987,2990,2992,2994,2996,2999,3001,3003,3005],{"class":645,"line":646},[643,2943,746],{"class":653},[643,2945,2946],{"class":653}," \"",[643,2948,2949],{"class":649},"auth",[643,2951,2952],{"class":653},"\"",[643,2954,753],{"class":653},[643,2956,654],{"class":653},[643,2958,2946],{"class":653},[643,2960,2961],{"class":823},"signIn",[643,2963,2952],{"class":653},[643,2965,753],{"class":653},[643,2967,2946],{"class":653},[643,2969,2970],{"class":759},"Log in",[643,2972,2952],{"class":653},[643,2974,661],{"class":653},[643,2976,2946],{"class":653},[643,2978,1549],{"class":823},[643,2980,2952],{"class":653},[643,2982,753],{"class":653},[643,2984,654],{"class":653},[643,2986,2946],{"class":653},[643,2988,2989],{"class":1596},"label",[643,2991,2952],{"class":653},[643,2993,753],{"class":653},[643,2995,2946],{"class":653},[643,2997,2998],{"class":759},"Your email",[643,3000,2952],{"class":653},[643,3002,766],{"class":653},[643,3004,766],{"class":653},[643,3006,3007],{"class":653}," }\n",[594,3009,3010,3011,917,3013,917,3016,917,3019,917,3022,917,3025,917,3028,917,3031,3034,3035,917,3038,917,3041,917,3044,917,3047,917,3050,917,3053,3034,3056,917,3059,917,3062,917,3065,3068,3069,3072],{},"Key groups: ",[625,3012,2961],{},[625,3014,3015],{},"signUp",[625,3017,3018],{},"signOut",[625,3020,3021],{},"signedInAs",[625,3023,3024],{},"signInToContinue",[625,3026,3027],{},"name.*",[625,3029,3030],{},"email.*",[625,3032,3033],{},"password.*",",\n",[625,3036,3037],{},"forgotPassword.*",[625,3039,3040],{},"resetPassword.*",[625,3042,3043],{},"magicLink.*",[625,3045,3046],{},"verifyEmail.*",[625,3048,3049],{},"confirm.*",[625,3051,3052],{},"passkey.*",[625,3054,3055],{},"emailPassword.*",[625,3057,3058],{},"passkeys.*",[625,3060,3061],{},"oauth.\u003Cprovider>.label",[625,3063,3064],{},"menu.*",[625,3066,3067],{},"errors.*",", and ",[625,3070,3071],{},"client.*"," (client mode's sign-in and callback pages).",[602,3074,3076],{"id":3075},"next-steps","Next steps",[1024,3078,3079,3084,3089],{},[1027,3080,3081,3083],{},[598,3082,175],{"href":176}," – authorize your own routes.",[1027,3085,3086,3088],{},[598,3087,199],{"href":200}," – roles, policies and what the browser may show.",[1027,3090,3091,3093],{},[598,3092,195],{"href":196}," – the pages that call the token and passkey routes.",[3095,3096,3097],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":639,"searchDepth":699,"depth":699,"links":3099},[3100,3105,3106,3107,3110,3111,3112],{"id":604,"depth":699,"text":267,"children":3101},[3102,3103,3104],{"id":615,"depth":734,"text":616},{"id":1075,"depth":734,"text":1076},{"id":1129,"depth":734,"text":1130},{"id":1658,"depth":699,"text":1659},{"id":1826,"depth":699,"text":234},{"id":2001,"depth":699,"text":2002,"children":3108},[3109],{"id":2681,"depth":734,"text":2682},{"id":2743,"depth":699,"text":41},{"id":2906,"depth":699,"text":395},{"id":3075,"depth":699,"text":3076},"Look up Auth's composables, hooks, routes, database tables and translations.","md",null,{},{"title":179},{"title":589,"description":3113},"zQsKAw-ksRS6EeZwqnLrPHK_fA_YMb00xJgAtovt-9o",[3121,3123],{"title":175,"path":176,"stem":177,"description":3122,"children":-1},"The server helpers that authorize your routes, define permissions, roles and scopes, and handle tokens and auth emails.",{"title":183,"path":184,"stem":185,"description":3124,"children":-1},"Sign people in from an app without its own server, such as a browser SPA or a Capacitor app, and call your API as them.",1794503155371]