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