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