[{"data":1,"prerenderedAt":1859},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-configuration":152,"-getting-started-configuration-surround":1854},[4,42,68,110,131],{"title":5,"path":6,"stem":7,"children":8,"icon":11},"Getting Started","/getting-started","1.getting-started/0.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","/getting-started/installation","1.getting-started/1.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Configuration","/getting-started/configuration","1.getting-started/2.configuration","i-lucide-settings",{"title":23,"path":24,"stem":25,"icon":26},"Client Setup","/getting-started/client-setup","1.getting-started/3.client-setup","i-lucide-monitor",{"title":28,"path":29,"stem":30,"icon":31},"Type Augmentation","/getting-started/type-augmentation","1.getting-started/4.type-augmentation","i-lucide-type",{"title":33,"path":34,"stem":35,"icon":36},"Schema Generation (NuxtHub)","/getting-started/schema-generation","1.getting-started/5.schema-generation","i-lucide-database",{"title":38,"path":39,"stem":40,"icon":41},"How It Works","/getting-started/how-it-works","1.getting-started/6.how-it-works","i-lucide-workflow",{"title":43,"path":44,"stem":45,"children":46,"page":67},"Core Concepts","/core-concepts","2.core-concepts",[47,51,55,59,63],{"title":48,"path":49,"stem":50},"serverAuth()","/core-concepts/server-auth","2.core-concepts/1.server-auth",{"title":52,"path":53,"stem":54},"Sessions","/core-concepts/sessions","2.core-concepts/2.sessions",{"title":56,"path":57,"stem":58},"Route Protection","/core-concepts/route-protection","2.core-concepts/3.route-protection",{"title":60,"path":61,"stem":62},"Auto‑Imports and Aliases","/core-concepts/auto-imports-aliases","2.core-concepts/4.auto-imports-aliases",{"title":64,"path":65,"stem":66},"Security & Caveats","/core-concepts/security-caveats","2.core-concepts/5.security-caveats",false,{"title":69,"path":70,"stem":71,"children":72,"page":67},"Guides","/guides","3.guides",[73,77,81,85,89,94,98,102,106],{"title":74,"path":75,"stem":76},"Role‑Based Access","/guides/role-based-access","3.guides/1.role-based-access",{"title":78,"path":79,"stem":80},"OAuth Providers","/guides/oauth-providers","3.guides/2.oauth-providers",{"title":82,"path":83,"stem":84},"Custom Database","/guides/custom-database","3.guides/3.custom-database",{"title":86,"path":87,"stem":88},"Database-less Mode","/guides/database-less-mode","3.guides/4.database-less-mode",{"title":90,"path":91,"stem":92,"icon":93},"External Auth Backend","/guides/external-auth-backend","3.guides/5.external-auth-backend","i-lucide-server",{"title":95,"path":96,"stem":97},"Migrating from nuxt-auth-utils","/guides/migrate-from-nuxt-auth-utils","3.guides/6.migrate-from-nuxt-auth-utils",{"title":99,"path":100,"stem":101},"Two-Factor Authentication (TOTP + Backup Codes)","/guides/two-factor-auth","3.guides/7.two-factor-auth",{"title":103,"path":104,"stem":105},"Testing","/guides/testing","3.guides/8.testing",{"title":107,"path":108,"stem":109},"Production Deployment","/guides/production-deployment","3.guides/9.production-deployment",{"title":111,"path":112,"stem":113,"children":114,"page":67},"Integrations","/integrations","4.integrations",[115,119,123,127],{"title":116,"path":117,"stem":118},"NuxtHub","/integrations/nuxthub","4.integrations/1.nuxthub",{"title":120,"path":121,"stem":122},"DevTools","/integrations/devtools","4.integrations/2.devtools",{"title":124,"path":125,"stem":126},"Convex","/integrations/convex","4.integrations/3.convex",{"title":128,"path":129,"stem":130},"i18n","/integrations/i18n","4.integrations/4.i18n",{"title":132,"path":133,"stem":134,"children":135,"page":67},"API Reference","/api","5.api",[136,140,144,148],{"title":137,"path":138,"stem":139},"Composables","/api/composables","5.api/1.composables",{"title":141,"path":142,"stem":143},"Server Utilities","/api/server-utils","5.api/2.server-utils",{"title":145,"path":146,"stem":147},"Components","/api/components","5.api/3.components",{"title":149,"path":150,"stem":151},"Types","/api/types","5.api/4.types",{"id":153,"title":18,"body":154,"description":1847,"extension":1848,"links":1849,"meta":1850,"navigation":1851,"path":19,"seo":1852,"stem":20,"__hash__":1853},"docs/1.getting-started/2.configuration.md",{"type":155,"value":156,"toc":1835},"minimark",[157,245,250,485,500,752,756,759,850,855,962,968,987,993,996,1020,1024,1030,1035,1041,1161,1204,1208,1214,1350,1354,1371,1377,1381,1387,1470,1480,1486,1559,1565,1577,1589,1597,1601,1607,1622,1631,1635,1638,1757,1760,1831],[158,159,160],"code-collapse",{},[161,162,168],"pre",{"className":163,"code":164,"filename":165,"language":166,"meta":167,"style":167},"language-txt shiki shiki-themes one-light synthwave-84 synthwave-84","Configure @onmax/nuxt-better-auth module options and server auth.\n\n- In `nuxt.config.ts`, set `auth.redirects` (login, guest, authenticated, logout) and `auth.preserveRedirect`\n- Use `routeRules` or `nitro.routeRules` to define per-route auth: `{ auth: { only: 'user', redirectTo: '/login' } }`\n- In `server/auth.config.ts`, use `defineServerAuth` (object or function syntax) to configure plugins and providers\n- The function syntax receives `ctx` with `runtimeConfig` and `db` (NuxtHub)\n- The module auto-injects `secret` and `baseURL` — do not set them in defineServerAuth\n- Base URL priority: runtimeConfig > request URL > platform env vars > localhost\n- Set `NUXT_PUBLIC_SITE_URL` for custom domains or deterministic OAuth callbacks\n\nRead more: https://better-auth.nuxt.dev/raw/getting-started/configuration.md\nSource: https://github.com/nuxt-modules/better-auth\n","Prompt","txt","",[169,170,171,179,186,192,198,204,210,216,222,228,233,239],"code",{"__ignoreMap":167},[172,173,176],"span",{"class":174,"line":175},"line",1,[172,177,178],{},"Configure @onmax/nuxt-better-auth module options and server auth.\n",[172,180,182],{"class":174,"line":181},2,[172,183,185],{"emptyLinePlaceholder":184},true,"\n",[172,187,189],{"class":174,"line":188},3,[172,190,191],{},"- In `nuxt.config.ts`, set `auth.redirects` (login, guest, authenticated, logout) and `auth.preserveRedirect`\n",[172,193,195],{"class":174,"line":194},4,[172,196,197],{},"- Use `routeRules` or `nitro.routeRules` to define per-route auth: `{ auth: { only: 'user', redirectTo: '/login' } }`\n",[172,199,201],{"class":174,"line":200},5,[172,202,203],{},"- In `server/auth.config.ts`, use `defineServerAuth` (object or function syntax) to configure plugins and providers\n",[172,205,207],{"class":174,"line":206},6,[172,208,209],{},"- The function syntax receives `ctx` with `runtimeConfig` and `db` (NuxtHub)\n",[172,211,213],{"class":174,"line":212},7,[172,214,215],{},"- The module auto-injects `secret` and `baseURL` — do not set them in defineServerAuth\n",[172,217,219],{"class":174,"line":218},8,[172,220,221],{},"- Base URL priority: runtimeConfig > request URL > platform env vars > localhost\n",[172,223,225],{"class":174,"line":224},9,[172,226,227],{},"- Set `NUXT_PUBLIC_SITE_URL` for custom domains or deterministic OAuth callbacks\n",[172,229,231],{"class":174,"line":230},10,[172,232,185],{"emptyLinePlaceholder":184},[172,234,236],{"class":174,"line":235},11,[172,237,238],{},"Read more: https://better-auth.nuxt.dev/raw/getting-started/configuration.md\n",[172,240,242],{"class":174,"line":241},12,[172,243,244],{},"Source: https://github.com/nuxt-modules/better-auth\n",[246,247,249],"h2",{"id":248},"module-configuration","Module Configuration",[161,251,256],{"className":252,"code":253,"filename":254,"language":255,"meta":167,"style":167},"language-ts shiki shiki-themes one-light synthwave-84 synthwave-84","export default defineNuxtConfig({\n  modules: ['@onmax/nuxt-better-auth'],\n  auth: {\n    redirects: {\n      login: '/login',\n      guest: '/',\n      // authenticated: '/app', // optional\n      // logout: '/goodbye', // optional\n    },\n    preserveRedirect: true,\n    redirectQueryKey: 'redirect',\n  },\n  routeRules: {\n    '/app/**': { auth: { only: 'user', redirectTo: '/login' } },\n    '/login': { auth: { only: 'guest', redirectTo: '/app' } },\n  },\n})\n","nuxt.config.ts","ts",[169,257,258,276,296,306,315,328,340,349,356,361,374,386,391,401,440,474,479],{"__ignoreMap":167},[172,259,260,264,268,272],{"class":174,"line":175},[172,261,263],{"class":262},"sqe1H","export",[172,265,267],{"class":266},"sKg8T"," default",[172,269,271],{"class":270},"sfT9l"," defineNuxtConfig",[172,273,275],{"class":274},"s17Py","({\n",[172,277,278,282,286,289,293],{"class":174,"line":181},[172,279,281],{"class":280},"sYvLG","  modules",[172,283,285],{"class":284},"sVnqq",":",[172,287,288],{"class":274}," [",[172,290,292],{"class":291},"sPAZv","'@onmax/nuxt-better-auth'",[172,294,295],{"class":274},"],\n",[172,297,298,301,303],{"class":174,"line":188},[172,299,300],{"class":280},"  auth",[172,302,285],{"class":284},[172,304,305],{"class":274}," {\n",[172,307,308,311,313],{"class":174,"line":194},[172,309,310],{"class":280},"    redirects",[172,312,285],{"class":284},[172,314,305],{"class":274},[172,316,317,320,322,325],{"class":174,"line":200},[172,318,319],{"class":280},"      login",[172,321,285],{"class":284},[172,323,324],{"class":291}," '/login'",[172,326,327],{"class":274},",\n",[172,329,330,333,335,338],{"class":174,"line":206},[172,331,332],{"class":280},"      guest",[172,334,285],{"class":284},[172,336,337],{"class":291}," '/'",[172,339,327],{"class":274},[172,341,342,346],{"class":174,"line":212},[172,343,345],{"class":344},"st7cf","      // authenticated: '/app',",[172,347,348],{"class":344}," // optional\n",[172,350,351,354],{"class":174,"line":218},[172,352,353],{"class":344},"      // logout: '/goodbye',",[172,355,348],{"class":344},[172,357,358],{"class":174,"line":224},[172,359,360],{"class":274},"    },\n",[172,362,363,366,368,372],{"class":174,"line":230},[172,364,365],{"class":280},"    preserveRedirect",[172,367,285],{"class":284},[172,369,371],{"class":370},"s3ZNE"," true",[172,373,327],{"class":274},[172,375,376,379,381,384],{"class":174,"line":235},[172,377,378],{"class":280},"    redirectQueryKey",[172,380,285],{"class":284},[172,382,383],{"class":291}," 'redirect'",[172,385,327],{"class":274},[172,387,388],{"class":174,"line":241},[172,389,390],{"class":274},"  },\n",[172,392,394,397,399],{"class":174,"line":393},13,[172,395,396],{"class":280},"  routeRules",[172,398,285],{"class":284},[172,400,305],{"class":274},[172,402,404,407,409,412,415,417,419,422,424,427,430,433,435,437],{"class":174,"line":403},14,[172,405,406],{"class":291},"    '/app/**'",[172,408,285],{"class":284},[172,410,411],{"class":274}," { ",[172,413,414],{"class":280},"auth",[172,416,285],{"class":284},[172,418,411],{"class":274},[172,420,421],{"class":280},"only",[172,423,285],{"class":284},[172,425,426],{"class":291}," 'user'",[172,428,429],{"class":274},", ",[172,431,432],{"class":280},"redirectTo",[172,434,285],{"class":284},[172,436,324],{"class":291},[172,438,439],{"class":274}," } },\n",[172,441,443,446,448,450,452,454,456,458,460,463,465,467,469,472],{"class":174,"line":442},15,[172,444,445],{"class":291},"    '/login'",[172,447,285],{"class":284},[172,449,411],{"class":274},[172,451,414],{"class":280},[172,453,285],{"class":284},[172,455,411],{"class":274},[172,457,421],{"class":280},[172,459,285],{"class":284},[172,461,462],{"class":291}," 'guest'",[172,464,429],{"class":274},[172,466,432],{"class":280},[172,468,285],{"class":284},[172,470,471],{"class":291}," '/app'",[172,473,439],{"class":274},[172,475,477],{"class":174,"line":476},16,[172,478,390],{"class":274},[172,480,482],{"class":174,"line":481},17,[172,483,484],{"class":274},"})\n",[486,487,488,489,492,493,496,497,499],"note",{},"You can define auth route rules in either ",[169,490,491],{},"routeRules"," or ",[169,494,495],{},"nitro.routeRules",". The module supports both. If both are set, it uses ",[169,498,495],{},".",[501,502,503,548,560,571,627,646,660,726,736],"field-group",{},[504,505,508,515,521,538,541],"field",{"name":506,"type":507},"clientOnly","boolean",[509,510,511,512],"p",{},"Default: ",[169,513,514],{},"false",[509,516,517,518,285],{},"Enable client-only mode for external auth backends. When ",[169,519,520],{},"true",[522,523,524,532,535],"ul",{},[525,526,527,528,531],"li",{},"Skips ",[169,529,530],{},"server/auth.config.ts"," requirement",[525,533,534],{},"Skips server-side setup (API handlers, middleware, schema generation, devtools)",[525,536,537],{},"Skips secret validation",[509,539,540],{},"Use this when your Better Auth server runs on a separate backend (e.g., standalone h3/Nitro project).",[509,542,543,544,547],{},"See ",[545,546,90],"a",{"href":91}," guide.",[504,549,552,557],{"name":550,"type":551},"serverConfig","string",[509,553,511,554],{},[169,555,556],{},"'server/auth.config'",[509,558,559],{},"Path to the server auth config file, relative to the project root.",[504,561,563,568],{"name":562,"type":551},"clientConfig",[509,564,511,565],{},[169,566,567],{},"'app/auth.config'",[509,569,570],{},"Path to the client auth config file, relative to the project root.",[504,572,575,580,583,621],{"name":573,"type":574},"redirects","{ login?: string, guest?: string, authenticated?: string, logout?: string }",[509,576,511,577],{},[169,578,579],{},"{ login: '/login', guest: '/' }",[509,581,582],{},"Global redirect fallbacks:",[522,584,585,591,597,615],{},[525,586,587,590],{},[169,588,589],{},"login",": where to redirect unauthenticated users",[525,592,593,596],{},[169,594,595],{},"guest",": where to redirect authenticated users trying to access guest-only routes",[525,598,599,602,603,606,607,610,611,614],{},[169,600,601],{},"authenticated",": where to navigate after successful authenticated ",[169,604,605],{},"signIn"," / ",[169,608,609],{},"signUp"," when no ",[169,612,613],{},"onSuccess"," callback is provided",[525,616,617,620],{},[169,618,619],{},"logout",": where to navigate after logout (no default)",[509,622,623,624,626],{},"Per-route ",[169,625,432],{}," takes precedence when set.",[504,628,630,634,637],{"name":629,"type":507},"preserveRedirect",[509,631,511,632],{},[169,633,520],{},[509,635,636],{},"When redirecting unauthenticated users to a login route, append the original requested path as a query param.",[509,638,639,640,492,643,499],{},"Configure redirect targets per-route with ",[169,641,642],{},"routeRules.auth.redirectTo",[169,644,645],{},"definePageMeta({ auth: { redirectTo } })",[504,647,649,654],{"name":648,"type":551},"redirectQueryKey",[509,650,511,651],{},[169,652,653],{},"'redirect'",[509,655,656,657,659],{},"Query param key used when ",[169,658,629],{}," is enabled.",[504,661,664,668,671],{"name":662,"type":663},"hubSecondaryStorage","boolean | 'custom'",[509,665,511,666],{},[169,667,514],{},[509,669,670],{},"Enable secondary storage for sessions, reducing database hits for session validation.",[522,672,673,699,716],{},[525,674,675,677,678,681,682,685,686,429,689,429,692,429,695,698],{},[169,676,520],{}," — Use NuxtHub KV. Requires ",[545,679,680],{"href":117},"NuxtHub Integration"," with ",[169,683,684],{},"hub: { kv: true }",". Build fails if KV is not enabled. Generated schema remains stable and keeps core auth tables (",[169,687,688],{},"user",[169,690,691],{},"account",[169,693,694],{},"session",[169,696,697],{},"verification",").",[525,700,701,704,705,708,709,712,713,715],{},[169,702,703],{},"'custom'"," — You provide your own ",[169,706,707],{},"secondaryStorage"," in ",[169,710,711],{},"defineServerAuth()"," (required; the build fails in production if missing). The module won't inject NuxtHub KV, and this mode can omit the ",[169,714,694],{}," table from generated schema.",[525,717,718,720,721,708,723,725],{},[169,719,514],{}," (default) — No secondary storage from the module. User-provided ",[169,722,707],{},[169,724,711],{}," is not overridden.",[504,727,729,733],{"name":728,"type":507},"schema.usePlural",[509,730,511,731],{},[169,732,514],{},[509,734,735],{},"Pluralize table names (user → users)",[504,737,740,745],{"name":738,"type":739},"schema.casing","'camelCase' | 'snake_case'",[509,741,511,742],{},[169,743,744],{},"camelCase",[509,746,747,748,751],{},"Column/table name casing. Falls back to ",[169,749,750],{},"hub.db.casing"," when not specified.",[246,753,755],{"id":754},"redirect-targets-routerules-first","Redirect Targets (RouteRules-First)",[509,757,758],{},"Prefer redirect paths on route-level auth config:",[161,760,762],{"className":252,"code":761,"filename":254,"language":255,"meta":167,"style":167},"export default defineNuxtConfig({\n  routeRules: {\n    '/app/**': { auth: { only: 'user', redirectTo: '/login' } },\n    '/login': { auth: { only: 'guest', redirectTo: '/app' } },\n  },\n})\n",[169,763,764,774,782,812,842,846],{"__ignoreMap":167},[172,765,766,768,770,772],{"class":174,"line":175},[172,767,263],{"class":262},[172,769,267],{"class":266},[172,771,271],{"class":270},[172,773,275],{"class":274},[172,775,776,778,780],{"class":174,"line":181},[172,777,396],{"class":280},[172,779,285],{"class":284},[172,781,305],{"class":274},[172,783,784,786,788,790,792,794,796,798,800,802,804,806,808,810],{"class":174,"line":188},[172,785,406],{"class":291},[172,787,285],{"class":284},[172,789,411],{"class":274},[172,791,414],{"class":280},[172,793,285],{"class":284},[172,795,411],{"class":274},[172,797,421],{"class":280},[172,799,285],{"class":284},[172,801,426],{"class":291},[172,803,429],{"class":274},[172,805,432],{"class":280},[172,807,285],{"class":284},[172,809,324],{"class":291},[172,811,439],{"class":274},[172,813,814,816,818,820,822,824,826,828,830,832,834,836,838,840],{"class":174,"line":194},[172,815,445],{"class":291},[172,817,285],{"class":284},[172,819,411],{"class":274},[172,821,414],{"class":280},[172,823,285],{"class":284},[172,825,411],{"class":274},[172,827,421],{"class":280},[172,829,285],{"class":284},[172,831,462],{"class":291},[172,833,429],{"class":274},[172,835,432],{"class":280},[172,837,285],{"class":284},[172,839,471],{"class":291},[172,841,439],{"class":274},[172,843,844],{"class":174,"line":200},[172,845,390],{"class":274},[172,847,848],{"class":174,"line":206},[172,849,484],{"class":274},[509,851,852,853,285],{},"You can use the same auth route rules under ",[169,854,495],{},[161,856,858],{"className":252,"code":857,"filename":254,"language":255,"meta":167,"style":167},"export default defineNuxtConfig({\n  nitro: {\n    routeRules: {\n      '/app/**': { auth: { only: 'user', redirectTo: '/login' } },\n      '/login': { auth: { only: 'guest', redirectTo: '/app' } },\n    },\n  },\n})\n",[169,859,860,870,879,888,919,950,954,958],{"__ignoreMap":167},[172,861,862,864,866,868],{"class":174,"line":175},[172,863,263],{"class":262},[172,865,267],{"class":266},[172,867,271],{"class":270},[172,869,275],{"class":274},[172,871,872,875,877],{"class":174,"line":181},[172,873,874],{"class":280},"  nitro",[172,876,285],{"class":284},[172,878,305],{"class":274},[172,880,881,884,886],{"class":174,"line":188},[172,882,883],{"class":280},"    routeRules",[172,885,285],{"class":284},[172,887,305],{"class":274},[172,889,890,893,895,897,899,901,903,905,907,909,911,913,915,917],{"class":174,"line":194},[172,891,892],{"class":291},"      '/app/**'",[172,894,285],{"class":284},[172,896,411],{"class":274},[172,898,414],{"class":280},[172,900,285],{"class":284},[172,902,411],{"class":274},[172,904,421],{"class":280},[172,906,285],{"class":284},[172,908,426],{"class":291},[172,910,429],{"class":274},[172,912,432],{"class":280},[172,914,285],{"class":284},[172,916,324],{"class":291},[172,918,439],{"class":274},[172,920,921,924,926,928,930,932,934,936,938,940,942,944,946,948],{"class":174,"line":200},[172,922,923],{"class":291},"      '/login'",[172,925,285],{"class":284},[172,927,411],{"class":274},[172,929,414],{"class":280},[172,931,285],{"class":284},[172,933,411],{"class":274},[172,935,421],{"class":280},[172,937,285],{"class":284},[172,939,462],{"class":291},[172,941,429],{"class":274},[172,943,432],{"class":280},[172,945,285],{"class":284},[172,947,471],{"class":291},[172,949,439],{"class":274},[172,951,952],{"class":174,"line":206},[172,953,360],{"class":274},[172,955,956],{"class":174,"line":212},[172,957,390],{"class":274},[172,959,960],{"class":174,"line":218},[172,961,484],{"class":274},[509,963,964,965,967],{},"If ",[169,966,432],{}," is omitted, shorthand fallbacks apply:",[522,969,970,979],{},[525,971,972,975,976],{},[169,973,974],{},"auth: 'user'"," falls back to ",[169,977,978],{},"/login",[525,980,981,975,984],{},[169,982,983],{},"auth: 'guest'",[169,985,986],{},"/",[509,988,989,990,499],{},"If you want global defaults for those fallbacks, use ",[169,991,992],{},"auth.redirects",[509,994,995],{},"Default post-auth navigation:",[522,997,998,1011],{},[525,999,1000,1003,1004,606,1006,1008,1009,499],{},[169,1001,1002],{},"auth.redirects.authenticated"," is used when ",[169,1005,605],{},[169,1007,609],{}," complete with an authenticated session and no explicit ",[169,1010,613],{},[525,1012,1013,1014,1017,1018,499],{},"If a preserved redirect query param is present and safe (",[169,1015,1016],{},"?redirect=","), it takes precedence over ",[169,1019,1002],{},[246,1021,1023],{"id":1022},"server-configuration","Server Configuration",[509,1025,1026,1027,1029],{},"Define your authentication logic in ",[169,1028,530],{},", including plugins, providers, and settings.",[1031,1032,1034],"h3",{"id":1033},"defineserverauth","defineServerAuth",[509,1036,1037,1038,1040],{},"Use the ",[169,1039,1034],{}," helper to ensure type safety and access context. It accepts an object or function syntax.",[161,1042,1044],{"className":252,"code":1043,"filename":530,"language":255,"meta":167,"style":167},"import { defineServerAuth } from '@onmax/nuxt-better-auth/config'\n\n// Object syntax (simplest)\nexport default defineServerAuth({\n  emailAndPassword: { enabled: true }\n})\n\n// Function syntax (access context)\nexport default defineServerAuth((ctx) => ({\n  emailAndPassword: { enabled: true }\n}))\n",[169,1045,1046,1064,1068,1073,1084,1103,1107,1111,1116,1140,1156],{"__ignoreMap":167},[172,1047,1048,1051,1053,1055,1058,1061],{"class":174,"line":175},[172,1049,1050],{"class":262},"import",[172,1052,411],{"class":274},[172,1054,1034],{"class":280},[172,1056,1057],{"class":274}," } ",[172,1059,1060],{"class":262},"from",[172,1062,1063],{"class":291}," '@onmax/nuxt-better-auth/config'\n",[172,1065,1066],{"class":174,"line":181},[172,1067,185],{"emptyLinePlaceholder":184},[172,1069,1070],{"class":174,"line":188},[172,1071,1072],{"class":344},"// Object syntax (simplest)\n",[172,1074,1075,1077,1079,1082],{"class":174,"line":194},[172,1076,263],{"class":262},[172,1078,267],{"class":266},[172,1080,1081],{"class":270}," defineServerAuth",[172,1083,275],{"class":274},[172,1085,1086,1089,1091,1093,1096,1098,1100],{"class":174,"line":200},[172,1087,1088],{"class":280},"  emailAndPassword",[172,1090,285],{"class":284},[172,1092,411],{"class":274},[172,1094,1095],{"class":280},"enabled",[172,1097,285],{"class":284},[172,1099,371],{"class":370},[172,1101,1102],{"class":274}," }\n",[172,1104,1105],{"class":174,"line":206},[172,1106,484],{"class":274},[172,1108,1109],{"class":174,"line":212},[172,1110,185],{"emptyLinePlaceholder":184},[172,1112,1113],{"class":174,"line":218},[172,1114,1115],{"class":344},"// Function syntax (access context)\n",[172,1117,1118,1120,1122,1124,1127,1131,1134,1137],{"class":174,"line":224},[172,1119,263],{"class":262},[172,1121,267],{"class":266},[172,1123,1081],{"class":270},[172,1125,1126],{"class":274},"((",[172,1128,1130],{"class":1129},"sgisi","ctx",[172,1132,1133],{"class":274},") ",[172,1135,1136],{"class":262},"=>",[172,1138,1139],{"class":274}," ({\n",[172,1141,1142,1144,1146,1148,1150,1152,1154],{"class":174,"line":230},[172,1143,1088],{"class":280},[172,1145,285],{"class":284},[172,1147,411],{"class":274},[172,1149,1095],{"class":280},[172,1151,285],{"class":284},[172,1153,371],{"class":370},[172,1155,1102],{"class":274},[172,1157,1158],{"class":174,"line":235},[172,1159,1160],{"class":274},"}))\n",[486,1162,1163,1176],{},[509,1164,1165,1166,1169,1170,1173,1174,499],{},"The module automatically injects ",[169,1167,1168],{},"secret"," and ",[169,1171,1172],{},"baseURL",". You don't need to configure these in ",[169,1175,1034],{},[522,1177,1178,1195],{},[525,1179,1180,1184,1185,1187,1188,1191,1192],{},[1181,1182,1183],"strong",{},"Secret",": Priority: ",[169,1186,254],{}," runtimeConfig > ",[169,1189,1190],{},"NUXT_BETTER_AUTH_SECRET"," > ",[169,1193,1194],{},"BETTER_AUTH_SECRET",[525,1196,1197,1200,1201],{},[1181,1198,1199],{},"Base URL",": The module auto-detects the base URL on Vercel/Cloudflare/Netlify. For other platforms, set ",[169,1202,1203],{},"NUXT_PUBLIC_SITE_URL",[1031,1205,1207],{"id":1206},"context-options","Context Options",[509,1209,1210,1211,1213],{},"When using the function syntax, ",[169,1212,1034],{}," callback receives a context object with useful properties:",[161,1215,1217],{"className":252,"code":1216,"filename":530,"language":255,"meta":167,"style":167},"import { defineServerAuth } from '@onmax/nuxt-better-auth/config'\n\nexport default defineServerAuth((ctx) => ({\n  emailAndPassword: { enabled: true },\n\n  // Access the database connection via ctx.db when using NuxtHub\n  // Example: pass ctx.db to your own plugin/helper.\n  // Do not set `database` here when using module-managed adapters.\n  appName: ctx.runtimeConfig.public.siteUrl ? 'Better Auth App' : 'Better Auth',\n\n  // Access runtime config if needed\n  // someValue: ctx.runtimeConfig.customKey\n}))\n",[169,1218,1219,1233,1237,1255,1272,1276,1281,1286,1291,1332,1336,1341,1346],{"__ignoreMap":167},[172,1220,1221,1223,1225,1227,1229,1231],{"class":174,"line":175},[172,1222,1050],{"class":262},[172,1224,411],{"class":274},[172,1226,1034],{"class":280},[172,1228,1057],{"class":274},[172,1230,1060],{"class":262},[172,1232,1063],{"class":291},[172,1234,1235],{"class":174,"line":181},[172,1236,185],{"emptyLinePlaceholder":184},[172,1238,1239,1241,1243,1245,1247,1249,1251,1253],{"class":174,"line":188},[172,1240,263],{"class":262},[172,1242,267],{"class":266},[172,1244,1081],{"class":270},[172,1246,1126],{"class":274},[172,1248,1130],{"class":1129},[172,1250,1133],{"class":274},[172,1252,1136],{"class":262},[172,1254,1139],{"class":274},[172,1256,1257,1259,1261,1263,1265,1267,1269],{"class":174,"line":194},[172,1258,1088],{"class":280},[172,1260,285],{"class":284},[172,1262,411],{"class":274},[172,1264,1095],{"class":280},[172,1266,285],{"class":284},[172,1268,371],{"class":370},[172,1270,1271],{"class":274}," },\n",[172,1273,1274],{"class":174,"line":200},[172,1275,185],{"emptyLinePlaceholder":184},[172,1277,1278],{"class":174,"line":206},[172,1279,1280],{"class":344},"  // Access the database connection via ctx.db when using NuxtHub\n",[172,1282,1283],{"class":174,"line":212},[172,1284,1285],{"class":344},"  // Example: pass ctx.db to your own plugin/helper.\n",[172,1287,1288],{"class":174,"line":218},[172,1289,1290],{"class":344},"  // Do not set `database` here when using module-managed adapters.\n",[172,1292,1293,1296,1298,1302,1304,1307,1309,1312,1314,1317,1321,1324,1327,1330],{"class":174,"line":224},[172,1294,1295],{"class":280},"  appName",[172,1297,285],{"class":284},[172,1299,1301],{"class":1300},"svFNh"," ctx",[172,1303,499],{"class":274},[172,1305,1306],{"class":280},"runtimeConfig",[172,1308,499],{"class":274},[172,1310,1311],{"class":280},"public",[172,1313,499],{"class":274},[172,1315,1316],{"class":280},"siteUrl",[172,1318,1320],{"class":1319},"sn-Jc"," ?",[172,1322,1323],{"class":291}," 'Better Auth App'",[172,1325,1326],{"class":1319}," :",[172,1328,1329],{"class":291}," 'Better Auth'",[172,1331,327],{"class":274},[172,1333,1334],{"class":174,"line":230},[172,1335,185],{"emptyLinePlaceholder":184},[172,1337,1338],{"class":174,"line":235},[172,1339,1340],{"class":344},"  // Access runtime config if needed\n",[172,1342,1343],{"class":174,"line":241},[172,1344,1345],{"class":344},"  // someValue: ctx.runtimeConfig.customKey\n",[172,1347,1348],{"class":174,"line":393},[172,1349,1160],{"class":274},[1031,1351,1353],{"id":1352},"session-enrichment","Session Enrichment",[509,1355,1356,1357,1360,1361,708,1364,1366,1367,1370],{},"You can enrich session payloads with Better Auth's ",[169,1358,1359],{},"custom-session"," plugin through ",[169,1362,1363],{},"plugins",[169,1365,1034],{},". This module does not provide a separate ",[169,1368,1369],{},"requestSession.enrich"," option.",[509,1372,1373,1374,499],{},"See the full recipe in ",[545,1375,141],{"href":1376},"/api/server-utils#session-enrichment-with-custom-session",[246,1378,1380],{"id":1379},"base-url-configuration","Base URL Configuration",[509,1382,1383,1384,1386],{},"The module resolves ",[169,1385,1316],{}," using this priority:",[1388,1389,1390,1406],"table",{},[1391,1392,1393],"thead",{},[1394,1395,1396,1400,1403],"tr",{},[1397,1398,1399],"th",{},"Priority",[1397,1401,1402],{},"Source",[1397,1404,1405],{},"When Used",[1407,1408,1409,1423,1438,1457],"tbody",{},[1394,1410,1411,1415,1420],{},[1412,1413,1414],"td",{},"1",[1412,1416,1417],{},[169,1418,1419],{},"runtimeConfig.public.siteUrl",[1412,1421,1422],{},"Explicit config (always wins)",[1394,1424,1425,1428,1431],{},[1412,1426,1427],{},"2",[1412,1429,1430],{},"Request URL",[1412,1432,1433,1434,1437],{},"Auto-detected from the current Nitro request (",[169,1435,1436],{},"event",")",[1394,1439,1440,1443,1454],{},[1412,1441,1442],{},"3",[1412,1444,1445,429,1448,429,1451],{},[169,1446,1447],{},"VERCEL_URL",[169,1449,1450],{},"CF_PAGES_URL",[169,1452,1453],{},"URL",[1412,1455,1456],{},"Platform env vars (Vercel, Cloudflare, Netlify)",[1394,1458,1459,1462,1467],{},[1412,1460,1461],{},"4",[1412,1463,1464],{},[169,1465,1466],{},"http://localhost:3000",[1412,1468,1469],{},"Development only",[509,1471,1472,1473,1475,1476,1479],{},"In server handlers, pass ",[169,1474,1436],{}," to ",[169,1477,1478],{},"serverAuth(event)"," so request URL detection can run. In non-request contexts (seed scripts, tasks, startup plugins), the module uses environment/platform fallbacks.",[509,1481,1482,1483,1485],{},"Set an explicit site URL in ",[169,1484,254],{}," for deterministic OAuth callbacks and origin checks:",[161,1487,1489],{"className":252,"code":1488,"filename":254,"language":255,"meta":167,"style":167},"export default defineNuxtConfig({\n  runtimeConfig: {\n    public: {\n      siteUrl: process.env.NUXT_PUBLIC_SITE_URL || 'http://localhost:3000',\n    },\n  },\n})\n",[169,1490,1491,1501,1510,1519,1547,1551,1555],{"__ignoreMap":167},[172,1492,1493,1495,1497,1499],{"class":174,"line":175},[172,1494,263],{"class":262},[172,1496,267],{"class":266},[172,1498,271],{"class":270},[172,1500,275],{"class":274},[172,1502,1503,1506,1508],{"class":174,"line":181},[172,1504,1505],{"class":280},"  runtimeConfig",[172,1507,285],{"class":284},[172,1509,305],{"class":274},[172,1511,1512,1515,1517],{"class":174,"line":188},[172,1513,1514],{"class":280},"    public",[172,1516,285],{"class":284},[172,1518,305],{"class":274},[172,1520,1521,1524,1526,1529,1531,1534,1536,1539,1542,1545],{"class":174,"line":194},[172,1522,1523],{"class":280},"      siteUrl",[172,1525,285],{"class":284},[172,1527,1528],{"class":1300}," process",[172,1530,499],{"class":274},[172,1532,1533],{"class":280},"env",[172,1535,499],{"class":274},[172,1537,1203],{"class":1538},"s6Rhl",[172,1540,1541],{"class":1319}," ||",[172,1543,1544],{"class":291}," 'http://localhost:3000'",[172,1546,327],{"class":274},[172,1548,1549],{"class":174,"line":200},[172,1550,360],{"class":274},[172,1552,1553],{"class":174,"line":206},[172,1554,390],{"class":274},[172,1556,1557],{"class":174,"line":212},[172,1558,484],{"class":274},[509,1560,1561,1562,1564],{},"Use ",[169,1563,1203],{}," to provide this value per environment.",[509,1566,1567,1570,1571,1573,1574,1576],{},[1181,1568,1569],{},"Custom domains or self-hosted",": You should set ",[169,1572,1419],{}," (or ",[169,1575,1203],{},") when using custom domains or deploying to your own VPS/server. Platform env vars return auto-generated URLs, not your custom domain.",[161,1578,1583],{"className":1579,"code":1580,"filename":1581,"language":1582,"meta":167,"style":167},"language-ini shiki shiki-themes one-light synthwave-84 synthwave-84","NUXT_PUBLIC_SITE_URL=\"https://your-domain.com\"\n",".env","ini",[169,1584,1585],{"__ignoreMap":167},[172,1586,1587],{"class":174,"line":175},[172,1588,1580],{},[486,1590,1591,1592,1573,1594,1596],{},"The module can auto-detect the request URL on most deployments. You should still set ",[169,1593,1419],{},[169,1595,1203],{},") when callback consistency matters, such as local OAuth debugging, custom domains, or non-request contexts like seed scripts.",[246,1598,1600],{"id":1599},"runtime-config","Runtime Config",[509,1602,1603,1604,698],{},"Configure secrets using environment variables (see ",[545,1605,13],{"href":1606},"/getting-started/installation#set-environment-variables",[161,1608,1610],{"className":1579,"code":1609,"filename":1581,"language":1582,"meta":167,"style":167},"NUXT_BETTER_AUTH_SECRET=\"your-super-secret-key\"\nNUXT_PUBLIC_SITE_URL=\"https://your-domain.com\" # Optional on Vercel/Cloudflare/Netlify\n",[169,1611,1612,1617],{"__ignoreMap":167},[172,1613,1614],{"class":174,"line":175},[172,1615,1616],{},"NUXT_BETTER_AUTH_SECRET=\"your-super-secret-key\"\n",[172,1618,1619],{"class":174,"line":181},[172,1620,1621],{},"NUXT_PUBLIC_SITE_URL=\"https://your-domain.com\" # Optional on Vercel/Cloudflare/Netlify\n",[1623,1624,1561,1625,1627,1628,1630],"tip",{},[169,1626,1190],{}," as the primary secret variable. ",[169,1629,1194],{}," remains supported as a fallback for existing setups.",[246,1632,1634],{"id":1633},"for-module-authors","For Module Authors",[509,1636,1637],{},"Other Nuxt modules can extend the authentication configuration:",[161,1639,1641],{"className":252,"code":1640,"language":255,"meta":167,"style":167},"// In your Nuxt module\nexport default defineNuxtModule({\n  setup(options, nuxt) {\n    nuxt.hook('better-auth:config:extend', (config) => {\n      config.plugins = [...(config.plugins || []), myPlugin()]\n    })\n  }\n})\n",[169,1642,1643,1648,1659,1678,1705,1743,1748,1753],{"__ignoreMap":167},[172,1644,1645],{"class":174,"line":175},[172,1646,1647],{"class":344},"// In your Nuxt module\n",[172,1649,1650,1652,1654,1657],{"class":174,"line":181},[172,1651,263],{"class":262},[172,1653,267],{"class":266},[172,1655,1656],{"class":270}," defineNuxtModule",[172,1658,275],{"class":274},[172,1660,1661,1664,1667,1670,1672,1675],{"class":174,"line":188},[172,1662,1663],{"class":270},"  setup",[172,1665,1666],{"class":274},"(",[172,1668,1669],{"class":1129},"options",[172,1671,429],{"class":274},[172,1673,1674],{"class":1129},"nuxt",[172,1676,1677],{"class":274},") {\n",[172,1679,1680,1683,1685,1688,1690,1693,1696,1699,1701,1703],{"class":174,"line":194},[172,1681,1682],{"class":1300},"    nuxt",[172,1684,499],{"class":274},[172,1686,1687],{"class":270},"hook",[172,1689,1666],{"class":274},[172,1691,1692],{"class":291},"'better-auth:config:extend'",[172,1694,1695],{"class":274},", (",[172,1697,1698],{"class":1129},"config",[172,1700,1133],{"class":274},[172,1702,1136],{"class":262},[172,1704,305],{"class":274},[172,1706,1707,1710,1712,1714,1718,1720,1723,1725,1727,1729,1732,1734,1737,1740],{"class":174,"line":200},[172,1708,1709],{"class":1300},"      config",[172,1711,499],{"class":274},[172,1713,1363],{"class":280},[172,1715,1717],{"class":1716},"sQBpM"," =",[172,1719,288],{"class":274},[172,1721,1722],{"class":1319},"...",[172,1724,1666],{"class":274},[172,1726,1698],{"class":1300},[172,1728,499],{"class":274},[172,1730,1363],{"class":1731},"sjaJz",[172,1733,1541],{"class":1319},[172,1735,1736],{"class":274}," []), ",[172,1738,1739],{"class":270},"myPlugin",[172,1741,1742],{"class":274},"()]\n",[172,1744,1745],{"class":174,"line":206},[172,1746,1747],{"class":274},"    })\n",[172,1749,1750],{"class":174,"line":212},[172,1751,1752],{"class":274},"  }\n",[172,1754,1755],{"class":174,"line":218},[172,1756,484],{"class":274},[509,1758,1759],{},"Access sessions from server handlers:",[161,1761,1763],{"className":252,"code":1762,"language":255,"meta":167,"style":167},"const { user, session } = await getUserSession(event)\nif (!user) throw createError({ statusCode: 401 })\n",[169,1764,1765,1796],{"__ignoreMap":167},[172,1766,1767,1770,1772,1774,1776,1778,1780,1783,1786,1789,1791,1793],{"class":174,"line":175},[172,1768,1769],{"class":262},"const",[172,1771,411],{"class":274},[172,1773,688],{"class":1538},[172,1775,429],{"class":274},[172,1777,694],{"class":1538},[172,1779,1057],{"class":274},[172,1781,1782],{"class":1716},"=",[172,1784,1785],{"class":262}," await",[172,1787,1788],{"class":270}," getUserSession",[172,1790,1666],{"class":274},[172,1792,1436],{"class":1300},[172,1794,1795],{"class":274},")\n",[172,1797,1798,1801,1804,1807,1809,1811,1814,1817,1820,1823,1825,1828],{"class":174,"line":181},[172,1799,1800],{"class":262},"if",[172,1802,1803],{"class":274}," (",[172,1805,1806],{"class":1319},"!",[172,1808,688],{"class":1300},[172,1810,1133],{"class":274},[172,1812,1813],{"class":262},"throw",[172,1815,1816],{"class":270}," createError",[172,1818,1819],{"class":274},"({ ",[172,1821,1822],{"class":280},"statusCode",[172,1824,285],{"class":284},[172,1826,1827],{"class":370}," 401",[172,1829,1830],{"class":274}," })\n",[1832,1833,1834],"style",{},"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 .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 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}html pre.shiki code .s3ZNE, html code.shiki .s3ZNE{--shiki-light:#986801;--shiki-default:#F97E72;--shiki-dark:#F97E72}html pre.shiki code .sgisi, html code.shiki .sgisi{--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-default:#FF7EDB;--shiki-default-font-style:italic;--shiki-dark:#FF7EDB;--shiki-dark-font-style:italic}html pre.shiki code .svFNh, html code.shiki .svFNh{--shiki-light:#383A42;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .sn-Jc, html code.shiki .sn-Jc{--shiki-light:#0184BC;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .s6Rhl, html code.shiki .s6Rhl{--shiki-light:#986801;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .sQBpM, html code.shiki .sQBpM{--shiki-light:#0184BC;--shiki-default:#FFFFFFEE;--shiki-dark:#FFFFFFEE}html pre.shiki code .sjaJz, html code.shiki .sjaJz{--shiki-light:#C18401;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}",{"title":167,"searchDepth":181,"depth":181,"links":1836},[1837,1838,1839,1844,1845,1846],{"id":248,"depth":181,"text":249},{"id":754,"depth":181,"text":755},{"id":1022,"depth":181,"text":1023,"children":1840},[1841,1842,1843],{"id":1033,"depth":188,"text":1034},{"id":1206,"depth":188,"text":1207},{"id":1352,"depth":188,"text":1353},{"id":1379,"depth":181,"text":1380},{"id":1599,"depth":181,"text":1600},{"id":1633,"depth":181,"text":1634},"Configure the module options and your Better Auth server instance.","md",null,{},{"icon":21},{"title":18,"description":1847},"4WxVCJBvje8FkPEm1Rsflf5qgrakP0Immx47OSxDv0M",[1855,1857],{"title":13,"path":14,"stem":15,"description":1856,"icon":16,"children":-1},"Learn how to add Nuxt Better Auth to your Nuxt project.",{"title":23,"path":24,"stem":25,"description":1858,"icon":26,"children":-1},"Configure the client-side authentication client.",1774189122923]