[{"data":1,"prerenderedAt":1418},["ShallowReactive",2],{"navigation_docs":3,"-core-concepts-sessions":208,"-core-concepts-sessions-surround":1413},[4,42,68,115,136,157],{"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,82,86,90,94,99,103,107,111],{"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,"icon":81},"Setup diagnostics","\u002Fguides\u002Fdiagnostics","3.guides\u002F10.diagnostics","i-lucide-circle-alert",{"title":83,"path":84,"stem":85},"OAuth Providers","\u002Fguides\u002Foauth-providers","3.guides\u002F2.oauth-providers",{"title":87,"path":88,"stem":89},"Custom Database","\u002Fguides\u002Fcustom-database","3.guides\u002F3.custom-database",{"title":91,"path":92,"stem":93},"Database-less Mode","\u002Fguides\u002Fdatabase-less-mode","3.guides\u002F4.database-less-mode",{"title":95,"path":96,"stem":97,"icon":98},"External Auth Backend","\u002Fguides\u002Fexternal-auth-backend","3.guides\u002F5.external-auth-backend","i-lucide-server",{"title":100,"path":101,"stem":102},"Migrating from nuxt-auth-utils","\u002Fguides\u002Fmigrate-from-nuxt-auth-utils","3.guides\u002F6.migrate-from-nuxt-auth-utils",{"title":104,"path":105,"stem":106},"Two-Factor Authentication (TOTP + Backup Codes)","\u002Fguides\u002Ftwo-factor-auth","3.guides\u002F7.two-factor-auth",{"title":108,"path":109,"stem":110},"Testing","\u002Fguides\u002Ftesting","3.guides\u002F8.testing",{"title":112,"path":113,"stem":114},"Production Deployment","\u002Fguides\u002Fproduction-deployment","3.guides\u002F9.production-deployment",{"title":116,"path":117,"stem":118,"children":119,"page":67},"Integrations","\u002Fintegrations","4.integrations",[120,124,128,132],{"title":121,"path":122,"stem":123},"NuxtHub","\u002Fintegrations\u002Fnuxthub","4.integrations\u002F1.nuxthub",{"title":125,"path":126,"stem":127},"DevTools","\u002Fintegrations\u002Fdevtools","4.integrations\u002F2.devtools",{"title":129,"path":130,"stem":131},"Convex","\u002Fintegrations\u002Fconvex","4.integrations\u002F3.convex",{"title":133,"path":134,"stem":135},"i18n","\u002Fintegrations\u002Fi18n","4.integrations\u002F4.i18n",{"title":137,"path":138,"stem":139,"children":140,"page":67},"API Reference","\u002Fapi","5.api",[141,145,149,153],{"title":142,"path":143,"stem":144},"Composables","\u002Fapi\u002Fcomposables","5.api\u002F1.composables",{"title":146,"path":147,"stem":148},"Server Utilities","\u002Fapi\u002Fserver-utils","5.api\u002F2.server-utils",{"title":150,"path":151,"stem":152},"Components","\u002Fapi\u002Fcomponents","5.api\u002F3.components",{"title":154,"path":155,"stem":156},"Types","\u002Fapi\u002Ftypes","5.api\u002F4.types",{"title":158,"path":159,"stem":160,"children":161,"icon":81},"Errors","\u002Ferrors","6.errors\u002F0.index",[162,164,168,172,176,180,184,188,192,196,200,204],{"title":163,"path":159,"stem":160},"Overview",{"title":165,"path":166,"stem":167},"Auth configuration failed to load","\u002Ferrors\u002Fnuxt-auth-config-load-failed","6.errors\u002Fnuxt-auth-config-load-failed",{"title":169,"path":170,"stem":171},"Schema generator returned no code","\u002Ferrors\u002Fnuxt-auth-empty-schema","6.errors\u002Fnuxt-auth-empty-schema",{"title":173,"path":174,"stem":175},"Invalid server auth config export","\u002Ferrors\u002Fnuxt-auth-invalid-config-export","6.errors\u002Fnuxt-auth-invalid-config-export",{"title":177,"path":178,"stem":179},"Auth plugin path must be absolute","\u002Ferrors\u002Fnuxt-auth-invalid-plugin-source","6.errors\u002Fnuxt-auth-invalid-plugin-source",{"title":181,"path":182,"stem":183},"Missing auth configuration","\u002Ferrors\u002Fnuxt-auth-missing-config","6.errors\u002Fnuxt-auth-missing-config",{"title":185,"path":186,"stem":187},"NuxtHub database alias is missing","\u002Ferrors\u002Fnuxt-auth-missing-hub-db","6.errors\u002Fnuxt-auth-missing-hub-db",{"title":189,"path":190,"stem":191},"No database provider is enabled","\u002Ferrors\u002Fnuxt-auth-no-database-provider","6.errors\u002Fnuxt-auth-no-database-provider",{"title":193,"path":194,"stem":195},"Auth schema generation failed","\u002Ferrors\u002Fnuxt-auth-schema-generation-failed","6.errors\u002Fnuxt-auth-schema-generation-failed",{"title":197,"path":198,"stem":199},"Custom session storage is missing","\u002Ferrors\u002Fnuxt-auth-schema-storage-required","6.errors\u002Fnuxt-auth-schema-storage-required",{"title":201,"path":202,"stem":203},"Secondary storage in client-only mode","\u002Ferrors\u002Fnuxt-auth-storage-client-only","6.errors\u002Fnuxt-auth-storage-client-only",{"title":205,"path":206,"stem":207},"Unsupported database dialect","\u002Ferrors\u002Fnuxt-auth-unsupported-dialect","6.errors\u002Fnuxt-auth-unsupported-dialect",{"id":209,"title":52,"body":210,"description":1407,"extension":1408,"links":1409,"meta":1410,"navigation":240,"path":53,"seo":1411,"stem":54,"__hash__":1412},"docs\u002F2.core-concepts\u002F2.sessions.md",{"type":211,"value":212,"toc":1397},"minimark",[213,290,294,372,377,380,426,429,458,569,579,583,590,593,659,662,730,733,737,740,744,748,911,915,918,1000,1004,1007,1115,1118,1171,1175,1178,1240,1250,1254,1257,1390,1393],[214,215,216],"code-collapse",{},[217,218,224],"pre",{"className":219,"code":220,"filename":221,"language":222,"meta":223,"style":223},"language-txt shiki shiki-themes one-light synthwave-84 synthwave-84","Handle sessions with @nuxtjs\u002Fbetter-auth using useUserSession().\n\n- `useUserSession()` is auto-imported and returns: user, session, loggedIn, ready, signOut, fetchSession\n- SSR: session is fetched server-side via cookies and hydrated — `ready` is `true` after hydration\n- Client: use `useSignIn()`, `useSignUp()`, or `useAuthClient()` for Better Auth client methods\n- Split model: use `useUserSession()` in pages\u002Fcomponents, use `requireUserSession(event)` in server handlers\n- Configure session lifetime in `server\u002Fauth.config.ts` via `session.expiresIn` and `session.cookieCache`\n- Use `\u003CBetterAuthState>` or `ready` ref to avoid loading flashes\n- Force refresh: `fetchSession({ force: true })`\n- Custom auth action sync: `runWithSessionRefresh(() => $fetch('\u002Fapi\u002Fauth\u002F...'))`\n","Prompt","txt","",[225,226,227,235,242,248,254,260,266,272,278,284],"code",{"__ignoreMap":223},[228,229,232],"span",{"class":230,"line":231},"line",1,[228,233,234],{},"Handle sessions with @nuxtjs\u002Fbetter-auth using useUserSession().\n",[228,236,238],{"class":230,"line":237},2,[228,239,241],{"emptyLinePlaceholder":240},true,"\n",[228,243,245],{"class":230,"line":244},3,[228,246,247],{},"- `useUserSession()` is auto-imported and returns: user, session, loggedIn, ready, signOut, fetchSession\n",[228,249,251],{"class":230,"line":250},4,[228,252,253],{},"- SSR: session is fetched server-side via cookies and hydrated — `ready` is `true` after hydration\n",[228,255,257],{"class":230,"line":256},5,[228,258,259],{},"- Client: use `useSignIn()`, `useSignUp()`, or `useAuthClient()` for Better Auth client methods\n",[228,261,263],{"class":230,"line":262},6,[228,264,265],{},"- Split model: use `useUserSession()` in pages\u002Fcomponents, use `requireUserSession(event)` in server handlers\n",[228,267,269],{"class":230,"line":268},7,[228,270,271],{},"- Configure session lifetime in `server\u002Fauth.config.ts` via `session.expiresIn` and `session.cookieCache`\n",[228,273,275],{"class":230,"line":274},8,[228,276,277],{},"- Use `\u003CBetterAuthState>` or `ready` ref to avoid loading flashes\n",[228,279,281],{"class":230,"line":280},9,[228,282,283],{},"- Force refresh: `fetchSession({ force: true })`\n",[228,285,287],{"class":230,"line":286},10,[228,288,289],{},"- Custom auth action sync: `runWithSessionRefresh(() => $fetch('\u002Fapi\u002Fauth\u002F...'))`\n",[291,292,293],"p",{},"Use this page when you want to understand how session state moves between SSR, hydration, client updates, and server-side access.",[217,295,300],{"className":296,"code":297,"filename":298,"language":299,"meta":223,"style":223},"language-ts shiki shiki-themes one-light synthwave-84 synthwave-84","const {\n  user,\n  session,\n  loggedIn,\n  ready,\n  signOut,\n  fetchSession,\n} = useUserSession()\n","pages\u002Fdashboard.vue","ts",[225,301,302,312,321,328,335,342,349,356],{"__ignoreMap":223},[228,303,304,308],{"class":230,"line":231},[228,305,307],{"class":306},"sqe1H","const",[228,309,311],{"class":310},"s17Py"," {\n",[228,313,314,318],{"class":230,"line":237},[228,315,317],{"class":316},"s6Rhl","  user",[228,319,320],{"class":310},",\n",[228,322,323,326],{"class":230,"line":244},[228,324,325],{"class":316},"  session",[228,327,320],{"class":310},[228,329,330,333],{"class":230,"line":250},[228,331,332],{"class":316},"  loggedIn",[228,334,320],{"class":310},[228,336,337,340],{"class":230,"line":256},[228,338,339],{"class":316},"  ready",[228,341,320],{"class":310},[228,343,344,347],{"class":230,"line":262},[228,345,346],{"class":316},"  signOut",[228,348,320],{"class":310},[228,350,351,354],{"class":230,"line":268},[228,352,353],{"class":316},"  fetchSession",[228,355,320],{"class":310},[228,357,358,361,365,369],{"class":230,"line":274},[228,359,360],{"class":310},"} ",[228,362,364],{"class":363},"sQBpM","=",[228,366,368],{"class":367},"sfT9l"," useUserSession",[228,370,371],{"class":310},"()\n",[373,374,376],"h2",{"id":375},"ssr-behavior","SSR behavior",[291,378,379],{},"During server-side rendering (SSR), the module fetches the session using incoming request cookies and populates state before rendering. A client plugin then keeps the state in sync after hydration.",[381,382,383,407,420],"ul",{},[384,385,386,390,391,394,395,398,399,402,403,406],"li",{},[387,388,389],"strong",{},"Server render:"," ",[225,392,393],{},"user"," and ",[225,396,397],{},"session"," are set when a valid session cookie exists, and ",[225,400,401],{},"ready"," is ",[225,404,405],{},"true",".",[384,408,409,390,412,415,416,419],{},[387,410,411],{},"Server runtime client access:",[225,413,414],{},"useAuthClient()"," returns ",[225,417,418],{},"null"," during SSR.",[384,421,422,425],{},[387,423,424],{},"After hydration:"," State stays in sync with client-side updates.",[291,427,428],{},"Use a split model:",[381,430,431,446],{},[384,432,433,434,437,438,441,442,445],{},"In pages and components, use ",[225,435,436],{},"useUserSession()"," state and SSR-safe fetch helpers (",[225,439,440],{},"useAuthRequestFetch",", ",[225,443,444],{},"useAuthAsyncData",").",[384,447,448,449,441,452,441,455,445],{},"In server handlers and routes, use server utilities (",[225,450,451],{},"serverAuth",[225,453,454],{},"getUserSession",[225,456,457],{},"requireUserSession",[217,459,462],{"className":296,"code":460,"filename":461,"language":299,"meta":223,"style":223},"export default defineEventHandler(async (event) => {\n  const { user } = await requireUserSession(event)\n  return { id: user.id, email: user.email }\n})\n","server\u002Fapi\u002Fprofile.get.ts",[225,463,464,497,526,564],{"__ignoreMap":223},[228,465,466,469,473,476,479,482,485,489,492,495],{"class":230,"line":231},[228,467,468],{"class":306},"export",[228,470,472],{"class":471},"sKg8T"," default",[228,474,475],{"class":367}," defineEventHandler",[228,477,478],{"class":310},"(",[228,480,481],{"class":306},"async",[228,483,484],{"class":310}," (",[228,486,488],{"class":487},"sgisi","event",[228,490,491],{"class":310},") ",[228,493,494],{"class":306},"=>",[228,496,311],{"class":310},[228,498,499,502,505,507,510,512,515,518,520,523],{"class":230,"line":237},[228,500,501],{"class":306},"  const",[228,503,504],{"class":310}," { ",[228,506,393],{"class":316},[228,508,509],{"class":310}," } ",[228,511,364],{"class":363},[228,513,514],{"class":306}," await",[228,516,517],{"class":367}," requireUserSession",[228,519,478],{"class":310},[228,521,488],{"class":522},"sYvLG",[228,524,525],{"class":310},")\n",[228,527,528,531,533,536,540,544,546,548,550,553,555,557,559,561],{"class":230,"line":244},[228,529,530],{"class":306},"  return",[228,532,504],{"class":310},[228,534,535],{"class":522},"id",[228,537,539],{"class":538},"sVnqq",":",[228,541,543],{"class":542},"svFNh"," user",[228,545,406],{"class":310},[228,547,535],{"class":522},[228,549,441],{"class":310},[228,551,552],{"class":522},"email",[228,554,539],{"class":538},[228,556,543],{"class":542},[228,558,406],{"class":310},[228,560,552],{"class":522},[228,562,563],{"class":310}," }\n",[228,565,566],{"class":230,"line":250},[228,567,568],{"class":310},"})\n",[291,570,571,572,574,575,578],{},"For prerendered or cached pages, the client plugin fetches the session after mount. Use ",[225,573,401],{}," or ",[225,576,577],{},"\u003CBetterAuthState>"," to avoid flashes in those cases.",[373,580,582],{"id":581},"auth-readiness-vs-domain-data-readiness","Auth Readiness vs Domain Data Readiness",[291,584,585,394,587,589],{},[225,586,401],{},[225,588,577],{}," guarantee only that auth hydration has finished. They do not guarantee that additional auth-bound domain data (billing state, role membership, entitlements) has loaded.",[291,591,592],{},"When rendering UI that depends on both auth and domain data, fetch that domain data SSR-first:",[217,594,597],{"className":296,"code":595,"filename":596,"language":299,"meta":223,"style":223},"const { data: customerState } = await useFetch('\u002Fapi\u002Fauth\u002Fcustomer\u002Fstate')\nconst { data: customerById } = await useFetch('\u002Fapi\u002Fauth\u002Fcustomer\u002F123\u002Fstate')\n","pages\u002Fapp.vue",[225,598,599,631],{"__ignoreMap":223},[228,600,601,603,605,608,611,614,616,618,620,623,625,629],{"class":230,"line":231},[228,602,307],{"class":306},[228,604,504],{"class":310},[228,606,607],{"class":522},"data",[228,609,610],{"class":310},": ",[228,612,613],{"class":316},"customerState",[228,615,509],{"class":310},[228,617,364],{"class":363},[228,619,514],{"class":306},[228,621,622],{"class":367}," useFetch",[228,624,478],{"class":310},[228,626,628],{"class":627},"sPAZv","'\u002Fapi\u002Fauth\u002Fcustomer\u002Fstate'",[228,630,525],{"class":310},[228,632,633,635,637,639,641,644,646,648,650,652,654,657],{"class":230,"line":237},[228,634,307],{"class":306},[228,636,504],{"class":310},[228,638,607],{"class":522},[228,640,610],{"class":310},[228,642,643],{"class":316},"customerById",[228,645,509],{"class":310},[228,647,364],{"class":363},[228,649,514],{"class":306},[228,651,622],{"class":367},[228,653,478],{"class":310},[228,655,656],{"class":627},"'\u002Fapi\u002Fauth\u002Fcustomer\u002F123\u002Fstate'",[228,658,525],{"class":310},[291,660,661],{},"Endpoint payloads are inferred from your Better Auth config (core + plugins), including dynamic auth paths.",[217,663,665],{"className":296,"code":664,"filename":596,"language":299,"meta":223,"style":223},"const { data: customerState, pending, error } = await useAuthAsyncData(\n  'customer-state',\n  requestFetch => requestFetch('\u002Fapi\u002Fauth\u002Fcustomer\u002Fstate'),\n)\n",[225,666,667,701,708,726],{"__ignoreMap":223},[228,668,669,671,673,675,677,679,681,684,686,689,691,693,695,698],{"class":230,"line":231},[228,670,307],{"class":306},[228,672,504],{"class":310},[228,674,607],{"class":522},[228,676,610],{"class":310},[228,678,613],{"class":316},[228,680,441],{"class":310},[228,682,683],{"class":316},"pending",[228,685,441],{"class":310},[228,687,688],{"class":316},"error",[228,690,509],{"class":310},[228,692,364],{"class":363},[228,694,514],{"class":306},[228,696,697],{"class":367}," useAuthAsyncData",[228,699,700],{"class":310},"(\n",[228,702,703,706],{"class":230,"line":237},[228,704,705],{"class":627},"  'customer-state'",[228,707,320],{"class":310},[228,709,710,713,716,719,721,723],{"class":230,"line":244},[228,711,712],{"class":487},"  requestFetch",[228,714,715],{"class":306}," =>",[228,717,718],{"class":367}," requestFetch",[228,720,478],{"class":310},[228,722,628],{"class":627},[228,724,725],{"class":310},"),\n",[228,727,728],{"class":230,"line":250},[228,729,525],{"class":310},[291,731,732],{},"This prevents first-paint UI flips where unauthenticated defaults briefly appear before domain data resolves.",[373,734,736],{"id":735},"cookie-vs-database-sessions","Cookie vs Database Sessions",[291,738,739],{},"Database sessions (default): stored in DB, revocable, visible in admin\nJWE sessions (database-less): encrypted cookie, no server storage",[741,742],"read-more",{"to":743},"https:\u002F\u002Fwww.better-auth.com\u002Fdocs\u002Fconcepts\u002Fsession-management",[373,745,747],{"id":746},"handling-loading-state","Handling Loading State",[217,749,754],{"className":750,"code":751,"filename":752,"language":753,"meta":223,"style":223},"language-vue shiki shiki-themes one-light synthwave-84 synthwave-84","\u003Cscript setup lang=\"ts\">\nconst { user, loggedIn, ready } = useUserSession()\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cdiv v-if=\"!ready\">Loading...\u003C\u002Fdiv>\n  \u003Cdiv v-else-if=\"loggedIn\">Welcome, {{ user?.name }}\u003C\u002Fdiv>\n  \u003Cdiv v-else>Please log in\u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n","pages\u002Fprotected.vue","vue",[225,755,756,782,808,817,821,830,858,883,903],{"__ignoreMap":223},[228,757,758,762,766,770,773,776,779],{"class":230,"line":231},[228,759,761],{"class":760},"sL9le","\u003C",[228,763,765],{"class":764},"stweg","script",[228,767,769],{"class":768},"s0frj"," setup",[228,771,772],{"class":768}," lang",[228,774,364],{"class":775},"sNM9w",[228,777,778],{"class":627},"\"ts\"",[228,780,781],{"class":760},">\n",[228,783,784,786,789,791,793,796,798,800,802,804,806],{"class":230,"line":237},[228,785,307],{"class":306},[228,787,504],{"class":788},"sEEOt",[228,790,393],{"class":316},[228,792,441],{"class":788},[228,794,795],{"class":316},"loggedIn",[228,797,441],{"class":788},[228,799,401],{"class":316},[228,801,509],{"class":788},[228,803,364],{"class":363},[228,805,368],{"class":367},[228,807,371],{"class":788},[228,809,810,813,815],{"class":230,"line":244},[228,811,812],{"class":760},"\u003C\u002F",[228,814,765],{"class":764},[228,816,781],{"class":760},[228,818,819],{"class":230,"line":250},[228,820,241],{"emptyLinePlaceholder":240},[228,822,823,825,828],{"class":230,"line":256},[228,824,761],{"class":760},[228,826,827],{"class":764},"template",[228,829,781],{"class":760},[228,831,832,835,838,841,843,846,849,852,854,856],{"class":230,"line":262},[228,833,834],{"class":760},"  \u003C",[228,836,837],{"class":764},"div",[228,839,840],{"class":768}," v-if",[228,842,364],{"class":775},[228,844,845],{"class":627},"\"!ready\"",[228,847,848],{"class":760},">",[228,850,851],{"class":788},"Loading...",[228,853,812],{"class":760},[228,855,837],{"class":764},[228,857,781],{"class":760},[228,859,860,862,864,867,869,872,874,877,879,881],{"class":230,"line":268},[228,861,834],{"class":760},[228,863,837],{"class":764},[228,865,866],{"class":768}," v-else-if",[228,868,364],{"class":775},[228,870,871],{"class":627},"\"loggedIn\"",[228,873,848],{"class":760},[228,875,876],{"class":788},"Welcome, {{ user?.name }}",[228,878,812],{"class":760},[228,880,837],{"class":764},[228,882,781],{"class":760},[228,884,885,887,889,892,894,897,899,901],{"class":230,"line":274},[228,886,834],{"class":760},[228,888,837],{"class":764},[228,890,891],{"class":768}," v-else",[228,893,848],{"class":760},[228,895,896],{"class":788},"Please log in",[228,898,812],{"class":760},[228,900,837],{"class":764},[228,902,781],{"class":760},[228,904,905,907,909],{"class":230,"line":280},[228,906,812],{"class":760},[228,908,827],{"class":764},[228,910,781],{"class":760},[373,912,914],{"id":913},"server-side-session-access","Server-Side Session Access",[291,916,917],{},"For server handlers and API routes, use the server utilities:",[217,919,920],{"className":296,"code":460,"filename":461,"language":299,"meta":223,"style":223},[225,921,922,944,966,996],{"__ignoreMap":223},[228,923,924,926,928,930,932,934,936,938,940,942],{"class":230,"line":231},[228,925,468],{"class":306},[228,927,472],{"class":471},[228,929,475],{"class":367},[228,931,478],{"class":310},[228,933,481],{"class":306},[228,935,484],{"class":310},[228,937,488],{"class":487},[228,939,491],{"class":310},[228,941,494],{"class":306},[228,943,311],{"class":310},[228,945,946,948,950,952,954,956,958,960,962,964],{"class":230,"line":237},[228,947,501],{"class":306},[228,949,504],{"class":310},[228,951,393],{"class":316},[228,953,509],{"class":310},[228,955,364],{"class":363},[228,957,514],{"class":306},[228,959,517],{"class":367},[228,961,478],{"class":310},[228,963,488],{"class":522},[228,965,525],{"class":310},[228,967,968,970,972,974,976,978,980,982,984,986,988,990,992,994],{"class":230,"line":244},[228,969,530],{"class":306},[228,971,504],{"class":310},[228,973,535],{"class":522},[228,975,539],{"class":538},[228,977,543],{"class":542},[228,979,406],{"class":310},[228,981,535],{"class":522},[228,983,441],{"class":310},[228,985,552],{"class":522},[228,987,539],{"class":538},[228,989,543],{"class":542},[228,991,406],{"class":310},[228,993,552],{"class":522},[228,995,563],{"class":310},[228,997,998],{"class":230,"line":250},[228,999,568],{"class":310},[373,1001,1003],{"id":1002},"session-refresh","Session Refresh",[291,1005,1006],{},"Force refresh the session data:",[217,1008,1010],{"className":750,"code":1009,"language":753,"meta":223,"style":223},"\u003Cscript setup lang=\"ts\">\nconst { fetchSession, ready } = useUserSession()\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cbutton :disabled=\"!ready\" @click=\"fetchSession({ force: true })\">\n    Refresh session\n  \u003C\u002Fbutton>\n\u003C\u002Ftemplate>\n",[225,1011,1012,1028,1049,1057,1061,1069,1093,1098,1107],{"__ignoreMap":223},[228,1013,1014,1016,1018,1020,1022,1024,1026],{"class":230,"line":231},[228,1015,761],{"class":760},[228,1017,765],{"class":764},[228,1019,769],{"class":768},[228,1021,772],{"class":768},[228,1023,364],{"class":775},[228,1025,778],{"class":627},[228,1027,781],{"class":760},[228,1029,1030,1032,1034,1037,1039,1041,1043,1045,1047],{"class":230,"line":237},[228,1031,307],{"class":306},[228,1033,504],{"class":788},[228,1035,1036],{"class":316},"fetchSession",[228,1038,441],{"class":788},[228,1040,401],{"class":316},[228,1042,509],{"class":788},[228,1044,364],{"class":363},[228,1046,368],{"class":367},[228,1048,371],{"class":788},[228,1050,1051,1053,1055],{"class":230,"line":244},[228,1052,812],{"class":760},[228,1054,765],{"class":764},[228,1056,781],{"class":760},[228,1058,1059],{"class":230,"line":250},[228,1060,241],{"emptyLinePlaceholder":240},[228,1062,1063,1065,1067],{"class":230,"line":256},[228,1064,761],{"class":760},[228,1066,827],{"class":764},[228,1068,781],{"class":760},[228,1070,1071,1073,1076,1079,1081,1083,1086,1088,1091],{"class":230,"line":262},[228,1072,834],{"class":760},[228,1074,1075],{"class":764},"button",[228,1077,1078],{"class":768}," :disabled",[228,1080,364],{"class":775},[228,1082,845],{"class":627},[228,1084,1085],{"class":768}," @click",[228,1087,364],{"class":775},[228,1089,1090],{"class":627},"\"fetchSession({ force: true })\"",[228,1092,781],{"class":760},[228,1094,1095],{"class":230,"line":268},[228,1096,1097],{"class":788},"    Refresh session\n",[228,1099,1100,1103,1105],{"class":230,"line":274},[228,1101,1102],{"class":760},"  \u003C\u002F",[228,1104,1075],{"class":764},[228,1106,781],{"class":760},[228,1108,1109,1111,1113],{"class":230,"line":280},[228,1110,812],{"class":760},[228,1112,827],{"class":764},[228,1114,781],{"class":760},[291,1116,1117],{},"When a custom Better Auth endpoint creates or changes the current session, wrap the action so Nuxt refreshes session state after a successful response:",[217,1119,1122],{"className":296,"code":1120,"filename":1121,"language":299,"meta":223,"style":223},"await runWithSessionRefresh(() =>\n  $fetch('\u002Fapi\u002Fauth\u002Fsign-in\u002Fcustom', { method: 'POST', body }),\n)\n","pages\u002Flogin.vue",[225,1123,1124,1138,1167],{"__ignoreMap":223},[228,1125,1126,1129,1132,1135],{"class":230,"line":231},[228,1127,1128],{"class":306},"await",[228,1130,1131],{"class":367}," runWithSessionRefresh",[228,1133,1134],{"class":310},"(() ",[228,1136,1137],{"class":306},"=>\n",[228,1139,1140,1143,1145,1148,1151,1154,1156,1159,1161,1164],{"class":230,"line":237},[228,1141,1142],{"class":367},"  $fetch",[228,1144,478],{"class":310},[228,1146,1147],{"class":627},"'\u002Fapi\u002Fauth\u002Fsign-in\u002Fcustom'",[228,1149,1150],{"class":310},", { ",[228,1152,1153],{"class":522},"method",[228,1155,539],{"class":538},[228,1157,1158],{"class":627}," 'POST'",[228,1160,441],{"class":310},[228,1162,1163],{"class":542},"body",[228,1165,1166],{"class":310}," }),\n",[228,1168,1169],{"class":230,"line":244},[228,1170,525],{"class":310},[373,1172,1174],{"id":1173},"redirecting-after-passive-session-loss","Redirecting after passive session loss",[291,1176,1177],{},"The client refreshes sessions when a tab regains focus and when another tab changes the session. If a previously authenticated session is then found to be expired or revoked, configure an optional redirect:",[217,1179,1182],{"className":296,"code":1180,"filename":1181,"language":299,"meta":223,"style":223},"export default defineNuxtConfig({\n  auth: {\n    redirects: {\n      sessionExpired: '\u002Flogin',\n    },\n  },\n})\n","nuxt.config.ts",[225,1183,1184,1196,1205,1214,1226,1231,1236],{"__ignoreMap":223},[228,1185,1186,1188,1190,1193],{"class":230,"line":231},[228,1187,468],{"class":306},[228,1189,472],{"class":471},[228,1191,1192],{"class":367}," defineNuxtConfig",[228,1194,1195],{"class":310},"({\n",[228,1197,1198,1201,1203],{"class":230,"line":237},[228,1199,1200],{"class":522},"  auth",[228,1202,539],{"class":538},[228,1204,311],{"class":310},[228,1206,1207,1210,1212],{"class":230,"line":244},[228,1208,1209],{"class":522},"    redirects",[228,1211,539],{"class":538},[228,1213,311],{"class":310},[228,1215,1216,1219,1221,1224],{"class":230,"line":250},[228,1217,1218],{"class":522},"      sessionExpired",[228,1220,539],{"class":538},[228,1222,1223],{"class":627}," '\u002Flogin'",[228,1225,320],{"class":310},[228,1227,1228],{"class":230,"line":256},[228,1229,1230],{"class":310},"    },\n",[228,1232,1233],{"class":230,"line":262},[228,1234,1235],{"class":310},"  },\n",[228,1237,1238],{"class":230,"line":268},[228,1239,568],{"class":310},[291,1241,1242,1243,1246,1247,406],{},"This redirect only runs for a settled transition from an active session to a signed-out state. It does not run for an initially signed-out visitor, and explicit ",[225,1244,1245],{},"signOut()"," continues to use ",[225,1248,1249],{},"auth.redirects.logout",[373,1251,1253],{"id":1252},"session-lifetime","Session Lifetime",[291,1255,1256],{},"Configure session duration in your auth config:",[217,1258,1261],{"className":296,"code":1259,"filename":1260,"language":299,"meta":223,"style":223},"import { defineServerAuth } from '@nuxtjs\u002Fbetter-auth\u002Fconfig'\n\nexport default defineServerAuth({\n  session: {\n    expiresIn: 60 * 60 * 24 * 7, \u002F\u002F 7 days\n    cookieCache: {\n      enabled: true,\n      maxAge: 5 * 60, \u002F\u002F 5 minutes\n    },\n  },\n})\n","server\u002Fauth.config.ts",[225,1262,1263,1281,1285,1296,1304,1337,1346,1358,1377,1381,1385],{"__ignoreMap":223},[228,1264,1265,1268,1270,1273,1275,1278],{"class":230,"line":231},[228,1266,1267],{"class":306},"import",[228,1269,504],{"class":310},[228,1271,1272],{"class":522},"defineServerAuth",[228,1274,509],{"class":310},[228,1276,1277],{"class":306},"from",[228,1279,1280],{"class":627}," '@nuxtjs\u002Fbetter-auth\u002Fconfig'\n",[228,1282,1283],{"class":230,"line":237},[228,1284,241],{"emptyLinePlaceholder":240},[228,1286,1287,1289,1291,1294],{"class":230,"line":244},[228,1288,468],{"class":306},[228,1290,472],{"class":471},[228,1292,1293],{"class":367}," defineServerAuth",[228,1295,1195],{"class":310},[228,1297,1298,1300,1302],{"class":230,"line":250},[228,1299,325],{"class":522},[228,1301,539],{"class":538},[228,1303,311],{"class":310},[228,1305,1306,1309,1311,1315,1319,1321,1323,1326,1328,1331,1333],{"class":230,"line":256},[228,1307,1308],{"class":522},"    expiresIn",[228,1310,539],{"class":538},[228,1312,1314],{"class":1313},"s3ZNE"," 60",[228,1316,1318],{"class":1317},"sn-Jc"," *",[228,1320,1314],{"class":1313},[228,1322,1318],{"class":1317},[228,1324,1325],{"class":1313}," 24",[228,1327,1318],{"class":1317},[228,1329,1330],{"class":1313}," 7",[228,1332,441],{"class":310},[228,1334,1336],{"class":1335},"st7cf","\u002F\u002F 7 days\n",[228,1338,1339,1342,1344],{"class":230,"line":262},[228,1340,1341],{"class":522},"    cookieCache",[228,1343,539],{"class":538},[228,1345,311],{"class":310},[228,1347,1348,1351,1353,1356],{"class":230,"line":268},[228,1349,1350],{"class":522},"      enabled",[228,1352,539],{"class":538},[228,1354,1355],{"class":1313}," true",[228,1357,320],{"class":310},[228,1359,1360,1363,1365,1368,1370,1372,1374],{"class":230,"line":274},[228,1361,1362],{"class":522},"      maxAge",[228,1364,539],{"class":538},[228,1366,1367],{"class":1313}," 5",[228,1369,1318],{"class":1317},[228,1371,1314],{"class":1313},[228,1373,441],{"class":310},[228,1375,1376],{"class":1335},"\u002F\u002F 5 minutes\n",[228,1378,1379],{"class":230,"line":280},[228,1380,1230],{"class":310},[228,1382,1383],{"class":230,"line":286},[228,1384,1235],{"class":310},[228,1386,1388],{"class":230,"line":1387},11,[228,1389,568],{"class":310},[741,1391],{"to":151,"title":1392},"BetterAuthState component",[1394,1395,1396],"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 .s17Py, html code.shiki .s17Py{--shiki-light:#383A42;--shiki-default:#BBBBBB;--shiki-dark:#BBBBBB}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 .sfT9l, html code.shiki .sfT9l{--shiki-light:#4078F2;--shiki-default:#36F9F6;--shiki-dark:#36F9F6}html pre.shiki code .sKg8T, html code.shiki .sKg8T{--shiki-light:#E45649;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}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 .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 .svFNh, html code.shiki .svFNh{--shiki-light:#383A42;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .sPAZv, html code.shiki .sPAZv{--shiki-light:#50A14F;--shiki-default:#FF8B39;--shiki-dark:#FF8B39}html pre.shiki code .sL9le, html code.shiki .sL9le{--shiki-light:#383A42;--shiki-default:#36F9F6;--shiki-dark:#36F9F6}html pre.shiki code .stweg, html code.shiki .stweg{--shiki-light:#E45649;--shiki-default:#72F1B8;--shiki-dark:#72F1B8}html pre.shiki code .s0frj, html code.shiki .s0frj{--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-default:#FEDE5D;--shiki-default-font-style:italic;--shiki-dark:#FEDE5D;--shiki-dark-font-style:italic}html pre.shiki code .sNM9w, html code.shiki .sNM9w{--shiki-light:#383A42;--shiki-default:#B6B1B1;--shiki-dark:#B6B1B1}html pre.shiki code .sEEOt, html code.shiki .sEEOt{--shiki-light:#383A42;--shiki-default:#FFFFFFEE;--shiki-dark:#FFFFFFEE}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":223,"searchDepth":237,"depth":237,"links":1398},[1399,1400,1401,1402,1403,1404,1405,1406],{"id":375,"depth":237,"text":376},{"id":581,"depth":237,"text":582},{"id":735,"depth":237,"text":736},{"id":746,"depth":237,"text":747},{"id":913,"depth":237,"text":914},{"id":1002,"depth":237,"text":1003},{"id":1173,"depth":237,"text":1174},{"id":1252,"depth":237,"text":1253},"Access reactive session state with SSR support using `useUserSession()`.","md",null,{},{"title":52,"description":1407},"hElBaHyFtUy9tXxD61Vw8MaqcNYnA9OBEVwk-AtX5iA",[1414,1416],{"title":48,"path":49,"stem":50,"description":1415,"children":-1},"When to reach for the full Better Auth server instance.",{"title":56,"path":57,"stem":58,"description":1417,"children":-1},"Learn how to protect your pages and API routes using a layered approach.",1791073729745]