[{"data":1,"prerenderedAt":1285},["ShallowReactive",2],{"navigation_docs":3,"-core-concepts-sessions":152,"-core-concepts-sessions-surround":1280},[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":1274,"extension":1275,"links":1276,"meta":1277,"navigation":184,"path":53,"seo":1278,"stem":54,"__hash__":1279},"docs\u002F2.core-concepts\u002F2.sessions.md",{"type":155,"value":156,"toc":1265},"minimark",[157,234,238,316,321,324,370,373,402,513,523,527,534,537,603,606,674,677,681,684,688,692,855,859,862,944,948,951,1059,1062,1115,1119,1122,1258,1261],[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",[235,514,515,516,518,519,522],{},"For prerendered or cached pages, the client plugin fetches the session after mount. Use ",[169,517,345],{}," or ",[169,520,521],{},"\u003CBetterAuthState>"," to avoid flashes in those cases.",[317,524,526],{"id":525},"auth-readiness-vs-domain-data-readiness","Auth Readiness vs Domain Data Readiness",[235,528,529,338,531,533],{},[169,530,345],{},[169,532,521],{}," 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,535,536],{},"When rendering UI that depends on both auth and domain data, fetch that domain data SSR-first:",[161,538,541],{"className":240,"code":539,"filename":540,"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,542,543,575],{"__ignoreMap":167},[172,544,545,547,549,552,555,558,560,562,564,567,569,573],{"class":174,"line":175},[172,546,251],{"class":250},[172,548,448],{"class":254},[172,550,551],{"class":466},"data",[172,553,554],{"class":254},": ",[172,556,557],{"class":260},"customerState",[172,559,453],{"class":254},[172,561,308],{"class":307},[172,563,458],{"class":250},[172,565,566],{"class":311}," useFetch",[172,568,422],{"class":254},[172,570,572],{"class":571},"sPAZv","'\u002Fapi\u002Fauth\u002Fcustomer\u002Fstate'",[172,574,469],{"class":254},[172,576,577,579,581,583,585,588,590,592,594,596,598,601],{"class":174,"line":181},[172,578,251],{"class":250},[172,580,448],{"class":254},[172,582,551],{"class":466},[172,584,554],{"class":254},[172,586,587],{"class":260},"customerById",[172,589,453],{"class":254},[172,591,308],{"class":307},[172,593,458],{"class":250},[172,595,566],{"class":311},[172,597,422],{"class":254},[172,599,600],{"class":571},"'\u002Fapi\u002Fauth\u002Fcustomer\u002F123\u002Fstate'",[172,602,469],{"class":254},[235,604,605],{},"Endpoint payloads are inferred from your Better Auth config (core + plugins), including dynamic auth paths.",[161,607,609],{"className":240,"code":608,"filename":540,"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,610,611,645,652,670],{"__ignoreMap":167},[172,612,613,615,617,619,621,623,625,628,630,633,635,637,639,642],{"class":174,"line":175},[172,614,251],{"class":250},[172,616,448],{"class":254},[172,618,551],{"class":466},[172,620,554],{"class":254},[172,622,557],{"class":260},[172,624,385],{"class":254},[172,626,627],{"class":260},"pending",[172,629,385],{"class":254},[172,631,632],{"class":260},"error",[172,634,453],{"class":254},[172,636,308],{"class":307},[172,638,458],{"class":250},[172,640,641],{"class":311}," useAuthAsyncData",[172,643,644],{"class":254},"(\n",[172,646,647,650],{"class":174,"line":181},[172,648,649],{"class":571},"  'customer-state'",[172,651,264],{"class":254},[172,653,654,657,660,663,665,667],{"class":174,"line":188},[172,655,656],{"class":431},"  requestFetch",[172,658,659],{"class":250}," =>",[172,661,662],{"class":311}," requestFetch",[172,664,422],{"class":254},[172,666,572],{"class":571},[172,668,669],{"class":254},"),\n",[172,671,672],{"class":174,"line":194},[172,673,469],{"class":254},[235,675,676],{},"This prevents first-paint UI flips where unauthenticated defaults briefly appear before domain data resolves.",[317,678,680],{"id":679},"cookie-vs-database-sessions","Cookie vs Database Sessions",[235,682,683],{},"Database sessions (default): stored in DB, revocable, visible in admin\nJWE sessions (database-less): encrypted cookie, no server storage",[685,686],"read-more",{"to":687},"https:\u002F\u002Fwww.better-auth.com\u002Fdocs\u002Fconcepts\u002Fsession-management",[317,689,691],{"id":690},"handling-loading-state","Handling Loading State",[161,693,698],{"className":694,"code":695,"filename":696,"language":697,"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,699,700,726,752,761,765,774,802,827,847],{"__ignoreMap":167},[172,701,702,706,710,714,717,720,723],{"class":174,"line":175},[172,703,705],{"class":704},"sL9le","\u003C",[172,707,709],{"class":708},"stweg","script",[172,711,713],{"class":712},"s0frj"," setup",[172,715,716],{"class":712}," lang",[172,718,308],{"class":719},"sNM9w",[172,721,722],{"class":571},"\"ts\"",[172,724,725],{"class":704},">\n",[172,727,728,730,733,735,737,740,742,744,746,748,750],{"class":174,"line":181},[172,729,251],{"class":250},[172,731,448],{"class":732},"sEEOt",[172,734,337],{"class":260},[172,736,385],{"class":732},[172,738,739],{"class":260},"loggedIn",[172,741,385],{"class":732},[172,743,345],{"class":260},[172,745,453],{"class":732},[172,747,308],{"class":307},[172,749,312],{"class":311},[172,751,315],{"class":732},[172,753,754,757,759],{"class":174,"line":188},[172,755,756],{"class":704},"\u003C\u002F",[172,758,709],{"class":708},[172,760,725],{"class":704},[172,762,763],{"class":174,"line":194},[172,764,185],{"emptyLinePlaceholder":184},[172,766,767,769,772],{"class":174,"line":200},[172,768,705],{"class":704},[172,770,771],{"class":708},"template",[172,773,725],{"class":704},[172,775,776,779,782,785,787,790,793,796,798,800],{"class":174,"line":206},[172,777,778],{"class":704},"  \u003C",[172,780,781],{"class":708},"div",[172,783,784],{"class":712}," v-if",[172,786,308],{"class":719},[172,788,789],{"class":571},"\"!ready\"",[172,791,792],{"class":704},">",[172,794,795],{"class":732},"Loading...",[172,797,756],{"class":704},[172,799,781],{"class":708},[172,801,725],{"class":704},[172,803,804,806,808,811,813,816,818,821,823,825],{"class":174,"line":212},[172,805,778],{"class":704},[172,807,781],{"class":708},[172,809,810],{"class":712}," v-else-if",[172,812,308],{"class":719},[172,814,815],{"class":571},"\"loggedIn\"",[172,817,792],{"class":704},[172,819,820],{"class":732},"Welcome, {{ user?.name }}",[172,822,756],{"class":704},[172,824,781],{"class":708},[172,826,725],{"class":704},[172,828,829,831,833,836,838,841,843,845],{"class":174,"line":218},[172,830,778],{"class":704},[172,832,781],{"class":708},[172,834,835],{"class":712}," v-else",[172,837,792],{"class":704},[172,839,840],{"class":732},"Please log in",[172,842,756],{"class":704},[172,844,781],{"class":708},[172,846,725],{"class":704},[172,848,849,851,853],{"class":174,"line":224},[172,850,756],{"class":704},[172,852,771],{"class":708},[172,854,725],{"class":704},[317,856,858],{"id":857},"server-side-session-access","Server-Side Session Access",[235,860,861],{},"For server handlers and API routes, use the server utilities:",[161,863,864],{"className":240,"code":404,"filename":405,"language":243,"meta":167,"style":167},[169,865,866,888,910,940],{"__ignoreMap":167},[172,867,868,870,872,874,876,878,880,882,884,886],{"class":174,"line":175},[172,869,412],{"class":250},[172,871,416],{"class":415},[172,873,419],{"class":311},[172,875,422],{"class":254},[172,877,425],{"class":250},[172,879,428],{"class":254},[172,881,432],{"class":431},[172,883,435],{"class":254},[172,885,438],{"class":250},[172,887,255],{"class":254},[172,889,890,892,894,896,898,900,902,904,906,908],{"class":174,"line":181},[172,891,445],{"class":250},[172,893,448],{"class":254},[172,895,337],{"class":260},[172,897,453],{"class":254},[172,899,308],{"class":307},[172,901,458],{"class":250},[172,903,461],{"class":311},[172,905,422],{"class":254},[172,907,432],{"class":466},[172,909,469],{"class":254},[172,911,912,914,916,918,920,922,924,926,928,930,932,934,936,938],{"class":174,"line":188},[172,913,474],{"class":250},[172,915,448],{"class":254},[172,917,479],{"class":466},[172,919,483],{"class":482},[172,921,487],{"class":486},[172,923,350],{"class":254},[172,925,479],{"class":466},[172,927,385],{"class":254},[172,929,496],{"class":466},[172,931,483],{"class":482},[172,933,487],{"class":486},[172,935,350],{"class":254},[172,937,496],{"class":466},[172,939,507],{"class":254},[172,941,942],{"class":174,"line":194},[172,943,512],{"class":254},[317,945,947],{"id":946},"session-refresh","Session Refresh",[235,949,950],{},"Force refresh the session data:",[161,952,954],{"className":694,"code":953,"language":697,"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,955,956,972,993,1001,1005,1013,1037,1042,1051],{"__ignoreMap":167},[172,957,958,960,962,964,966,968,970],{"class":174,"line":175},[172,959,705],{"class":704},[172,961,709],{"class":708},[172,963,713],{"class":712},[172,965,716],{"class":712},[172,967,308],{"class":719},[172,969,722],{"class":571},[172,971,725],{"class":704},[172,973,974,976,978,981,983,985,987,989,991],{"class":174,"line":181},[172,975,251],{"class":250},[172,977,448],{"class":732},[172,979,980],{"class":260},"fetchSession",[172,982,385],{"class":732},[172,984,345],{"class":260},[172,986,453],{"class":732},[172,988,308],{"class":307},[172,990,312],{"class":311},[172,992,315],{"class":732},[172,994,995,997,999],{"class":174,"line":188},[172,996,756],{"class":704},[172,998,709],{"class":708},[172,1000,725],{"class":704},[172,1002,1003],{"class":174,"line":194},[172,1004,185],{"emptyLinePlaceholder":184},[172,1006,1007,1009,1011],{"class":174,"line":200},[172,1008,705],{"class":704},[172,1010,771],{"class":708},[172,1012,725],{"class":704},[172,1014,1015,1017,1020,1023,1025,1027,1030,1032,1035],{"class":174,"line":206},[172,1016,778],{"class":704},[172,1018,1019],{"class":708},"button",[172,1021,1022],{"class":712}," :disabled",[172,1024,308],{"class":719},[172,1026,789],{"class":571},[172,1028,1029],{"class":712}," @click",[172,1031,308],{"class":719},[172,1033,1034],{"class":571},"\"fetchSession({ force: true })\"",[172,1036,725],{"class":704},[172,1038,1039],{"class":174,"line":212},[172,1040,1041],{"class":732},"    Refresh session\n",[172,1043,1044,1047,1049],{"class":174,"line":218},[172,1045,1046],{"class":704},"  \u003C\u002F",[172,1048,1019],{"class":708},[172,1050,725],{"class":704},[172,1052,1053,1055,1057],{"class":174,"line":224},[172,1054,756],{"class":704},[172,1056,771],{"class":708},[172,1058,725],{"class":704},[235,1060,1061],{},"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,1063,1066],{"className":240,"code":1064,"filename":1065,"language":243,"meta":167,"style":167},"await runWithSessionRefresh(() =>\n  $fetch('\u002Fapi\u002Fauth\u002Fsign-in\u002Fcustom', { method: 'POST', body }),\n)\n","pages\u002Flogin.vue",[169,1067,1068,1082,1111],{"__ignoreMap":167},[172,1069,1070,1073,1076,1079],{"class":174,"line":175},[172,1071,1072],{"class":250},"await",[172,1074,1075],{"class":311}," runWithSessionRefresh",[172,1077,1078],{"class":254},"(() ",[172,1080,1081],{"class":250},"=>\n",[172,1083,1084,1087,1089,1092,1095,1098,1100,1103,1105,1108],{"class":174,"line":181},[172,1085,1086],{"class":311},"  $fetch",[172,1088,422],{"class":254},[172,1090,1091],{"class":571},"'\u002Fapi\u002Fauth\u002Fsign-in\u002Fcustom'",[172,1093,1094],{"class":254},", { ",[172,1096,1097],{"class":466},"method",[172,1099,483],{"class":482},[172,1101,1102],{"class":571}," 'POST'",[172,1104,385],{"class":254},[172,1106,1107],{"class":486},"body",[172,1109,1110],{"class":254}," }),\n",[172,1112,1113],{"class":174,"line":188},[172,1114,469],{"class":254},[317,1116,1118],{"id":1117},"session-lifetime","Session Lifetime",[235,1120,1121],{},"Configure session duration in your auth config:",[161,1123,1126],{"className":240,"code":1124,"filename":1125,"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,1127,1128,1146,1150,1162,1170,1203,1212,1224,1243,1248,1253],{"__ignoreMap":167},[172,1129,1130,1133,1135,1138,1140,1143],{"class":174,"line":175},[172,1131,1132],{"class":250},"import",[172,1134,448],{"class":254},[172,1136,1137],{"class":466},"defineServerAuth",[172,1139,453],{"class":254},[172,1141,1142],{"class":250},"from",[172,1144,1145],{"class":571}," '@nuxtjs\u002Fbetter-auth\u002Fconfig'\n",[172,1147,1148],{"class":174,"line":181},[172,1149,185],{"emptyLinePlaceholder":184},[172,1151,1152,1154,1156,1159],{"class":174,"line":188},[172,1153,412],{"class":250},[172,1155,416],{"class":415},[172,1157,1158],{"class":311}," defineServerAuth",[172,1160,1161],{"class":254},"({\n",[172,1163,1164,1166,1168],{"class":174,"line":194},[172,1165,269],{"class":466},[172,1167,483],{"class":482},[172,1169,255],{"class":254},[172,1171,1172,1175,1177,1181,1185,1187,1189,1192,1194,1197,1199],{"class":174,"line":200},[172,1173,1174],{"class":466},"    expiresIn",[172,1176,483],{"class":482},[172,1178,1180],{"class":1179},"s3ZNE"," 60",[172,1182,1184],{"class":1183},"sn-Jc"," *",[172,1186,1180],{"class":1179},[172,1188,1184],{"class":1183},[172,1190,1191],{"class":1179}," 24",[172,1193,1184],{"class":1183},[172,1195,1196],{"class":1179}," 7",[172,1198,385],{"class":254},[172,1200,1202],{"class":1201},"st7cf","\u002F\u002F 7 days\n",[172,1204,1205,1208,1210],{"class":174,"line":206},[172,1206,1207],{"class":466},"    cookieCache",[172,1209,483],{"class":482},[172,1211,255],{"class":254},[172,1213,1214,1217,1219,1222],{"class":174,"line":212},[172,1215,1216],{"class":466},"      enabled",[172,1218,483],{"class":482},[172,1220,1221],{"class":1179}," true",[172,1223,264],{"class":254},[172,1225,1226,1229,1231,1234,1236,1238,1240],{"class":174,"line":218},[172,1227,1228],{"class":466},"      maxAge",[172,1230,483],{"class":482},[172,1232,1233],{"class":1179}," 5",[172,1235,1184],{"class":1183},[172,1237,1180],{"class":1179},[172,1239,385],{"class":254},[172,1241,1242],{"class":1201},"\u002F\u002F 5 minutes\n",[172,1244,1245],{"class":174,"line":224},[172,1246,1247],{"class":254},"    },\n",[172,1249,1250],{"class":174,"line":230},[172,1251,1252],{"class":254},"  },\n",[172,1254,1256],{"class":174,"line":1255},11,[172,1257,512],{"class":254},[685,1259],{"to":146,"title":1260},"BetterAuthState component",[1262,1263,1264],"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":167,"searchDepth":181,"depth":181,"links":1266},[1267,1268,1269,1270,1271,1272,1273],{"id":319,"depth":181,"text":320},{"id":525,"depth":181,"text":526},{"id":679,"depth":181,"text":680},{"id":690,"depth":181,"text":691},{"id":857,"depth":181,"text":858},{"id":946,"depth":181,"text":947},{"id":1117,"depth":181,"text":1118},"Access reactive session state with SSR support using `useUserSession()`.","md",null,{},{"title":52,"description":1274},"z0dCCB6Kn0R1CZoYk2J3uc-505n9U9Xz7cfIZ41M8EE",[1281,1283],{"title":48,"path":49,"stem":50,"description":1282,"children":-1},"When to reach for the full Better Auth server instance.",{"title":56,"path":57,"stem":58,"description":1284,"children":-1},"Learn how to protect your pages and API routes using a layered approach.",1787743516542]