[{"data":1,"prerenderedAt":1869},["ShallowReactive",2],{"navigation_docs":3,"-api-server-utils":152,"-api-server-utils-surround":1864},[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":141,"body":154,"description":1858,"extension":1859,"links":1860,"meta":1861,"navigation":332,"path":142,"seo":1862,"stem":143,"__hash__":1863},"docs\u002F5.api\u002F2.server-utils.md",{"type":155,"value":156,"toc":1841},"minimark",[157,161,184,198,203,206,414,417,480,491,495,498,574,583,588,604,608,614,687,694,710,714,731,831,837,842,846,851,929,942,945,951,965,1176,1179,1183,1186,1308,1311,1315,1318,1408,1411,1417,1420,1430,1471,1494,1497,1509,1513,1518,1560,1565,1625,1629,1817,1821,1837],[158,159,160],"p",{},"Use this page when you need exact behavior for the auto-imported server helpers registered by the module.",[158,162,163,164,168,169,172,173,176,177,179,180,183],{},"Only the helpers documented here and ",[165,166,167],"code",{},"defineServerAuth"," are registered. The internal ",[165,170,171],{},"resolveCustomSecondaryStorageRequirement"," helper and ",[165,174,175],{},"HubSecondaryStorageMode"," type are no longer auto-imported. Configure custom storage through ",[165,178,167],{}," and ",[165,181,182],{},"auth.hubSecondaryStorage",".",[185,186,187,188,192,193,197],"warning",{},"These utilities are only available in ",[189,190,191],"strong",{},"full mode",". In ",[194,195,196],"a",{"href":91},"clientOnly mode",", there is no local auth server, so these utilities are not registered.",[199,200,202],"h2",{"id":201},"serverauth","serverAuth",[158,204,205],{},"Returns the initialized Better Auth instance (module-level singleton). Pass the event for accurate URL detection on first initialization.",[207,208,214],"pre",{"className":209,"code":210,"filename":211,"language":212,"meta":213,"style":213},"language-ts shiki shiki-themes one-light synthwave-84 synthwave-84","export default defineEventHandler(async (event) => {\n  const auth = serverAuth(event)\n  const session = await auth.api.getSession({ headers: event.headers })\n\n  if (!session) {\n    throw createError({ statusCode: 401 })\n  }\n\n  return { user: session.user }\n})\n","server\u002Fapi\u002Fadmin\u002Fusers.get.ts","ts","",[165,215,216,256,281,327,334,352,374,380,385,408],{"__ignoreMap":213},[217,218,221,225,229,233,237,240,243,247,250,253],"span",{"class":219,"line":220},"line",1,[217,222,224],{"class":223},"sqe1H","export",[217,226,228],{"class":227},"sKg8T"," default",[217,230,232],{"class":231},"sfT9l"," defineEventHandler",[217,234,236],{"class":235},"s17Py","(",[217,238,239],{"class":223},"async",[217,241,242],{"class":235}," (",[217,244,246],{"class":245},"sgisi","event",[217,248,249],{"class":235},") ",[217,251,252],{"class":223},"=>",[217,254,255],{"class":235}," {\n",[217,257,259,262,266,270,273,275,278],{"class":219,"line":258},2,[217,260,261],{"class":223},"  const",[217,263,265],{"class":264},"s6Rhl"," auth",[217,267,269],{"class":268},"sQBpM"," =",[217,271,272],{"class":231}," serverAuth",[217,274,236],{"class":235},[217,276,246],{"class":277},"sYvLG",[217,279,280],{"class":235},")\n",[217,282,284,286,289,291,294,297,299,302,304,307,310,313,317,320,322,324],{"class":219,"line":283},3,[217,285,261],{"class":223},[217,287,288],{"class":264}," session",[217,290,269],{"class":268},[217,292,293],{"class":223}," await",[217,295,265],{"class":296},"svFNh",[217,298,183],{"class":235},[217,300,301],{"class":277},"api",[217,303,183],{"class":235},[217,305,306],{"class":231},"getSession",[217,308,309],{"class":235},"({ ",[217,311,312],{"class":277},"headers",[217,314,316],{"class":315},"sVnqq",":",[217,318,319],{"class":296}," event",[217,321,183],{"class":235},[217,323,312],{"class":277},[217,325,326],{"class":235}," })\n",[217,328,330],{"class":219,"line":329},4,[217,331,333],{"emptyLinePlaceholder":332},true,"\n",[217,335,337,340,342,346,349],{"class":219,"line":336},5,[217,338,339],{"class":223},"  if",[217,341,242],{"class":235},[217,343,345],{"class":344},"sn-Jc","!",[217,347,348],{"class":277},"session",[217,350,351],{"class":235},") {\n",[217,353,355,358,361,363,366,368,372],{"class":219,"line":354},6,[217,356,357],{"class":223},"    throw",[217,359,360],{"class":231}," createError",[217,362,309],{"class":235},[217,364,365],{"class":277},"statusCode",[217,367,316],{"class":315},[217,369,371],{"class":370},"s3ZNE"," 401",[217,373,326],{"class":235},[217,375,377],{"class":219,"line":376},7,[217,378,379],{"class":235},"  }\n",[217,381,383],{"class":219,"line":382},8,[217,384,333],{"emptyLinePlaceholder":332},[217,386,388,391,394,397,399,401,403,405],{"class":219,"line":387},9,[217,389,390],{"class":223},"  return",[217,392,393],{"class":235}," { ",[217,395,396],{"class":277},"user",[217,398,316],{"class":315},[217,400,288],{"class":296},[217,402,183],{"class":235},[217,404,396],{"class":277},[217,406,407],{"class":235}," }\n",[217,409,411],{"class":219,"line":410},10,[217,412,413],{"class":235},"})\n",[158,415,416],{},"You can also pass query options to bypass cookie cache \u002F refresh behavior:",[207,418,420],{"className":209,"code":419,"language":212,"meta":213,"style":213},"await auth.api.getSession({\n  headers: event.headers,\n  query: { disableCookieCache: true },\n})\n",[165,421,422,440,456,476],{"__ignoreMap":213},[217,423,424,427,429,431,433,435,437],{"class":219,"line":220},[217,425,426],{"class":223},"await",[217,428,265],{"class":296},[217,430,183],{"class":235},[217,432,301],{"class":277},[217,434,183],{"class":235},[217,436,306],{"class":231},[217,438,439],{"class":235},"({\n",[217,441,442,445,447,449,451,453],{"class":219,"line":258},[217,443,444],{"class":277},"  headers",[217,446,316],{"class":315},[217,448,319],{"class":296},[217,450,183],{"class":235},[217,452,312],{"class":277},[217,454,455],{"class":235},",\n",[217,457,458,461,463,465,468,470,473],{"class":219,"line":283},[217,459,460],{"class":277},"  query",[217,462,316],{"class":315},[217,464,393],{"class":235},[217,466,467],{"class":277},"disableCookieCache",[217,469,316],{"class":315},[217,471,472],{"class":370}," true",[217,474,475],{"class":235}," },\n",[217,477,478],{"class":219,"line":329},[217,479,413],{"class":235},[481,482,483,484,487,488,490],"note",{},"Use ",[165,485,486],{},"serverAuth(event)"," in request handlers to access advanced Better Auth features not exposed by the helper wrappers. In non-request contexts, you can call ",[165,489,48],{}," without an event.",[199,492,494],{"id":493},"getusersession","getUserSession",[158,496,497],{},"Retrieves the current session from the request context without throwing an error if unauthenticated.",[207,499,502],{"className":209,"code":500,"filename":501,"language":212,"meta":213,"style":213},"export default defineEventHandler(async (event) => {\n  const session = await getUserSession(event)\n  \n  if (session) {\n    \u002F\u002F ...\n  }\n})\n","server\u002Fapi\u002Fexample.ts",[165,503,504,526,545,550,560,566,570],{"__ignoreMap":213},[217,505,506,508,510,512,514,516,518,520,522,524],{"class":219,"line":220},[217,507,224],{"class":223},[217,509,228],{"class":227},[217,511,232],{"class":231},[217,513,236],{"class":235},[217,515,239],{"class":223},[217,517,242],{"class":235},[217,519,246],{"class":245},[217,521,249],{"class":235},[217,523,252],{"class":223},[217,525,255],{"class":235},[217,527,528,530,532,534,536,539,541,543],{"class":219,"line":258},[217,529,261],{"class":223},[217,531,288],{"class":264},[217,533,269],{"class":268},[217,535,293],{"class":223},[217,537,538],{"class":231}," getUserSession",[217,540,236],{"class":235},[217,542,246],{"class":277},[217,544,280],{"class":235},[217,546,547],{"class":219,"line":283},[217,548,549],{"class":235},"  \n",[217,551,552,554,556,558],{"class":219,"line":329},[217,553,339],{"class":223},[217,555,242],{"class":235},[217,557,348],{"class":277},[217,559,351],{"class":235},[217,561,562],{"class":219,"line":336},[217,563,565],{"class":564},"st7cf","    \u002F\u002F ...\n",[217,567,568],{"class":219,"line":354},[217,569,379],{"class":235},[217,571,572],{"class":219,"line":376},[217,573,413],{"class":235},[158,575,576,578,579,582],{},[165,577,494],{}," does not create request-cache entries by itself. Use ",[165,580,581],{},"getRequestSession(event)"," when you need request-lifetime caching across middleware\u002Fhandlers.",[158,584,585],{},[189,586,587],{},"Returns:",[589,590,591,598],"ul",{},[592,593,594,597],"li",{},[165,595,596],{},"{ user: AuthUser, session: AuthSession }"," if authenticated.",[592,599,600,603],{},[165,601,602],{},"null"," if unauthenticated.",[199,605,607],{"id":606},"getrequestsession","getRequestSession",[158,609,610,611,183],{},"Retrieves the current session and memoizes it for the lifetime of the current request. In Nuxt and Nitro handlers, the helper stores the memoized value on ",[165,612,613],{},"event.context.requestSession",[207,615,617],{"className":209,"code":616,"filename":501,"language":212,"meta":213,"style":213},"export default defineEventHandler(async (event) => {\n  const requestSession = await getRequestSession(event)\n  const sameRequestSession = await getRequestSession(event) \u002F\u002F cached\n})\n",[165,618,619,641,661,683],{"__ignoreMap":213},[217,620,621,623,625,627,629,631,633,635,637,639],{"class":219,"line":220},[217,622,224],{"class":223},[217,624,228],{"class":227},[217,626,232],{"class":231},[217,628,236],{"class":235},[217,630,239],{"class":223},[217,632,242],{"class":235},[217,634,246],{"class":245},[217,636,249],{"class":235},[217,638,252],{"class":223},[217,640,255],{"class":235},[217,642,643,645,648,650,652,655,657,659],{"class":219,"line":258},[217,644,261],{"class":223},[217,646,647],{"class":264}," requestSession",[217,649,269],{"class":268},[217,651,293],{"class":223},[217,653,654],{"class":231}," getRequestSession",[217,656,236],{"class":235},[217,658,246],{"class":277},[217,660,280],{"class":235},[217,662,663,665,668,670,672,674,676,678,680],{"class":219,"line":283},[217,664,261],{"class":223},[217,666,667],{"class":264}," sameRequestSession",[217,669,269],{"class":268},[217,671,293],{"class":223},[217,673,654],{"class":231},[217,675,236],{"class":235},[217,677,246],{"class":277},[217,679,249],{"class":235},[217,681,682],{"class":564},"\u002F\u002F cached\n",[217,684,685],{"class":219,"line":329},[217,686,413],{"class":235},[158,688,689,690,693],{},"Use this helper when multiple handlers\u002Fmiddleware in the same request need session access without repeating ",[165,691,692],{},"auth.api.getSession()"," calls.",[481,695,696,698,699,702,703,706,707,183],{},[165,697,607],{}," stays type-compatible in projects that use narrowed ",[165,700,701],{},"h3"," typings where ",[165,704,705],{},"H3Event"," does not explicitly declare ",[165,708,709],{},"context",[199,711,713],{"id":712},"setrequestsession","setRequestSession",[158,715,716,717,720,721,723,724,726,727,730],{},"Supplies an ",[165,718,719],{},"AppSession | null"," to ",[165,722,607],{},", ",[165,725,494],{},", and ",[165,728,729],{},"requireUserSession"," for the rest of the current request. Use it when trusted server code authenticates a request through another mechanism, such as a verified bearer token, and resolves the complete application session itself.",[207,732,735],{"className":209,"code":733,"filename":734,"language":212,"meta":213,"style":213},"export default defineEventHandler(async (event) => {\n  const claims = await verifyBearerToken(event)\n  const session = await resolveCurrentAppSession(claims)\n\n  setRequestSession(event, session)\n\n  \u002F\u002F Later middleware and handlers reuse the supplied value.\n})\n","server\u002Fmiddleware\u002Fbearer-session.ts",[165,736,737,759,779,799,803,818,822,827],{"__ignoreMap":213},[217,738,739,741,743,745,747,749,751,753,755,757],{"class":219,"line":220},[217,740,224],{"class":223},[217,742,228],{"class":227},[217,744,232],{"class":231},[217,746,236],{"class":235},[217,748,239],{"class":223},[217,750,242],{"class":235},[217,752,246],{"class":245},[217,754,249],{"class":235},[217,756,252],{"class":223},[217,758,255],{"class":235},[217,760,761,763,766,768,770,773,775,777],{"class":219,"line":258},[217,762,261],{"class":223},[217,764,765],{"class":264}," claims",[217,767,269],{"class":268},[217,769,293],{"class":223},[217,771,772],{"class":231}," verifyBearerToken",[217,774,236],{"class":235},[217,776,246],{"class":277},[217,778,280],{"class":235},[217,780,781,783,785,787,789,792,794,797],{"class":219,"line":283},[217,782,261],{"class":223},[217,784,288],{"class":264},[217,786,269],{"class":268},[217,788,293],{"class":223},[217,790,791],{"class":231}," resolveCurrentAppSession",[217,793,236],{"class":235},[217,795,796],{"class":277},"claims",[217,798,280],{"class":235},[217,800,801],{"class":219,"line":329},[217,802,333],{"emptyLinePlaceholder":332},[217,804,805,808,810,812,814,816],{"class":219,"line":336},[217,806,807],{"class":231},"  setRequestSession",[217,809,236],{"class":235},[217,811,246],{"class":277},[217,813,723],{"class":235},[217,815,348],{"class":277},[217,817,280],{"class":235},[217,819,820],{"class":219,"line":354},[217,821,333],{"emptyLinePlaceholder":332},[217,823,824],{"class":219,"line":376},[217,825,826],{"class":564},"  \u002F\u002F Later middleware and handlers reuse the supplied value.\n",[217,828,829],{"class":219,"line":382},[217,830,413],{"class":235},[158,832,833,834,836],{},"The helper makes the supplied value authoritative immediately, so an older session lookup or refresh cannot overwrite it when that work settles. Pass ",[165,835,602],{}," to cache an unauthenticated result for the current request.",[185,838,839,841],{},[165,840,713],{}," trusts the supplied value. Authenticate the request and enforce bearer-token audience and scope restrictions before calling it. The helper does not create, update, or clear a Better Auth session cookie.",[199,843,845],{"id":844},"refreshsessioncookiecache","refreshSessionCookieCache",[158,847,848,849,183],{},"Refreshes Better Auth's cached session cookie on the current response, then refreshes the request-cached session used by ",[165,850,581],{},[207,852,855],{"className":209,"code":853,"filename":854,"language":212,"meta":213,"style":213},"export default defineEventHandler(async (event) => {\n  await updateCurrentUserProfile(event)\n  await refreshSessionCookieCache(event)\n\n  return { ok: true }\n})\n","server\u002Fapi\u002Fprofile.patch.ts",[165,856,857,879,893,906,910,925],{"__ignoreMap":213},[217,858,859,861,863,865,867,869,871,873,875,877],{"class":219,"line":220},[217,860,224],{"class":223},[217,862,228],{"class":227},[217,864,232],{"class":231},[217,866,236],{"class":235},[217,868,239],{"class":223},[217,870,242],{"class":235},[217,872,246],{"class":245},[217,874,249],{"class":235},[217,876,252],{"class":223},[217,878,255],{"class":235},[217,880,881,884,887,889,891],{"class":219,"line":258},[217,882,883],{"class":223},"  await",[217,885,886],{"class":231}," updateCurrentUserProfile",[217,888,236],{"class":235},[217,890,246],{"class":277},[217,892,280],{"class":235},[217,894,895,897,900,902,904],{"class":219,"line":283},[217,896,883],{"class":223},[217,898,899],{"class":231}," refreshSessionCookieCache",[217,901,236],{"class":235},[217,903,246],{"class":277},[217,905,280],{"class":235},[217,907,908],{"class":219,"line":329},[217,909,333],{"emptyLinePlaceholder":332},[217,911,912,914,916,919,921,923],{"class":219,"line":336},[217,913,390],{"class":223},[217,915,393],{"class":235},[217,917,918],{"class":277},"ok",[217,920,316],{"class":315},[217,922,472],{"class":370},[217,924,407],{"class":235},[217,926,927],{"class":219,"line":354},[217,928,413],{"class":235},[158,930,931,932,934,935,937,938,941],{},"Use this helper after server-side code changes data returned by ",[165,933,692],{}," or ",[165,936,581],{},", such as user fields added through Better Auth's ",[165,939,940],{},"custom-session"," plugin.",[481,943,944],{},"This refreshes the cached session cookie. It does not update the session or user record; perform that update first.",[199,946,948,949],{"id":947},"session-enrichment-with-custom-session","Session Enrichment with ",[165,950,940],{},[158,952,953,954,956,957,726,960,934,962,964],{},"Use Better Auth's ",[165,955,940],{}," plugin when your app needs computed fields in the session payload returned by server helpers. Define the enrichment in ",[165,958,959],{},"server\u002Fauth.config.ts",[165,961,494],{},[165,963,607],{}," will return the enriched shape.",[207,966,968],{"className":209,"code":967,"filename":959,"language":212,"meta":213,"style":213},"import { customSession } from 'better-auth\u002Fplugins'\nimport { defineServerAuth } from '@nuxtjs\u002Fbetter-auth\u002Fconfig'\n\nexport default defineServerAuth({\n  plugins: [\n    customSession(async ({ user, session }) => {\n      return {\n        user: {\n          ...user,\n          role: user.email?.endsWith('@company.com') ? 'member' : 'guest',\n        },\n        session: {\n          ...session,\n        },\n      }\n    }),\n  ],\n})\n",[165,969,970,990,1005,1009,1020,1030,1055,1062,1071,1080,1123,1129,1139,1148,1153,1159,1165,1171],{"__ignoreMap":213},[217,971,972,975,977,980,983,986],{"class":219,"line":220},[217,973,974],{"class":223},"import",[217,976,393],{"class":235},[217,978,979],{"class":277},"customSession",[217,981,982],{"class":235}," } ",[217,984,985],{"class":223},"from",[217,987,989],{"class":988},"sPAZv"," 'better-auth\u002Fplugins'\n",[217,991,992,994,996,998,1000,1002],{"class":219,"line":258},[217,993,974],{"class":223},[217,995,393],{"class":235},[217,997,167],{"class":277},[217,999,982],{"class":235},[217,1001,985],{"class":223},[217,1003,1004],{"class":988}," '@nuxtjs\u002Fbetter-auth\u002Fconfig'\n",[217,1006,1007],{"class":219,"line":283},[217,1008,333],{"emptyLinePlaceholder":332},[217,1010,1011,1013,1015,1018],{"class":219,"line":329},[217,1012,224],{"class":223},[217,1014,228],{"class":227},[217,1016,1017],{"class":231}," defineServerAuth",[217,1019,439],{"class":235},[217,1021,1022,1025,1027],{"class":219,"line":336},[217,1023,1024],{"class":277},"  plugins",[217,1026,316],{"class":315},[217,1028,1029],{"class":235}," [\n",[217,1031,1032,1035,1037,1039,1042,1044,1046,1048,1051,1053],{"class":219,"line":354},[217,1033,1034],{"class":231},"    customSession",[217,1036,236],{"class":235},[217,1038,239],{"class":223},[217,1040,1041],{"class":235}," ({ ",[217,1043,396],{"class":245},[217,1045,723],{"class":235},[217,1047,348],{"class":245},[217,1049,1050],{"class":235}," }) ",[217,1052,252],{"class":223},[217,1054,255],{"class":235},[217,1056,1057,1060],{"class":219,"line":376},[217,1058,1059],{"class":223},"      return",[217,1061,255],{"class":235},[217,1063,1064,1067,1069],{"class":219,"line":382},[217,1065,1066],{"class":277},"        user",[217,1068,316],{"class":315},[217,1070,255],{"class":235},[217,1072,1073,1076,1078],{"class":219,"line":387},[217,1074,1075],{"class":344},"          ...",[217,1077,396],{"class":277},[217,1079,455],{"class":235},[217,1081,1082,1085,1087,1090,1092,1096,1099,1102,1104,1107,1109,1112,1115,1118,1121],{"class":219,"line":410},[217,1083,1084],{"class":277},"          role",[217,1086,316],{"class":315},[217,1088,1089],{"class":296}," user",[217,1091,183],{"class":235},[217,1093,1095],{"class":1094},"sjaJz","email",[217,1097,1098],{"class":235},"?.",[217,1100,1101],{"class":231},"endsWith",[217,1103,236],{"class":235},[217,1105,1106],{"class":988},"'@company.com'",[217,1108,249],{"class":235},[217,1110,1111],{"class":344},"?",[217,1113,1114],{"class":988}," 'member'",[217,1116,1117],{"class":344}," :",[217,1119,1120],{"class":988}," 'guest'",[217,1122,455],{"class":235},[217,1124,1126],{"class":219,"line":1125},11,[217,1127,1128],{"class":235},"        },\n",[217,1130,1132,1135,1137],{"class":219,"line":1131},12,[217,1133,1134],{"class":277},"        session",[217,1136,316],{"class":315},[217,1138,255],{"class":235},[217,1140,1142,1144,1146],{"class":219,"line":1141},13,[217,1143,1075],{"class":344},[217,1145,348],{"class":277},[217,1147,455],{"class":235},[217,1149,1151],{"class":219,"line":1150},14,[217,1152,1128],{"class":235},[217,1154,1156],{"class":219,"line":1155},15,[217,1157,1158],{"class":235},"      }\n",[217,1160,1162],{"class":219,"line":1161},16,[217,1163,1164],{"class":235},"    }),\n",[217,1166,1168],{"class":219,"line":1167},17,[217,1169,1170],{"class":235},"  ],\n",[217,1172,1174],{"class":219,"line":1173},18,[217,1175,413],{"class":235},[481,1177,1178],{},"This uses Better Auth's plugin API and does not require a module-specific option.",[199,1180,1182],{"id":1181},"createsession","createSession",[158,1184,1185],{},"Creates a Better Auth session for a user and returns the created session record. Use this helper in custom server-side authentication flows after your handler verifies the user identity.",[207,1187,1190],{"className":209,"code":1188,"filename":1189,"language":212,"meta":213,"style":213},"export default defineEventHandler(async (event) => {\n  const userId = await verifyCustomLoginAndReturnUserId(event)\n  const session = await createSession(event, userId)\n\n  return {\n    sessionId: session.id,\n    token: session.token,\n  }\n})\n","server\u002Fapi\u002Fcustom-auth.post.ts",[165,1191,1192,1214,1234,1258,1262,1268,1284,1300,1304],{"__ignoreMap":213},[217,1193,1194,1196,1198,1200,1202,1204,1206,1208,1210,1212],{"class":219,"line":220},[217,1195,224],{"class":223},[217,1197,228],{"class":227},[217,1199,232],{"class":231},[217,1201,236],{"class":235},[217,1203,239],{"class":223},[217,1205,242],{"class":235},[217,1207,246],{"class":245},[217,1209,249],{"class":235},[217,1211,252],{"class":223},[217,1213,255],{"class":235},[217,1215,1216,1218,1221,1223,1225,1228,1230,1232],{"class":219,"line":258},[217,1217,261],{"class":223},[217,1219,1220],{"class":264}," userId",[217,1222,269],{"class":268},[217,1224,293],{"class":223},[217,1226,1227],{"class":231}," verifyCustomLoginAndReturnUserId",[217,1229,236],{"class":235},[217,1231,246],{"class":277},[217,1233,280],{"class":235},[217,1235,1236,1238,1240,1242,1244,1247,1249,1251,1253,1256],{"class":219,"line":283},[217,1237,261],{"class":223},[217,1239,288],{"class":264},[217,1241,269],{"class":268},[217,1243,293],{"class":223},[217,1245,1246],{"class":231}," createSession",[217,1248,236],{"class":235},[217,1250,246],{"class":277},[217,1252,723],{"class":235},[217,1254,1255],{"class":277},"userId",[217,1257,280],{"class":235},[217,1259,1260],{"class":219,"line":329},[217,1261,333],{"emptyLinePlaceholder":332},[217,1263,1264,1266],{"class":219,"line":336},[217,1265,390],{"class":223},[217,1267,255],{"class":235},[217,1269,1270,1273,1275,1277,1279,1282],{"class":219,"line":354},[217,1271,1272],{"class":277},"    sessionId",[217,1274,316],{"class":315},[217,1276,288],{"class":296},[217,1278,183],{"class":235},[217,1280,1281],{"class":277},"id",[217,1283,455],{"class":235},[217,1285,1286,1289,1291,1293,1295,1298],{"class":219,"line":376},[217,1287,1288],{"class":277},"    token",[217,1290,316],{"class":315},[217,1292,288],{"class":296},[217,1294,183],{"class":235},[217,1296,1297],{"class":277},"token",[217,1299,455],{"class":235},[217,1301,1302],{"class":219,"line":382},[217,1303,379],{"class":235},[217,1305,1306],{"class":219,"line":387},[217,1307,413],{"class":235},[158,1309,1310],{},"Pair this helper with your preferred cookie strategy. When you also use the module cookie helper, you can set the returned token on the response after creating the session.",[199,1312,1314],{"id":1313},"setsessioncookie","setSessionCookie",[158,1316,1317],{},"Sets the Better Auth session token cookie on the current response. Use this helper in custom server-side authentication flows after you obtain or create a valid Better Auth session token.",[207,1319,1321],{"className":209,"code":1320,"filename":1189,"language":212,"meta":213,"style":213},"export default defineEventHandler(async (event) => {\n  const token = await verifyCustomLoginAndReturnSessionToken(event)\n\n  await setSessionCookie(event, token)\n\n  return { ok: true }\n})\n",[165,1322,1323,1345,1365,1369,1386,1390,1404],{"__ignoreMap":213},[217,1324,1325,1327,1329,1331,1333,1335,1337,1339,1341,1343],{"class":219,"line":220},[217,1326,224],{"class":223},[217,1328,228],{"class":227},[217,1330,232],{"class":231},[217,1332,236],{"class":235},[217,1334,239],{"class":223},[217,1336,242],{"class":235},[217,1338,246],{"class":245},[217,1340,249],{"class":235},[217,1342,252],{"class":223},[217,1344,255],{"class":235},[217,1346,1347,1349,1352,1354,1356,1359,1361,1363],{"class":219,"line":258},[217,1348,261],{"class":223},[217,1350,1351],{"class":264}," token",[217,1353,269],{"class":268},[217,1355,293],{"class":223},[217,1357,1358],{"class":231}," verifyCustomLoginAndReturnSessionToken",[217,1360,236],{"class":235},[217,1362,246],{"class":277},[217,1364,280],{"class":235},[217,1366,1367],{"class":219,"line":283},[217,1368,333],{"emptyLinePlaceholder":332},[217,1370,1371,1373,1376,1378,1380,1382,1384],{"class":219,"line":329},[217,1372,883],{"class":223},[217,1374,1375],{"class":231}," setSessionCookie",[217,1377,236],{"class":235},[217,1379,246],{"class":277},[217,1381,723],{"class":235},[217,1383,1297],{"class":277},[217,1385,280],{"class":235},[217,1387,1388],{"class":219,"line":336},[217,1389,333],{"emptyLinePlaceholder":332},[217,1391,1392,1394,1396,1398,1400,1402],{"class":219,"line":354},[217,1393,390],{"class":223},[217,1395,393],{"class":235},[217,1397,918],{"class":277},[217,1399,316],{"class":315},[217,1401,472],{"class":370},[217,1403,407],{"class":235},[217,1405,1406],{"class":219,"line":376},[217,1407,413],{"class":235},[158,1409,1410],{},"The helper signs the cookie with your Better Auth secret and uses the configured cookie name and attributes from your server auth config.",[481,1412,1413,1416],{},[165,1414,1415],{},"setSessionCookie(event, token)"," sets the session token cookie only. It does not try to recreate every internal Better Auth sign-in side effect.",[199,1418,729],{"id":1419},"requireusersession",[158,1421,1422,1423,934,1426,1429],{},"Ensures the user is authenticated and optionally matches specific criteria. Throws a ",[165,1424,1425],{},"401 Unauthorized",[165,1427,1428],{},"403 Forbidden"," error if checks fail.",[207,1431,1433],{"className":209,"code":1432,"language":212,"meta":213,"style":213},"const { user, session } = await requireUserSession(event, options?)\n",[165,1434,1435],{"__ignoreMap":213},[217,1436,1437,1440,1442,1444,1446,1448,1450,1453,1455,1458,1460,1462,1464,1467,1469],{"class":219,"line":220},[217,1438,1439],{"class":223},"const",[217,1441,393],{"class":235},[217,1443,396],{"class":264},[217,1445,723],{"class":235},[217,1447,348],{"class":264},[217,1449,982],{"class":235},[217,1451,1452],{"class":268},"=",[217,1454,293],{"class":223},[217,1456,1457],{"class":231}," requireUserSession",[217,1459,236],{"class":235},[217,1461,246],{"class":296},[217,1463,723],{"class":235},[217,1465,1466],{"class":296},"options",[217,1468,1111],{"class":344},[217,1470,280],{"class":235},[481,1472,1473,1475,1476,179,1479,1482,1483,1486,1487,1489,1490,1493],{},[165,1474,729],{}," uses ",[165,1477,1478],{},"AuthUser",[165,1480,1481],{},"AuthSession"," from ",[165,1484,1485],{},"#nuxt-better-auth"," for both the returned value and option callbacks (",[165,1488,396],{}," match + ",[165,1491,1492],{},"rule",").",[701,1495,1496],{"id":1466},"Options",[1498,1499,1500,1505],"field-group",{},[1501,1502,1504],"field",{"name":396,"type":1503},"UserMatch","Object matching user properties (see Route Protection).",[1501,1506,1508],{"name":1492,"type":1507},"(ctx) => boolean | Promise\u003Cboolean>","Custom validation callback.",[701,1510,1512],{"id":1511},"examples","Examples",[158,1514,1515],{},[189,1516,1517],{},"Role Check:",[207,1519,1522],{"className":209,"code":1520,"filename":1521,"language":212,"meta":213,"style":213},"await requireUserSession(event, {\n  user: { role: 'admin' }\n})\n","server\u002Fapi\u002Fadmin\u002Fdashboard.ts",[165,1523,1524,1537,1556],{"__ignoreMap":213},[217,1525,1526,1528,1530,1532,1534],{"class":219,"line":220},[217,1527,426],{"class":223},[217,1529,1457],{"class":231},[217,1531,236],{"class":235},[217,1533,246],{"class":296},[217,1535,1536],{"class":235},", {\n",[217,1538,1539,1542,1544,1546,1549,1551,1554],{"class":219,"line":258},[217,1540,1541],{"class":277},"  user",[217,1543,316],{"class":315},[217,1545,393],{"class":235},[217,1547,1548],{"class":277},"role",[217,1550,316],{"class":315},[217,1552,1553],{"class":988}," 'admin'",[217,1555,407],{"class":235},[217,1557,1558],{"class":219,"line":283},[217,1559,413],{"class":235},[158,1561,1562],{},[189,1563,1564],{},"Custom Rule:",[207,1566,1568],{"className":209,"code":1567,"filename":1521,"language":212,"meta":213,"style":213},"await requireUserSession(event, {\n  rule: ({ user }) => {\n    return user.points > 100\n  }\n})\n",[165,1569,1570,1582,1599,1617,1621],{"__ignoreMap":213},[217,1571,1572,1574,1576,1578,1580],{"class":219,"line":220},[217,1573,426],{"class":223},[217,1575,1457],{"class":231},[217,1577,236],{"class":235},[217,1579,246],{"class":296},[217,1581,1536],{"class":235},[217,1583,1584,1587,1589,1591,1593,1595,1597],{"class":219,"line":258},[217,1585,1586],{"class":231},"  rule",[217,1588,316],{"class":315},[217,1590,1041],{"class":235},[217,1592,396],{"class":245},[217,1594,1050],{"class":235},[217,1596,252],{"class":223},[217,1598,255],{"class":235},[217,1600,1601,1604,1606,1608,1611,1614],{"class":219,"line":283},[217,1602,1603],{"class":223},"    return",[217,1605,1089],{"class":296},[217,1607,183],{"class":235},[217,1609,1610],{"class":277},"points",[217,1612,1613],{"class":344}," >",[217,1615,1616],{"class":370}," 100\n",[217,1618,1619],{"class":219,"line":329},[217,1620,379],{"class":235},[217,1622,1623],{"class":219,"line":336},[217,1624,413],{"class":235},[199,1626,1628],{"id":1627},"combining-user-matching-with-rules","Combining User Matching with Rules",[207,1630,1633],{"className":209,"code":1631,"filename":1632,"language":212,"meta":213,"style":213},"export default defineEventHandler(async (event) => {\n  const { teamId } = getRouterParams(event)\n\n  \u002F\u002F Require admin role AND membership in the specific team\n  await requireUserSession(event, {\n    user: { role: 'admin' },\n    rule: async (session) => {\n      const membership = await getTeamMembership(session.user.id, teamId)\n      return membership?.role === 'owner'\n    }\n  })\n\n  return getTeamSettings(teamId)\n})\n","server\u002Fapi\u002Fteam\u002F[teamId]\u002Fsettings.ts",[165,1634,1635,1657,1679,1683,1688,1700,1717,1737,1770,1786,1791,1796,1800,1813],{"__ignoreMap":213},[217,1636,1637,1639,1641,1643,1645,1647,1649,1651,1653,1655],{"class":219,"line":220},[217,1638,224],{"class":223},[217,1640,228],{"class":227},[217,1642,232],{"class":231},[217,1644,236],{"class":235},[217,1646,239],{"class":223},[217,1648,242],{"class":235},[217,1650,246],{"class":245},[217,1652,249],{"class":235},[217,1654,252],{"class":223},[217,1656,255],{"class":235},[217,1658,1659,1661,1663,1666,1668,1670,1673,1675,1677],{"class":219,"line":258},[217,1660,261],{"class":223},[217,1662,393],{"class":235},[217,1664,1665],{"class":264},"teamId",[217,1667,982],{"class":235},[217,1669,1452],{"class":268},[217,1671,1672],{"class":231}," getRouterParams",[217,1674,236],{"class":235},[217,1676,246],{"class":277},[217,1678,280],{"class":235},[217,1680,1681],{"class":219,"line":283},[217,1682,333],{"emptyLinePlaceholder":332},[217,1684,1685],{"class":219,"line":329},[217,1686,1687],{"class":564},"  \u002F\u002F Require admin role AND membership in the specific team\n",[217,1689,1690,1692,1694,1696,1698],{"class":219,"line":336},[217,1691,883],{"class":223},[217,1693,1457],{"class":231},[217,1695,236],{"class":235},[217,1697,246],{"class":277},[217,1699,1536],{"class":235},[217,1701,1702,1705,1707,1709,1711,1713,1715],{"class":219,"line":354},[217,1703,1704],{"class":277},"    user",[217,1706,316],{"class":315},[217,1708,393],{"class":235},[217,1710,1548],{"class":277},[217,1712,316],{"class":315},[217,1714,1553],{"class":988},[217,1716,475],{"class":235},[217,1718,1719,1722,1724,1727,1729,1731,1733,1735],{"class":219,"line":376},[217,1720,1721],{"class":231},"    rule",[217,1723,316],{"class":315},[217,1725,1726],{"class":223}," async",[217,1728,242],{"class":235},[217,1730,348],{"class":245},[217,1732,249],{"class":235},[217,1734,252],{"class":223},[217,1736,255],{"class":235},[217,1738,1739,1742,1745,1747,1749,1752,1754,1756,1758,1760,1762,1764,1766,1768],{"class":219,"line":382},[217,1740,1741],{"class":223},"      const",[217,1743,1744],{"class":264}," membership",[217,1746,269],{"class":268},[217,1748,293],{"class":223},[217,1750,1751],{"class":231}," getTeamMembership",[217,1753,236],{"class":235},[217,1755,348],{"class":296},[217,1757,183],{"class":235},[217,1759,396],{"class":277},[217,1761,183],{"class":235},[217,1763,1281],{"class":277},[217,1765,723],{"class":235},[217,1767,1665],{"class":277},[217,1769,280],{"class":235},[217,1771,1772,1774,1776,1778,1780,1783],{"class":219,"line":387},[217,1773,1059],{"class":223},[217,1775,1744],{"class":296},[217,1777,1098],{"class":235},[217,1779,1548],{"class":277},[217,1781,1782],{"class":344}," ===",[217,1784,1785],{"class":988}," 'owner'\n",[217,1787,1788],{"class":219,"line":410},[217,1789,1790],{"class":235},"    }\n",[217,1792,1793],{"class":219,"line":1125},[217,1794,1795],{"class":235},"  })\n",[217,1797,1798],{"class":219,"line":1131},[217,1799,333],{"emptyLinePlaceholder":332},[217,1801,1802,1804,1807,1809,1811],{"class":219,"line":1141},[217,1803,390],{"class":223},[217,1805,1806],{"class":231}," getTeamSettings",[217,1808,236],{"class":235},[217,1810,1665],{"class":277},[217,1812,280],{"class":235},[217,1814,1815],{"class":219,"line":1150},[217,1816,413],{"class":235},[199,1818,1820],{"id":1819},"related-pages","Related pages",[589,1822,1823,1828,1833],{},[592,1824,1825],{},[194,1826,1827],{"href":49},"Server auth concept",[592,1829,1830],{},[194,1831,1832],{"href":57},"Route protection",[592,1834,1835],{},[194,1836,149],{"href":150},[1838,1839,1840],"style",{},"html pre.shiki code .sqe1H, html code.shiki .sqe1H{--shiki-light:#A626A4;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .sKg8T, html code.shiki .sKg8T{--shiki-light:#E45649;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .sfT9l, html code.shiki .sfT9l{--shiki-light:#4078F2;--shiki-default:#36F9F6;--shiki-dark:#36F9F6}html pre.shiki code .s17Py, html code.shiki .s17Py{--shiki-light:#383A42;--shiki-default:#BBBBBB;--shiki-dark:#BBBBBB}html pre.shiki code .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 .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 .sYvLG, html code.shiki .sYvLG{--shiki-light:#E45649;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .svFNh, html code.shiki .svFNh{--shiki-light:#383A42;--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 .sn-Jc, html code.shiki .sn-Jc{--shiki-light:#0184BC;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .s3ZNE, html code.shiki .s3ZNE{--shiki-light:#986801;--shiki-default:#F97E72;--shiki-dark:#F97E72}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 .st7cf, html code.shiki .st7cf{--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-default:#848BBD;--shiki-default-font-style:italic;--shiki-dark:#848BBD;--shiki-dark-font-style:italic}html pre.shiki code .sPAZv, html code.shiki .sPAZv{--shiki-light:#50A14F;--shiki-default:#FF8B39;--shiki-dark:#FF8B39}html pre.shiki code .sjaJz, html code.shiki .sjaJz{--shiki-light:#C18401;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}",{"title":213,"searchDepth":258,"depth":258,"links":1842},[1843,1844,1845,1846,1847,1848,1850,1851,1852,1856,1857],{"id":201,"depth":258,"text":202},{"id":493,"depth":258,"text":494},{"id":606,"depth":258,"text":607},{"id":712,"depth":258,"text":713},{"id":844,"depth":258,"text":845},{"id":947,"depth":258,"text":1849},"Session Enrichment with custom-session",{"id":1181,"depth":258,"text":1182},{"id":1313,"depth":258,"text":1314},{"id":1419,"depth":258,"text":729,"children":1853},[1854,1855],{"id":1466,"depth":283,"text":1496},{"id":1511,"depth":283,"text":1512},{"id":1627,"depth":258,"text":1628},{"id":1819,"depth":258,"text":1820},"API reference for server-side helpers available in Nitro event handlers.","md",null,{},{"title":141,"description":1858},"WOT1LSwLnCCajVjKlYLo98Q4FuAcL4oG1R9y2MRdMd4",[1865,1867],{"title":137,"path":138,"stem":139,"description":1866,"children":-1},"API reference for client-side composables.",{"title":145,"path":146,"stem":147,"description":1868,"children":-1},"Built‑in UI helpers.",1788606330823]