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