[{"data":1,"prerenderedAt":649},["ShallowReactive",2],{"navigation_docs":3,"-guides-database-less-mode":152,"-guides-database-less-mode-surround":644},[4,42,68,110,131],{"title":5,"path":6,"stem":7,"children":8,"icon":11},"Getting Started","\u002Fgetting-started","1.getting-started\u002F0.index",[9,12,17,22,27,32,37],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-sparkles",{"title":13,"path":14,"stem":15,"icon":16},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F1.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Configuration","\u002Fgetting-started\u002Fconfiguration","1.getting-started\u002F2.configuration","i-lucide-settings",{"title":23,"path":24,"stem":25,"icon":26},"Client Setup","\u002Fgetting-started\u002Fclient-setup","1.getting-started\u002F3.client-setup","i-lucide-monitor",{"title":28,"path":29,"stem":30,"icon":31},"Type Augmentation","\u002Fgetting-started\u002Ftype-augmentation","1.getting-started\u002F4.type-augmentation","i-lucide-type",{"title":33,"path":34,"stem":35,"icon":36},"Schema Generation (NuxtHub)","\u002Fgetting-started\u002Fschema-generation","1.getting-started\u002F5.schema-generation","i-lucide-database",{"title":38,"path":39,"stem":40,"icon":41},"How It Works","\u002Fgetting-started\u002Fhow-it-works","1.getting-started\u002F6.how-it-works","i-lucide-workflow",{"title":43,"path":44,"stem":45,"children":46,"page":67},"Core Concepts","\u002Fcore-concepts","2.core-concepts",[47,51,55,59,63],{"title":48,"path":49,"stem":50},"serverAuth()","\u002Fcore-concepts\u002Fserver-auth","2.core-concepts\u002F1.server-auth",{"title":52,"path":53,"stem":54},"Sessions","\u002Fcore-concepts\u002Fsessions","2.core-concepts\u002F2.sessions",{"title":56,"path":57,"stem":58},"Route Protection","\u002Fcore-concepts\u002Froute-protection","2.core-concepts\u002F3.route-protection",{"title":60,"path":61,"stem":62},"Auto‑Imports and Aliases","\u002Fcore-concepts\u002Fauto-imports-aliases","2.core-concepts\u002F4.auto-imports-aliases",{"title":64,"path":65,"stem":66},"Security & Caveats","\u002Fcore-concepts\u002Fsecurity-caveats","2.core-concepts\u002F5.security-caveats",false,{"title":69,"path":70,"stem":71,"children":72,"page":67},"Guides","\u002Fguides","3.guides",[73,77,81,85,89,94,98,102,106],{"title":74,"path":75,"stem":76},"Role‑Based Access","\u002Fguides\u002Frole-based-access","3.guides\u002F1.role-based-access",{"title":78,"path":79,"stem":80},"OAuth Providers","\u002Fguides\u002Foauth-providers","3.guides\u002F2.oauth-providers",{"title":82,"path":83,"stem":84},"Custom Database","\u002Fguides\u002Fcustom-database","3.guides\u002F3.custom-database",{"title":86,"path":87,"stem":88},"Database-less Mode","\u002Fguides\u002Fdatabase-less-mode","3.guides\u002F4.database-less-mode",{"title":90,"path":91,"stem":92,"icon":93},"External Auth Backend","\u002Fguides\u002Fexternal-auth-backend","3.guides\u002F5.external-auth-backend","i-lucide-server",{"title":95,"path":96,"stem":97},"Migrating from nuxt-auth-utils","\u002Fguides\u002Fmigrate-from-nuxt-auth-utils","3.guides\u002F6.migrate-from-nuxt-auth-utils",{"title":99,"path":100,"stem":101},"Two-Factor Authentication (TOTP + Backup Codes)","\u002Fguides\u002Ftwo-factor-auth","3.guides\u002F7.two-factor-auth",{"title":103,"path":104,"stem":105},"Testing","\u002Fguides\u002Ftesting","3.guides\u002F8.testing",{"title":107,"path":108,"stem":109},"Production Deployment","\u002Fguides\u002Fproduction-deployment","3.guides\u002F9.production-deployment",{"title":111,"path":112,"stem":113,"children":114,"page":67},"Integrations","\u002Fintegrations","4.integrations",[115,119,123,127],{"title":116,"path":117,"stem":118},"NuxtHub","\u002Fintegrations\u002Fnuxthub","4.integrations\u002F1.nuxthub",{"title":120,"path":121,"stem":122},"DevTools","\u002Fintegrations\u002Fdevtools","4.integrations\u002F2.devtools",{"title":124,"path":125,"stem":126},"Convex","\u002Fintegrations\u002Fconvex","4.integrations\u002F3.convex",{"title":128,"path":129,"stem":130},"i18n","\u002Fintegrations\u002Fi18n","4.integrations\u002F4.i18n",{"title":132,"path":133,"stem":134,"children":135,"page":67},"API Reference","\u002Fapi","5.api",[136,140,144,148],{"title":137,"path":138,"stem":139},"Composables","\u002Fapi\u002Fcomposables","5.api\u002F1.composables",{"title":141,"path":142,"stem":143},"Server Utilities","\u002Fapi\u002Fserver-utils","5.api\u002F2.server-utils",{"title":145,"path":146,"stem":147},"Components","\u002Fapi\u002Fcomponents","5.api\u002F3.components",{"title":149,"path":150,"stem":151},"Types","\u002Fapi\u002Ftypes","5.api\u002F4.types",{"id":153,"title":86,"body":154,"description":638,"extension":639,"links":640,"meta":641,"navigation":386,"path":87,"seo":642,"stem":88,"__hash__":643},"docs\u002F3.guides\u002F4.database-less-mode.md",{"type":155,"value":156,"toc":627},"minimark",[157,161,164,175,182,187,211,216,221,224,230,234,237,241,249,253,256,261,265,268,273,284,288,291,349,353,356,584,587,591,596,607,612,623],[158,159,160],"p",{},"Use this guide when you want stateless sessions and you accept the operational tradeoffs that come with not having persistent auth records.",[158,162,163],{},"Better Auth supports running without a database using encrypted cookie sessions (JWE).",[165,166,169,170,174],"callout",{"icon":167,"to":168},"i-lucide-external-link","https:\u002F\u002Fwww.better-auth.com\u002Fdocs\u002Fconcepts\u002Fdatabase#primitives-for-database-less-auth","See the official ",[171,172,173],"strong",{},"Better Auth documentation"," for database-less setup.",[158,176,177,178,181],{},"Database-less mode uses ",[171,179,180],{},"JWE (JSON Web Encryption)"," sessions. Instead of storing sessions in a database, the session data is encrypted and stored entirely in the cookie.",[158,183,184],{},[171,185,186],{},"How it works:",[188,189,190,202,205,208],"ul",{},[191,192,193,194,198,199],"li",{},"Session data is encrypted with your singular secret or the current key in ",[195,196,197],"code",{},"BETTER_AUTH_SECRETS","\u002F",[195,200,201],{},"secrets",[191,203,204],{},"The encrypted token is stored in a cookie",[191,206,207],{},"On each request, the server decrypts the cookie to get session data",[191,209,210],{},"No database queries needed for session validation",[212,213,215],"h2",{"id":214},"limitations","Limitations",[217,218,220],"h3",{"id":219},"no-server-side-session-revocation","No Server-Side Session Revocation",[158,222,223],{},"You cannot invalidate a session before it expires. The user must wait for the cookie to expire.",[158,225,226,229],{},[171,227,228],{},"Workaround:"," Use short session lifetimes (e.g., 1 hour) and implement token refresh.",[217,231,233],{"id":232},"no-emailpassword-without-external-storage","No Email\u002FPassword Without External Storage",[158,235,236],{},"Email\u002Fpassword requires storing user credentials somewhere.",[158,238,239],{},[171,240,228],{},[188,242,243,246],{},[191,244,245],{},"Use OAuth providers only (GitHub, Google store the credentials)",[191,247,248],{},"Or use an external user database while keeping sessions database-less",[217,250,252],{"id":251},"no-multi-device-session-management","No Multi-Device Session Management",[158,254,255],{},"Cannot list or revoke sessions across devices.",[158,257,258,260],{},[171,259,228],{}," Implement device tracking in your application layer if needed.",[217,262,264],{"id":263},"oauth-considerations","OAuth Considerations",[158,266,267],{},"OAuth can work in database-less mode, but account state is stored in encrypted cookies (JWE) instead of a database. This limits server-side management and auditing.",[269,270,272],"h4",{"id":271},"when-to-avoid-db-less-oauth","When to avoid DB-less OAuth",[188,274,275,278,281],{},[191,276,277],{},"You need to list\u002Frevoke sessions across devices",[191,279,280],{},"You need durable account records (admin tools, audits)",[191,282,283],{},"You rely on server-side account linking or management",[212,285,287],{"id":286},"nuxt-configuration","Nuxt Configuration",[158,289,290],{},"Simply don't configure a database adapter:",[292,293,299],"pre",{"className":294,"code":295,"filename":296,"language":297,"meta":298,"style":298},"language-ts shiki shiki-themes one-light synthwave-84 synthwave-84","export default defineNuxtConfig({\n  modules: ['@nuxtjs\u002Fbetter-auth'],\n})\n","nuxt.config.ts","ts","",[195,300,301,322,343],{"__ignoreMap":298},[302,303,306,310,314,318],"span",{"class":304,"line":305},"line",1,[302,307,309],{"class":308},"sqe1H","export",[302,311,313],{"class":312},"sKg8T"," default",[302,315,317],{"class":316},"sfT9l"," defineNuxtConfig",[302,319,321],{"class":320},"s17Py","({\n",[302,323,325,329,333,336,340],{"class":304,"line":324},2,[302,326,328],{"class":327},"sYvLG","  modules",[302,330,332],{"class":331},"sVnqq",":",[302,334,335],{"class":320}," [",[302,337,339],{"class":338},"sPAZv","'@nuxtjs\u002Fbetter-auth'",[302,341,342],{"class":320},"],\n",[302,344,346],{"class":304,"line":345},3,[302,347,348],{"class":320},"})\n",[212,350,352],{"id":351},"auth-configuration","Auth Configuration",[158,354,355],{},"Enable JWE sessions and cookie-based OAuth state:",[292,357,360],{"className":294,"code":358,"filename":359,"language":297,"meta":298,"style":298},"import { defineServerAuth } from '@nuxtjs\u002Fbetter-auth\u002Fconfig'\n\nexport default defineServerAuth({\n  socialProviders: {\n    github: { clientId: '...', clientSecret: '...' },\n  },\n  session: {\n    cookieCache: {\n      enabled: true,\n      maxAge: 7 * 24 * 60 * 60, \u002F\u002F 7 days\n      strategy: 'jwe',\n    },\n  },\n  account: {\n    storeStateStrategy: 'cookie',\n    storeAccountCookie: true,\n  },\n})\n","server\u002Fauth.config.ts",[195,361,362,382,388,399,410,441,447,457,467,482,515,528,534,539,549,562,574,579],{"__ignoreMap":298},[302,363,364,367,370,373,376,379],{"class":304,"line":305},[302,365,366],{"class":308},"import",[302,368,369],{"class":320}," { ",[302,371,372],{"class":327},"defineServerAuth",[302,374,375],{"class":320}," } ",[302,377,378],{"class":308},"from",[302,380,381],{"class":338}," '@nuxtjs\u002Fbetter-auth\u002Fconfig'\n",[302,383,384],{"class":304,"line":324},[302,385,387],{"emptyLinePlaceholder":386},true,"\n",[302,389,390,392,394,397],{"class":304,"line":345},[302,391,309],{"class":308},[302,393,313],{"class":312},[302,395,396],{"class":316}," defineServerAuth",[302,398,321],{"class":320},[302,400,402,405,407],{"class":304,"line":401},4,[302,403,404],{"class":327},"  socialProviders",[302,406,332],{"class":331},[302,408,409],{"class":320}," {\n",[302,411,413,416,418,420,423,425,428,431,434,436,438],{"class":304,"line":412},5,[302,414,415],{"class":327},"    github",[302,417,332],{"class":331},[302,419,369],{"class":320},[302,421,422],{"class":327},"clientId",[302,424,332],{"class":331},[302,426,427],{"class":338}," '...'",[302,429,430],{"class":320},", ",[302,432,433],{"class":327},"clientSecret",[302,435,332],{"class":331},[302,437,427],{"class":338},[302,439,440],{"class":320}," },\n",[302,442,444],{"class":304,"line":443},6,[302,445,446],{"class":320},"  },\n",[302,448,450,453,455],{"class":304,"line":449},7,[302,451,452],{"class":327},"  session",[302,454,332],{"class":331},[302,456,409],{"class":320},[302,458,460,463,465],{"class":304,"line":459},8,[302,461,462],{"class":327},"    cookieCache",[302,464,332],{"class":331},[302,466,409],{"class":320},[302,468,470,473,475,479],{"class":304,"line":469},9,[302,471,472],{"class":327},"      enabled",[302,474,332],{"class":331},[302,476,478],{"class":477},"s3ZNE"," true",[302,480,481],{"class":320},",\n",[302,483,485,488,490,493,497,500,502,505,507,509,511],{"class":304,"line":484},10,[302,486,487],{"class":327},"      maxAge",[302,489,332],{"class":331},[302,491,492],{"class":477}," 7",[302,494,496],{"class":495},"sn-Jc"," *",[302,498,499],{"class":477}," 24",[302,501,496],{"class":495},[302,503,504],{"class":477}," 60",[302,506,496],{"class":495},[302,508,504],{"class":477},[302,510,430],{"class":320},[302,512,514],{"class":513},"st7cf","\u002F\u002F 7 days\n",[302,516,518,521,523,526],{"class":304,"line":517},11,[302,519,520],{"class":327},"      strategy",[302,522,332],{"class":331},[302,524,525],{"class":338}," 'jwe'",[302,527,481],{"class":320},[302,529,531],{"class":304,"line":530},12,[302,532,533],{"class":320},"    },\n",[302,535,537],{"class":304,"line":536},13,[302,538,446],{"class":320},[302,540,542,545,547],{"class":304,"line":541},14,[302,543,544],{"class":327},"  account",[302,546,332],{"class":331},[302,548,409],{"class":320},[302,550,552,555,557,560],{"class":304,"line":551},15,[302,553,554],{"class":327},"    storeStateStrategy",[302,556,332],{"class":331},[302,558,559],{"class":338}," 'cookie'",[302,561,481],{"class":320},[302,563,565,568,570,572],{"class":304,"line":564},16,[302,566,567],{"class":327},"    storeAccountCookie",[302,569,332],{"class":331},[302,571,478],{"class":477},[302,573,481],{"class":320},[302,575,577],{"class":304,"line":576},17,[302,578,446],{"class":320},[302,580,582],{"class":304,"line":581},18,[302,583,348],{"class":320},[158,585,586],{},"This stores sessions and OAuth state in encrypted cookies instead of a database.",[212,588,590],{"id":589},"when-to-use-database-less-mode","When to Use Database-less Mode",[158,592,593],{},[171,594,595],{},"Good fit:",[188,597,598,601,604],{},[191,599,600],{},"OAuth-only authentication (GitHub, Google, etc.)",[191,602,603],{},"Serverless deployments with cold start concerns",[191,605,606],{},"Simple applications without session management needs",[158,608,609],{},[171,610,611],{},"Not recommended:",[188,613,614,617,620],{},[191,615,616],{},"Applications requiring session revocation",[191,618,619],{},"Multi-device session management",[191,621,622],{},"Email\u002Fpassword authentication",[624,625,626],"style",{},"html pre.shiki code .sqe1H, html code.shiki .sqe1H{--shiki-light:#A626A4;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .sKg8T, html code.shiki .sKg8T{--shiki-light:#E45649;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .sfT9l, html code.shiki .sfT9l{--shiki-light:#4078F2;--shiki-default:#36F9F6;--shiki-dark:#36F9F6}html pre.shiki code .s17Py, html code.shiki .s17Py{--shiki-light:#383A42;--shiki-default:#BBBBBB;--shiki-dark:#BBBBBB}html pre.shiki code .sYvLG, html code.shiki .sYvLG{--shiki-light:#E45649;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .sVnqq, html code.shiki .sVnqq{--shiki-light:#0184BC;--shiki-default:#B6B1B1;--shiki-dark:#B6B1B1}html pre.shiki code .sPAZv, html code.shiki .sPAZv{--shiki-light:#50A14F;--shiki-default:#FF8B39;--shiki-dark:#FF8B39}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 .s3ZNE, html code.shiki .s3ZNE{--shiki-light:#986801;--shiki-default:#F97E72;--shiki-dark:#F97E72}html pre.shiki code .sn-Jc, html code.shiki .sn-Jc{--shiki-light:#0184BC;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .st7cf, html code.shiki .st7cf{--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-default:#848BBD;--shiki-default-font-style:italic;--shiki-dark:#848BBD;--shiki-dark-font-style:italic}",{"title":298,"searchDepth":324,"depth":324,"links":628},[629,635,636,637],{"id":214,"depth":324,"text":215,"children":630},[631,632,633,634],{"id":219,"depth":345,"text":220},{"id":232,"depth":345,"text":233},{"id":251,"depth":345,"text":252},{"id":263,"depth":345,"text":264},{"id":286,"depth":324,"text":287},{"id":351,"depth":324,"text":352},{"id":589,"depth":324,"text":590},"Run Better Auth without a database for edge and serverless deployments.","md",null,{},{"title":86,"description":638},"m9tKHYvLMEDCF20Ic6O3PczPR92LcHa1DGbQDu3ITN8",[645,647],{"title":82,"path":83,"stem":84,"description":646,"children":-1},"Use your own database with Drizzle, Prisma, or Kysely adapters.",{"title":90,"path":91,"stem":92,"description":648,"icon":93,"children":-1},"Use nuxt-better-auth with a separate Better Auth server.",1787740693489]