[{"data":1,"prerenderedAt":2308},["ShallowReactive",2],{"navigation_docs":3,"-guides-migrate-from-nuxt-auth-utils":152,"-guides-migrate-from-nuxt-auth-utils-surround":2303},[4,42,68,110,131],{"title":5,"path":6,"stem":7,"children":8,"icon":11},"Getting Started","/getting-started","1.getting-started/0.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","/getting-started/installation","1.getting-started/1.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Configuration","/getting-started/configuration","1.getting-started/2.configuration","i-lucide-settings",{"title":23,"path":24,"stem":25,"icon":26},"Client Setup","/getting-started/client-setup","1.getting-started/3.client-setup","i-lucide-monitor",{"title":28,"path":29,"stem":30,"icon":31},"Type Augmentation","/getting-started/type-augmentation","1.getting-started/4.type-augmentation","i-lucide-type",{"title":33,"path":34,"stem":35,"icon":36},"Schema Generation (NuxtHub)","/getting-started/schema-generation","1.getting-started/5.schema-generation","i-lucide-database",{"title":38,"path":39,"stem":40,"icon":41},"How It Works","/getting-started/how-it-works","1.getting-started/6.how-it-works","i-lucide-workflow",{"title":43,"path":44,"stem":45,"children":46,"page":67},"Core Concepts","/core-concepts","2.core-concepts",[47,51,55,59,63],{"title":48,"path":49,"stem":50},"serverAuth()","/core-concepts/server-auth","2.core-concepts/1.server-auth",{"title":52,"path":53,"stem":54},"Sessions","/core-concepts/sessions","2.core-concepts/2.sessions",{"title":56,"path":57,"stem":58},"Route Protection","/core-concepts/route-protection","2.core-concepts/3.route-protection",{"title":60,"path":61,"stem":62},"Auto‑Imports and Aliases","/core-concepts/auto-imports-aliases","2.core-concepts/4.auto-imports-aliases",{"title":64,"path":65,"stem":66},"Security & Caveats","/core-concepts/security-caveats","2.core-concepts/5.security-caveats",false,{"title":69,"path":70,"stem":71,"children":72,"page":67},"Guides","/guides","3.guides",[73,77,81,85,89,94,98,102,106],{"title":74,"path":75,"stem":76},"Role‑Based Access","/guides/role-based-access","3.guides/1.role-based-access",{"title":78,"path":79,"stem":80},"OAuth Providers","/guides/oauth-providers","3.guides/2.oauth-providers",{"title":82,"path":83,"stem":84},"Custom Database","/guides/custom-database","3.guides/3.custom-database",{"title":86,"path":87,"stem":88},"Database-less Mode","/guides/database-less-mode","3.guides/4.database-less-mode",{"title":90,"path":91,"stem":92,"icon":93},"External Auth Backend","/guides/external-auth-backend","3.guides/5.external-auth-backend","i-lucide-server",{"title":95,"path":96,"stem":97},"Migrating from nuxt-auth-utils","/guides/migrate-from-nuxt-auth-utils","3.guides/6.migrate-from-nuxt-auth-utils",{"title":99,"path":100,"stem":101},"Two-Factor Authentication (TOTP + Backup Codes)","/guides/two-factor-auth","3.guides/7.two-factor-auth",{"title":103,"path":104,"stem":105},"Testing","/guides/testing","3.guides/8.testing",{"title":107,"path":108,"stem":109},"Production Deployment","/guides/production-deployment","3.guides/9.production-deployment",{"title":111,"path":112,"stem":113,"children":114,"page":67},"Integrations","/integrations","4.integrations",[115,119,123,127],{"title":116,"path":117,"stem":118},"NuxtHub","/integrations/nuxthub","4.integrations/1.nuxthub",{"title":120,"path":121,"stem":122},"DevTools","/integrations/devtools","4.integrations/2.devtools",{"title":124,"path":125,"stem":126},"Convex","/integrations/convex","4.integrations/3.convex",{"title":128,"path":129,"stem":130},"i18n","/integrations/i18n","4.integrations/4.i18n",{"title":132,"path":133,"stem":134,"children":135,"page":67},"API Reference","/api","5.api",[136,140,144,148],{"title":137,"path":138,"stem":139},"Composables","/api/composables","5.api/1.composables",{"title":141,"path":142,"stem":143},"Server Utilities","/api/server-utils","5.api/2.server-utils",{"title":145,"path":146,"stem":147},"Components","/api/components","5.api/3.components",{"title":149,"path":150,"stem":151},"Types","/api/types","5.api/4.types",{"id":153,"title":95,"body":154,"description":2297,"extension":2298,"links":2299,"meta":2300,"navigation":367,"path":96,"seo":2301,"stem":97,"__hash__":2302},"docs/3.guides/6.migrate-from-nuxt-auth-utils.md",{"type":155,"value":156,"toc":2270},"minimark",[157,166,178,186,202,207,267,271,276,285,290,294,454,458,593,720,724,1793,1796,1932,1936,1940,1951,1956,1959,1966,1969,1973,1976,1993,1997,2000,2127,2131,2134,2186,2190,2193,2204,2209,2213,2225,2232,2236,2240,2247,2251,2257,2261,2266],[158,159,160,161,165],"p",{},"Use this guide when you already have a Nuxt app on ",[162,163,164],"code",{},"nuxt-auth-utils"," and want a safe migration order.",[158,167,168,169,177],{},"This guide covers migrating from ",[170,171,175],"a",{"href":172,"rel":173},"https://github.com/atinux/nuxt-auth-utils",[174],"nofollow",[162,176,164],{}," to Nuxt Better Auth.",[179,180,181,185],"warning",{},[182,183,184],"strong",{},"Significant migration",": nuxt-auth-utils stores sessions in encrypted cookies. Better Auth uses database-backed sessions with typed users. Plan accordingly.",[187,188,191,192,195,196,201],"callout",{"to":189,"icon":190},"https://www.better-auth.com/docs","i-lucide-info","This module is a ",[182,193,194],{},"Nuxt wrapper"," around ",[170,197,200],{"href":198,"rel":199},"https://www.better-auth.com",[174],"Better Auth",". Most auth logic (OAuth providers, plugins, email/password, etc.) is configured via Better Auth. Refer to their docs for provider-specific setup.",[203,204,206],"h2",{"id":205},"why-migrate","Why Migrate?",[208,209,210,223],"table",{},[211,212,213],"thead",{},[214,215,216,220],"tr",{},[217,218,164],"th",{"align":219},"left",[217,221,222],{"align":219},"Nuxt Better Auth",[224,225,226,235,243,251,259],"tbody",{},[214,227,228,232],{},[229,230,231],"td",{"align":219},"Session-only (cookie storage)",[229,233,234],{"align":219},"Database-backed user records",[214,236,237,240],{},[229,238,239],{"align":219},"Manual OAuth handlers per provider",[229,241,242],{"align":219},"Declarative OAuth config",[214,244,245,248],{},[229,246,247],{"align":219},"Generic session object",[229,249,250],{"align":219},"Full TypeScript inference from plugins",[214,252,253,256],{},[229,254,255],{"align":219},"Limited plugin ecosystem",[229,257,258],{"align":219},"Rich plugins (admin, 2FA, passkeys, orgs)",[214,260,261,264],{},[229,262,263],{"align":219},"Manual session management",[229,265,266],{"align":219},"Built-in signIn/signUp/signOut",[203,268,270],{"id":269},"key-differences","Key Differences",[272,273,275],"h3",{"id":274},"session-architecture","Session Architecture",[158,277,278,280,281,284],{},[182,279,164],{},": Arbitrary data in encrypted cookies via ",[162,282,283],{},"NUXT_SESSION_PASSWORD",". No database required.",[158,286,287,289],{},[182,288,200],{},": Database stores users + sessions. Cookies contain session tokens referencing DB records.",[272,291,293],{"id":292},"composable-api","Composable API",[295,296,301],"pre",{"className":297,"code":298,"language":299,"meta":300,"style":300},"language-ts shiki shiki-themes one-light synthwave-84 synthwave-84","// nuxt-auth-utils\nconst { user, loggedIn, ready, fetch, clear } = useUserSession()\n\n// nuxt-better-auth\nconst { user, session, loggedIn, ready, signOut, fetchSession } = useUserSession()\nconst signInEmail = useSignIn('email')\nconst client = useAuthClient()\n","ts","",[162,302,303,312,362,369,375,415,439],{"__ignoreMap":300},[304,305,308],"span",{"class":306,"line":307},"line",1,[304,309,311],{"class":310},"st7cf","// nuxt-auth-utils\n",[304,313,315,319,323,327,330,333,335,338,340,343,345,348,351,355,359],{"class":306,"line":314},2,[304,316,318],{"class":317},"sqe1H","const",[304,320,322],{"class":321},"s17Py"," { ",[304,324,326],{"class":325},"s6Rhl","user",[304,328,329],{"class":321},", ",[304,331,332],{"class":325},"loggedIn",[304,334,329],{"class":321},[304,336,337],{"class":325},"ready",[304,339,329],{"class":321},[304,341,342],{"class":325},"fetch",[304,344,329],{"class":321},[304,346,347],{"class":325},"clear",[304,349,350],{"class":321}," } ",[304,352,354],{"class":353},"sQBpM","=",[304,356,358],{"class":357},"sfT9l"," useUserSession",[304,360,361],{"class":321},"()\n",[304,363,365],{"class":306,"line":364},3,[304,366,368],{"emptyLinePlaceholder":367},true,"\n",[304,370,372],{"class":306,"line":371},4,[304,373,374],{"class":310},"// nuxt-better-auth\n",[304,376,378,380,382,384,386,389,391,393,395,397,399,402,404,407,409,411,413],{"class":306,"line":377},5,[304,379,318],{"class":317},[304,381,322],{"class":321},[304,383,326],{"class":325},[304,385,329],{"class":321},[304,387,388],{"class":325},"session",[304,390,329],{"class":321},[304,392,332],{"class":325},[304,394,329],{"class":321},[304,396,337],{"class":325},[304,398,329],{"class":321},[304,400,401],{"class":325},"signOut",[304,403,329],{"class":321},[304,405,406],{"class":325},"fetchSession",[304,408,350],{"class":321},[304,410,354],{"class":353},[304,412,358],{"class":357},[304,414,361],{"class":321},[304,416,418,420,423,426,429,432,436],{"class":306,"line":417},6,[304,419,318],{"class":317},[304,421,422],{"class":325}," signInEmail",[304,424,425],{"class":353}," =",[304,427,428],{"class":357}," useSignIn",[304,430,431],{"class":321},"(",[304,433,435],{"class":434},"sPAZv","'email'",[304,437,438],{"class":321},")\n",[304,440,442,444,447,449,452],{"class":306,"line":441},7,[304,443,318],{"class":317},[304,445,446],{"class":325}," client",[304,448,425],{"class":353},[304,450,451],{"class":357}," useAuthClient",[304,453,361],{"class":321},[272,455,457],{"id":456},"oauth-handling","OAuth Handling",[295,459,461],{"className":297,"code":460,"language":299,"meta":300,"style":300},"// nuxt-auth-utils - Event handler per provider\n// server/routes/auth/github.get.ts\nexport default defineOAuthGitHubEventHandler({\n  async onSuccess(event, { user }) {\n    await setUserSession(event, { user: { id: user.id, name: user.name } })\n    return sendRedirect(event, '/')\n  }\n})\n",[162,462,463,468,473,488,510,563,582,587],{"__ignoreMap":300},[304,464,465],{"class":306,"line":307},[304,466,467],{"class":310},"// nuxt-auth-utils - Event handler per provider\n",[304,469,470],{"class":306,"line":314},[304,471,472],{"class":310},"// server/routes/auth/github.get.ts\n",[304,474,475,478,482,485],{"class":306,"line":364},[304,476,477],{"class":317},"export",[304,479,481],{"class":480},"sKg8T"," default",[304,483,484],{"class":357}," defineOAuthGitHubEventHandler",[304,486,487],{"class":321},"({\n",[304,489,490,493,496,498,502,505,507],{"class":306,"line":371},[304,491,492],{"class":317},"  async",[304,494,495],{"class":357}," onSuccess",[304,497,431],{"class":321},[304,499,501],{"class":500},"sgisi","event",[304,503,504],{"class":321},", { ",[304,506,326],{"class":500},[304,508,509],{"class":321}," }) {\n",[304,511,512,515,518,520,523,525,527,531,533,536,538,542,545,547,549,552,554,556,558,560],{"class":306,"line":377},[304,513,514],{"class":317},"    await",[304,516,517],{"class":357}," setUserSession",[304,519,431],{"class":321},[304,521,501],{"class":522},"sYvLG",[304,524,504],{"class":321},[304,526,326],{"class":522},[304,528,530],{"class":529},"sVnqq",":",[304,532,322],{"class":321},[304,534,535],{"class":522},"id",[304,537,530],{"class":529},[304,539,541],{"class":540},"svFNh"," user",[304,543,544],{"class":321},".",[304,546,535],{"class":522},[304,548,329],{"class":321},[304,550,551],{"class":522},"name",[304,553,530],{"class":529},[304,555,541],{"class":540},[304,557,544],{"class":321},[304,559,551],{"class":522},[304,561,562],{"class":321}," } })\n",[304,564,565,568,571,573,575,577,580],{"class":306,"line":417},[304,566,567],{"class":317},"    return",[304,569,570],{"class":357}," sendRedirect",[304,572,431],{"class":321},[304,574,501],{"class":522},[304,576,329],{"class":321},[304,578,579],{"class":434},"'/'",[304,581,438],{"class":321},[304,583,584],{"class":306,"line":441},[304,585,586],{"class":321},"  }\n",[304,588,590],{"class":306,"line":589},8,[304,591,592],{"class":321},"})\n",[295,594,596],{"className":297,"code":595,"language":299,"meta":300,"style":300},"// nuxt-better-auth - Declarative config\n// server/auth.config.ts\nimport { defineServerAuth } from '@onmax/nuxt-better-auth/config'\nexport default defineServerAuth({\n  socialProviders: {\n    github: {\n      clientId: process.env.NUXT_OAUTH_GITHUB_CLIENT_ID!,\n      clientSecret: process.env.NUXT_OAUTH_GITHUB_CLIENT_SECRET!\n    }\n  }\n})\n",[162,597,598,603,608,626,637,647,656,683,704,710,715],{"__ignoreMap":300},[304,599,600],{"class":306,"line":307},[304,601,602],{"class":310},"// nuxt-better-auth - Declarative config\n",[304,604,605],{"class":306,"line":314},[304,606,607],{"class":310},"// server/auth.config.ts\n",[304,609,610,613,615,618,620,623],{"class":306,"line":364},[304,611,612],{"class":317},"import",[304,614,322],{"class":321},[304,616,617],{"class":522},"defineServerAuth",[304,619,350],{"class":321},[304,621,622],{"class":317},"from",[304,624,625],{"class":434}," '@onmax/nuxt-better-auth/config'\n",[304,627,628,630,632,635],{"class":306,"line":371},[304,629,477],{"class":317},[304,631,481],{"class":480},[304,633,634],{"class":357}," defineServerAuth",[304,636,487],{"class":321},[304,638,639,642,644],{"class":306,"line":377},[304,640,641],{"class":522},"  socialProviders",[304,643,530],{"class":529},[304,645,646],{"class":321}," {\n",[304,648,649,652,654],{"class":306,"line":417},[304,650,651],{"class":522},"    github",[304,653,530],{"class":529},[304,655,646],{"class":321},[304,657,658,661,663,666,668,671,673,676,680],{"class":306,"line":441},[304,659,660],{"class":522},"      clientId",[304,662,530],{"class":529},[304,664,665],{"class":540}," process",[304,667,544],{"class":321},[304,669,670],{"class":522},"env",[304,672,544],{"class":321},[304,674,675],{"class":325},"NUXT_OAUTH_GITHUB_CLIENT_ID",[304,677,679],{"class":678},"sn-Jc","!",[304,681,682],{"class":321},",\n",[304,684,685,688,690,692,694,696,698,701],{"class":306,"line":589},[304,686,687],{"class":522},"      clientSecret",[304,689,530],{"class":529},[304,691,665],{"class":540},[304,693,544],{"class":321},[304,695,670],{"class":522},[304,697,544],{"class":321},[304,699,700],{"class":325},"NUXT_OAUTH_GITHUB_CLIENT_SECRET",[304,702,703],{"class":678},"!\n",[304,705,707],{"class":306,"line":706},9,[304,708,709],{"class":321},"    }\n",[304,711,713],{"class":306,"line":712},10,[304,714,586],{"class":321},[304,716,718],{"class":306,"line":717},11,[304,719,592],{"class":321},[203,721,723],{"id":722},"migration-steps","Migration Steps",[725,726,727,731,757,767,771,778,784,788,793,938,943,1059,1069,1078,1082,1086,1193,1197,1281,1285,1291,1399,1405,1578,1581,1585,1589,1667,1671,1742,1745],"steps",{},[272,728,730],{"id":729},"remove-nuxt-auth-utils","Remove nuxt-auth-utils",[295,732,736],{"className":733,"code":734,"language":735,"meta":300,"style":300},"language-bash shiki shiki-themes one-light synthwave-84 synthwave-84","npx nuxi module rm nuxt-auth-utils\n","bash",[162,737,738],{"__ignoreMap":300},[304,739,740,744,748,751,754],{"class":306,"line":307},[304,741,743],{"class":742},"siqUp","npx",[304,745,747],{"class":746},"sI3kV"," nuxi",[304,749,750],{"class":746}," module",[304,752,753],{"class":746}," rm",[304,755,756],{"class":746}," nuxt-auth-utils\n",[158,758,759,760,762,763,766],{},"You can also delete ",[162,761,283],{}," from your ",[162,764,765],{},".env"," file.",[272,768,770],{"id":769},"install-nuxt-better-auth","Install Nuxt Better Auth",[158,772,773,774,777],{},"Follow the ",[170,775,776],{"href":14},"Installation Guide"," to set up the module, environment variables, database, and configuration files.",[187,779,780,781,783],{"to":87,"icon":190},"For OAuth-only apps, ",[182,782,86],{}," stores sessions in JWE cookies similar to nuxt-auth-utils.",[272,785,787],{"id":786},"migrate-oauth-providers","Migrate OAuth Providers",[158,789,790],{},[182,791,792],{},"Before:",[295,794,797],{"className":297,"code":795,"filename":796,"language":299,"meta":300,"style":300},"export default defineOAuthGitHubEventHandler({\n  config: { scope: ['user:email'] },\n  async onSuccess(event, { user }) {\n    await setUserSession(event, {\n      user: { id: user.id, name: user.name, email: user.email }\n    })\n    return sendRedirect(event, '/dashboard')\n  }\n})\n","server/routes/auth/github.get.ts",[162,798,799,809,832,848,861,908,913,930,934],{"__ignoreMap":300},[304,800,801,803,805,807],{"class":306,"line":307},[304,802,477],{"class":317},[304,804,481],{"class":480},[304,806,484],{"class":357},[304,808,487],{"class":321},[304,810,811,814,816,818,821,823,826,829],{"class":306,"line":314},[304,812,813],{"class":522},"  config",[304,815,530],{"class":529},[304,817,322],{"class":321},[304,819,820],{"class":522},"scope",[304,822,530],{"class":529},[304,824,825],{"class":321}," [",[304,827,828],{"class":434},"'user:email'",[304,830,831],{"class":321},"] },\n",[304,833,834,836,838,840,842,844,846],{"class":306,"line":364},[304,835,492],{"class":317},[304,837,495],{"class":357},[304,839,431],{"class":321},[304,841,501],{"class":500},[304,843,504],{"class":321},[304,845,326],{"class":500},[304,847,509],{"class":321},[304,849,850,852,854,856,858],{"class":306,"line":371},[304,851,514],{"class":317},[304,853,517],{"class":357},[304,855,431],{"class":321},[304,857,501],{"class":522},[304,859,860],{"class":321},", {\n",[304,862,863,866,868,870,872,874,876,878,880,882,884,886,888,890,892,894,897,899,901,903,905],{"class":306,"line":377},[304,864,865],{"class":522},"      user",[304,867,530],{"class":529},[304,869,322],{"class":321},[304,871,535],{"class":522},[304,873,530],{"class":529},[304,875,541],{"class":540},[304,877,544],{"class":321},[304,879,535],{"class":522},[304,881,329],{"class":321},[304,883,551],{"class":522},[304,885,530],{"class":529},[304,887,541],{"class":540},[304,889,544],{"class":321},[304,891,551],{"class":522},[304,893,329],{"class":321},[304,895,896],{"class":522},"email",[304,898,530],{"class":529},[304,900,541],{"class":540},[304,902,544],{"class":321},[304,904,896],{"class":522},[304,906,907],{"class":321}," }\n",[304,909,910],{"class":306,"line":417},[304,911,912],{"class":321},"    })\n",[304,914,915,917,919,921,923,925,928],{"class":306,"line":441},[304,916,567],{"class":317},[304,918,570],{"class":357},[304,920,431],{"class":321},[304,922,501],{"class":522},[304,924,329],{"class":321},[304,926,927],{"class":434},"'/dashboard'",[304,929,438],{"class":321},[304,931,932],{"class":306,"line":589},[304,933,586],{"class":321},[304,935,936],{"class":306,"line":706},[304,937,592],{"class":321},[158,939,940],{},[182,941,942],{},"After:",[295,944,947],{"className":297,"code":945,"filename":946,"language":299,"meta":300,"style":300},"import { defineServerAuth } from '@onmax/nuxt-better-auth/config'\n\nexport default defineServerAuth({\n  socialProviders: {\n    github: {\n      clientId: process.env.NUXT_OAUTH_GITHUB_CLIENT_ID!,\n      clientSecret: process.env.NUXT_OAUTH_GITHUB_CLIENT_SECRET!,\n      scope: ['user:email']\n    }\n  }\n})\n","server/auth.config.ts",[162,948,949,963,967,977,985,993,1013,1033,1047,1051,1055],{"__ignoreMap":300},[304,950,951,953,955,957,959,961],{"class":306,"line":307},[304,952,612],{"class":317},[304,954,322],{"class":321},[304,956,617],{"class":522},[304,958,350],{"class":321},[304,960,622],{"class":317},[304,962,625],{"class":434},[304,964,965],{"class":306,"line":314},[304,966,368],{"emptyLinePlaceholder":367},[304,968,969,971,973,975],{"class":306,"line":364},[304,970,477],{"class":317},[304,972,481],{"class":480},[304,974,634],{"class":357},[304,976,487],{"class":321},[304,978,979,981,983],{"class":306,"line":371},[304,980,641],{"class":522},[304,982,530],{"class":529},[304,984,646],{"class":321},[304,986,987,989,991],{"class":306,"line":377},[304,988,651],{"class":522},[304,990,530],{"class":529},[304,992,646],{"class":321},[304,994,995,997,999,1001,1003,1005,1007,1009,1011],{"class":306,"line":417},[304,996,660],{"class":522},[304,998,530],{"class":529},[304,1000,665],{"class":540},[304,1002,544],{"class":321},[304,1004,670],{"class":522},[304,1006,544],{"class":321},[304,1008,675],{"class":325},[304,1010,679],{"class":678},[304,1012,682],{"class":321},[304,1014,1015,1017,1019,1021,1023,1025,1027,1029,1031],{"class":306,"line":441},[304,1016,687],{"class":522},[304,1018,530],{"class":529},[304,1020,665],{"class":540},[304,1022,544],{"class":321},[304,1024,670],{"class":522},[304,1026,544],{"class":321},[304,1028,700],{"class":325},[304,1030,679],{"class":678},[304,1032,682],{"class":321},[304,1034,1035,1038,1040,1042,1044],{"class":306,"line":589},[304,1036,1037],{"class":522},"      scope",[304,1039,530],{"class":529},[304,1041,825],{"class":321},[304,1043,828],{"class":434},[304,1045,1046],{"class":321},"]\n",[304,1048,1049],{"class":306,"line":706},[304,1050,709],{"class":321},[304,1052,1053],{"class":306,"line":712},[304,1054,586],{"class":321},[304,1056,1057],{"class":306,"line":717},[304,1058,592],{"class":321},[158,1060,1061,1062,1065,1066,544],{},"Delete your OAuth route files (",[162,1063,1064],{},"server/routes/auth/*.ts",") - Better Auth handles routes automatically at ",[162,1067,1068],{},"/api/auth/**",[187,1070,1073,1074,1077],{"to":1071,"icon":1072},"https://www.better-auth.com/docs/concepts/oauth","i-lucide-external-link","See ",[182,1075,1076],{},"Better Auth OAuth docs"," for all supported providers and configuration options.",[272,1079,1081],{"id":1080},"update-session-usage","Update Session Usage",[158,1083,1084],{},[182,1085,792],{},[295,1087,1091],{"className":1088,"code":1089,"language":1090,"meta":300,"style":300},"language-vue shiki shiki-themes one-light synthwave-84 synthwave-84","\u003Cscript setup>\nconst { user, loggedIn, fetch, clear } = useUserSession()\n\nasync function logout() {\n  await clear()\n  navigateTo('/login')\n}\n\u003C/script>\n","vue",[162,1092,1093,1110,1139,1143,1157,1167,1179,1184],{"__ignoreMap":300},[304,1094,1095,1099,1103,1107],{"class":306,"line":307},[304,1096,1098],{"class":1097},"sL9le","\u003C",[304,1100,1102],{"class":1101},"stweg","script",[304,1104,1106],{"class":1105},"s0frj"," setup",[304,1108,1109],{"class":1097},">\n",[304,1111,1112,1114,1117,1119,1121,1123,1125,1127,1129,1131,1133,1135,1137],{"class":306,"line":314},[304,1113,318],{"class":317},[304,1115,322],{"class":1116},"sEEOt",[304,1118,326],{"class":325},[304,1120,329],{"class":1116},[304,1122,332],{"class":325},[304,1124,329],{"class":1116},[304,1126,342],{"class":325},[304,1128,329],{"class":1116},[304,1130,347],{"class":325},[304,1132,350],{"class":1116},[304,1134,354],{"class":353},[304,1136,358],{"class":357},[304,1138,361],{"class":1116},[304,1140,1141],{"class":306,"line":364},[304,1142,368],{"emptyLinePlaceholder":367},[304,1144,1145,1148,1151,1154],{"class":306,"line":371},[304,1146,1147],{"class":317},"async",[304,1149,1150],{"class":317}," function",[304,1152,1153],{"class":357}," logout",[304,1155,1156],{"class":1116},"() {\n",[304,1158,1159,1162,1165],{"class":306,"line":377},[304,1160,1161],{"class":317},"  await",[304,1163,1164],{"class":357}," clear",[304,1166,361],{"class":1116},[304,1168,1169,1172,1174,1177],{"class":306,"line":417},[304,1170,1171],{"class":357},"  navigateTo",[304,1173,431],{"class":1116},[304,1175,1176],{"class":434},"'/login'",[304,1178,438],{"class":1116},[304,1180,1181],{"class":306,"line":441},[304,1182,1183],{"class":1116},"}\n",[304,1185,1186,1189,1191],{"class":306,"line":589},[304,1187,1188],{"class":1097},"\u003C/",[304,1190,1102],{"class":1101},[304,1192,1109],{"class":1097},[158,1194,1195],{},[182,1196,942],{},[295,1198,1200],{"className":1088,"code":1199,"language":1090,"meta":300,"style":300},"\u003Cscript setup>\nconst { user, loggedIn, signOut } = useUserSession()\n\nasync function logout() {\n  await signOut()\n  navigateTo('/login')\n}\n\u003C/script>\n",[162,1201,1202,1212,1236,1240,1250,1259,1269,1273],{"__ignoreMap":300},[304,1203,1204,1206,1208,1210],{"class":306,"line":307},[304,1205,1098],{"class":1097},[304,1207,1102],{"class":1101},[304,1209,1106],{"class":1105},[304,1211,1109],{"class":1097},[304,1213,1214,1216,1218,1220,1222,1224,1226,1228,1230,1232,1234],{"class":306,"line":314},[304,1215,318],{"class":317},[304,1217,322],{"class":1116},[304,1219,326],{"class":325},[304,1221,329],{"class":1116},[304,1223,332],{"class":325},[304,1225,329],{"class":1116},[304,1227,401],{"class":325},[304,1229,350],{"class":1116},[304,1231,354],{"class":353},[304,1233,358],{"class":357},[304,1235,361],{"class":1116},[304,1237,1238],{"class":306,"line":364},[304,1239,368],{"emptyLinePlaceholder":367},[304,1241,1242,1244,1246,1248],{"class":306,"line":371},[304,1243,1147],{"class":317},[304,1245,1150],{"class":317},[304,1247,1153],{"class":357},[304,1249,1156],{"class":1116},[304,1251,1252,1254,1257],{"class":306,"line":377},[304,1253,1161],{"class":317},[304,1255,1256],{"class":357}," signOut",[304,1258,361],{"class":1116},[304,1260,1261,1263,1265,1267],{"class":306,"line":417},[304,1262,1171],{"class":357},[304,1264,431],{"class":1116},[304,1266,1176],{"class":434},[304,1268,438],{"class":1116},[304,1270,1271],{"class":306,"line":441},[304,1272,1183],{"class":1116},[304,1274,1275,1277,1279],{"class":306,"line":589},[304,1276,1188],{"class":1097},[304,1278,1102],{"class":1101},[304,1280,1109],{"class":1097},[272,1282,1284],{"id":1283},"migrate-route-protection","Migrate Route Protection",[158,1286,1287,1290],{},[182,1288,1289],{},"Before"," (custom middleware):",[295,1292,1295],{"className":297,"code":1293,"filename":1294,"language":299,"meta":300,"style":300},"export default defineNuxtRouteMiddleware((to) => {\n  const { loggedIn } = useUserSession()\n  if (!loggedIn.value && to.path.startsWith('/app')) {\n    return navigateTo('/login')\n  }\n})\n","middleware/auth.ts",[162,1296,1297,1320,1337,1378,1391,1395],{"__ignoreMap":300},[304,1298,1299,1301,1303,1306,1309,1312,1315,1318],{"class":306,"line":307},[304,1300,477],{"class":317},[304,1302,481],{"class":480},[304,1304,1305],{"class":357}," defineNuxtRouteMiddleware",[304,1307,1308],{"class":321},"((",[304,1310,1311],{"class":500},"to",[304,1313,1314],{"class":321},") ",[304,1316,1317],{"class":317},"=>",[304,1319,646],{"class":321},[304,1321,1322,1325,1327,1329,1331,1333,1335],{"class":306,"line":314},[304,1323,1324],{"class":317},"  const",[304,1326,322],{"class":321},[304,1328,332],{"class":325},[304,1330,350],{"class":321},[304,1332,354],{"class":353},[304,1334,358],{"class":357},[304,1336,361],{"class":321},[304,1338,1339,1342,1345,1347,1349,1351,1354,1357,1360,1362,1365,1367,1370,1372,1375],{"class":306,"line":364},[304,1340,1341],{"class":317},"  if",[304,1343,1344],{"class":321}," (",[304,1346,679],{"class":678},[304,1348,332],{"class":540},[304,1350,544],{"class":321},[304,1352,1353],{"class":522},"value",[304,1355,1356],{"class":678}," &&",[304,1358,1359],{"class":540}," to",[304,1361,544],{"class":321},[304,1363,1364],{"class":522},"path",[304,1366,544],{"class":321},[304,1368,1369],{"class":357},"startsWith",[304,1371,431],{"class":321},[304,1373,1374],{"class":434},"'/app'",[304,1376,1377],{"class":321},")) {\n",[304,1379,1380,1382,1385,1387,1389],{"class":306,"line":371},[304,1381,567],{"class":317},[304,1383,1384],{"class":357}," navigateTo",[304,1386,431],{"class":321},[304,1388,1176],{"class":434},[304,1390,438],{"class":321},[304,1392,1393],{"class":306,"line":377},[304,1394,586],{"class":321},[304,1396,1397],{"class":306,"line":417},[304,1398,592],{"class":321},[158,1400,1401,1404],{},[182,1402,1403],{},"After"," (route rules):",[295,1406,1409],{"className":297,"code":1407,"filename":1408,"language":299,"meta":300,"style":300},"export default defineNuxtConfig({\n  routeRules: {\n    '/app/**': { auth: { only: 'user', redirectTo: '/login' } },\n    '/login': { auth: { only: 'guest', redirectTo: '/app' } },\n    '/admin/**': { auth: { user: { role: 'admin' } } }\n  },\n  auth: {\n    preserveRedirect: true,\n    redirectQueryKey: 'redirect'\n  }\n})\n","nuxt.config.ts",[162,1410,1411,1422,1431,1468,1501,1533,1538,1547,1560,1570,1574],{"__ignoreMap":300},[304,1412,1413,1415,1417,1420],{"class":306,"line":307},[304,1414,477],{"class":317},[304,1416,481],{"class":480},[304,1418,1419],{"class":357}," defineNuxtConfig",[304,1421,487],{"class":321},[304,1423,1424,1427,1429],{"class":306,"line":314},[304,1425,1426],{"class":522},"  routeRules",[304,1428,530],{"class":529},[304,1430,646],{"class":321},[304,1432,1433,1436,1438,1440,1443,1445,1447,1450,1452,1455,1457,1460,1462,1465],{"class":306,"line":364},[304,1434,1435],{"class":434},"    '/app/**'",[304,1437,530],{"class":529},[304,1439,322],{"class":321},[304,1441,1442],{"class":522},"auth",[304,1444,530],{"class":529},[304,1446,322],{"class":321},[304,1448,1449],{"class":522},"only",[304,1451,530],{"class":529},[304,1453,1454],{"class":434}," 'user'",[304,1456,329],{"class":321},[304,1458,1459],{"class":522},"redirectTo",[304,1461,530],{"class":529},[304,1463,1464],{"class":434}," '/login'",[304,1466,1467],{"class":321}," } },\n",[304,1469,1470,1473,1475,1477,1479,1481,1483,1485,1487,1490,1492,1494,1496,1499],{"class":306,"line":371},[304,1471,1472],{"class":434},"    '/login'",[304,1474,530],{"class":529},[304,1476,322],{"class":321},[304,1478,1442],{"class":522},[304,1480,530],{"class":529},[304,1482,322],{"class":321},[304,1484,1449],{"class":522},[304,1486,530],{"class":529},[304,1488,1489],{"class":434}," 'guest'",[304,1491,329],{"class":321},[304,1493,1459],{"class":522},[304,1495,530],{"class":529},[304,1497,1498],{"class":434}," '/app'",[304,1500,1467],{"class":321},[304,1502,1503,1506,1508,1510,1512,1514,1516,1518,1520,1522,1525,1527,1530],{"class":306,"line":377},[304,1504,1505],{"class":434},"    '/admin/**'",[304,1507,530],{"class":529},[304,1509,322],{"class":321},[304,1511,1442],{"class":522},[304,1513,530],{"class":529},[304,1515,322],{"class":321},[304,1517,326],{"class":522},[304,1519,530],{"class":529},[304,1521,322],{"class":321},[304,1523,1524],{"class":522},"role",[304,1526,530],{"class":529},[304,1528,1529],{"class":434}," 'admin'",[304,1531,1532],{"class":321}," } } }\n",[304,1534,1535],{"class":306,"line":417},[304,1536,1537],{"class":321},"  },\n",[304,1539,1540,1543,1545],{"class":306,"line":441},[304,1541,1542],{"class":522},"  auth",[304,1544,530],{"class":529},[304,1546,646],{"class":321},[304,1548,1549,1552,1554,1558],{"class":306,"line":589},[304,1550,1551],{"class":522},"    preserveRedirect",[304,1553,530],{"class":529},[304,1555,1557],{"class":1556},"s3ZNE"," true",[304,1559,682],{"class":321},[304,1561,1562,1565,1567],{"class":306,"line":706},[304,1563,1564],{"class":522},"    redirectQueryKey",[304,1566,530],{"class":529},[304,1568,1569],{"class":434}," 'redirect'\n",[304,1571,1572],{"class":306,"line":712},[304,1573,586],{"class":321},[304,1575,1576],{"class":306,"line":717},[304,1577,592],{"class":321},[158,1579,1580],{},"Delete your custom auth middleware.",[272,1582,1584],{"id":1583},"migrate-api-protection","Migrate API Protection",[158,1586,1587],{},[182,1588,792],{},[295,1590,1593],{"className":297,"code":1591,"filename":1592,"language":299,"meta":300,"style":300},"export default defineEventHandler(async (event) => {\n  const session = await requireUserSession(event)\n  return { userId: session.user.id }\n})\n","server/api/protected.get.ts",[162,1594,1595,1618,1639,1663],{"__ignoreMap":300},[304,1596,1597,1599,1601,1604,1606,1608,1610,1612,1614,1616],{"class":306,"line":307},[304,1598,477],{"class":317},[304,1600,481],{"class":480},[304,1602,1603],{"class":357}," defineEventHandler",[304,1605,431],{"class":321},[304,1607,1147],{"class":317},[304,1609,1344],{"class":321},[304,1611,501],{"class":500},[304,1613,1314],{"class":321},[304,1615,1317],{"class":317},[304,1617,646],{"class":321},[304,1619,1620,1622,1625,1627,1630,1633,1635,1637],{"class":306,"line":314},[304,1621,1324],{"class":317},[304,1623,1624],{"class":325}," session",[304,1626,425],{"class":353},[304,1628,1629],{"class":317}," await",[304,1631,1632],{"class":357}," requireUserSession",[304,1634,431],{"class":321},[304,1636,501],{"class":522},[304,1638,438],{"class":321},[304,1640,1641,1644,1646,1649,1651,1653,1655,1657,1659,1661],{"class":306,"line":364},[304,1642,1643],{"class":317},"  return",[304,1645,322],{"class":321},[304,1647,1648],{"class":522},"userId",[304,1650,530],{"class":529},[304,1652,1624],{"class":540},[304,1654,544],{"class":321},[304,1656,326],{"class":522},[304,1658,544],{"class":321},[304,1660,535],{"class":522},[304,1662,907],{"class":321},[304,1664,1665],{"class":306,"line":371},[304,1666,592],{"class":321},[158,1668,1669],{},[182,1670,942],{},[295,1672,1674],{"className":297,"code":1673,"filename":1592,"language":299,"meta":300,"style":300},"export default defineEventHandler(async (event) => {\n  const { user } = await requireUserSession(event)\n  return { userId: user.id }\n})\n",[162,1675,1676,1698,1720,1738],{"__ignoreMap":300},[304,1677,1678,1680,1682,1684,1686,1688,1690,1692,1694,1696],{"class":306,"line":307},[304,1679,477],{"class":317},[304,1681,481],{"class":480},[304,1683,1603],{"class":357},[304,1685,431],{"class":321},[304,1687,1147],{"class":317},[304,1689,1344],{"class":321},[304,1691,501],{"class":500},[304,1693,1314],{"class":321},[304,1695,1317],{"class":317},[304,1697,646],{"class":321},[304,1699,1700,1702,1704,1706,1708,1710,1712,1714,1716,1718],{"class":306,"line":314},[304,1701,1324],{"class":317},[304,1703,322],{"class":321},[304,1705,326],{"class":325},[304,1707,350],{"class":321},[304,1709,354],{"class":353},[304,1711,1629],{"class":317},[304,1713,1632],{"class":357},[304,1715,431],{"class":321},[304,1717,501],{"class":522},[304,1719,438],{"class":321},[304,1721,1722,1724,1726,1728,1730,1732,1734,1736],{"class":306,"line":364},[304,1723,1643],{"class":317},[304,1725,322],{"class":321},[304,1727,1648],{"class":522},[304,1729,530],{"class":529},[304,1731,541],{"class":540},[304,1733,544],{"class":321},[304,1735,535],{"class":522},[304,1737,907],{"class":321},[304,1739,1740],{"class":306,"line":371},[304,1741,592],{"class":321},[158,1743,1744],{},"With field matching:",[295,1746,1748],{"className":297,"code":1747,"language":299,"meta":300,"style":300},"const { user } = await requireUserSession(event, {\n  user: { role: 'admin' }\n})\n",[162,1749,1750,1772,1789],{"__ignoreMap":300},[304,1751,1752,1754,1756,1758,1760,1762,1764,1766,1768,1770],{"class":306,"line":307},[304,1753,318],{"class":317},[304,1755,322],{"class":321},[304,1757,326],{"class":325},[304,1759,350],{"class":321},[304,1761,354],{"class":353},[304,1763,1629],{"class":317},[304,1765,1632],{"class":357},[304,1767,431],{"class":321},[304,1769,501],{"class":540},[304,1771,860],{"class":321},[304,1773,1774,1777,1779,1781,1783,1785,1787],{"class":306,"line":314},[304,1775,1776],{"class":522},"  user",[304,1778,530],{"class":529},[304,1780,322],{"class":321},[304,1782,1524],{"class":522},[304,1784,530],{"class":529},[304,1786,1529],{"class":434},[304,1788,907],{"class":321},[304,1790,1791],{"class":306,"line":364},[304,1792,592],{"class":321},[203,1794,132],{"id":1795},"api-reference",[208,1797,1798,1810],{},[211,1799,1800],{},[214,1801,1802,1804,1807],{},[217,1803,164],{"align":219},[217,1805,1806],{"align":219},"nuxt-better-auth",[217,1808,1809],{"align":219},"Notes",[224,1811,1812,1826,1841,1856,1869,1886,1901,1916],{},[214,1813,1814,1819,1823],{},[229,1815,1816],{"align":219},[162,1817,1818],{},"useUserSession().user",[229,1820,1821],{"align":219},[162,1822,1818],{},[229,1824,1825],{"align":219},"Now typed from config",[214,1827,1828,1833,1838],{},[229,1829,1830],{"align":219},[162,1831,1832],{},"useUserSession().fetch()",[229,1834,1835],{"align":219},[162,1836,1837],{},"useUserSession().fetchSession()",[229,1839,1840],{"align":219},"Renamed",[214,1842,1843,1848,1853],{},[229,1844,1845],{"align":219},[162,1846,1847],{},"useUserSession().clear()",[229,1849,1850],{"align":219},[162,1851,1852],{},"useUserSession().signOut()",[229,1854,1855],{"align":219},"Renamed + server call",[214,1857,1858,1863,1866],{},[229,1859,1860],{"align":219},[162,1861,1862],{},"setUserSession(event, data)",[229,1864,1865],{"align":219},"N/A",[229,1867,1868],{"align":219},"Handled by Better Auth",[214,1870,1871,1876,1880],{},[229,1872,1873],{"align":219},[162,1874,1875],{},"getUserSession(event)",[229,1877,1878],{"align":219},[162,1879,1875],{},[229,1881,1882,1883],{"align":219},"Returns ",[162,1884,1885],{},"{ user, session }",[214,1887,1888,1893,1898],{},[229,1889,1890],{"align":219},[162,1891,1892],{},"requireUserSession(event)",[229,1894,1895],{"align":219},[162,1896,1897],{},"requireUserSession(event, opts?)",[229,1899,1900],{"align":219},"Supports field matching",[214,1902,1903,1908,1910],{},[229,1904,1905],{"align":219},[162,1906,1907],{},"clearUserSession(event)",[229,1909,1865],{"align":219},[229,1911,1912,1913],{"align":219},"Use client ",[162,1914,1915],{},"signOut()",[214,1917,1918,1923,1929],{},[229,1919,1920],{"align":219},[162,1921,1922],{},"defineOAuth*EventHandler",[229,1924,1925,1928],{"align":219},[162,1926,1927],{},"socialProviders"," config",[229,1930,1931],{"align":219},"Declarative",[203,1933,1935],{"id":1934},"special-cases","Special Cases",[272,1937,1939],{"id":1938},"password-hashing-migration","Password Hashing Migration",[1941,1942,1943,1944,1947,1948,1950],"important",{},"nuxt-auth-utils uses ",[182,1945,1946],{},"scrypt"," for password hashing. Better Auth also uses ",[182,1949,1946],{}," by default (unless you configured a custom password hasher). If you used defaults in both systems, existing password hashes should continue to work.",[1952,1953,1955],"h4",{"id":1954},"step-0-validate-hash-compatibility-recommended","Step 0: Validate Hash Compatibility (Recommended)",[158,1957,1958],{},"Before doing any migration work, validate that a known test user's password hash verifies correctly in a staging environment.",[158,1960,1961,1962,1965],{},"If you used the ",[182,1963,1964],{},"default"," nuxt-auth-utils hashing settings, you can usually keep existing hashes without any migration.",[158,1967,1968],{},"If you customized hashing in nuxt-auth-utils or Better Auth, treat this as a migration and use one of the options below.",[1952,1970,1972],{"id":1971},"option-1-require-password-resets","Option 1: Require Password Resets",[158,1974,1975],{},"The simplest approach: require all users to reset their passwords during migration.",[1977,1978,1979,1987,1990],"ol",{},[1980,1981,1982,1983,1986],"li",{},"Set all user passwords to ",[162,1984,1985],{},"null"," in your database",[1980,1988,1989],{},"Direct users to password reset flow on first login",[1980,1991,1992],{},"New passwords will use Argon2id",[1952,1994,1996],{"id":1995},"option-2-support-both-hash-formats-custom-hashing","Option 2: Support Both Hash Formats (Custom Hashing)",[158,1998,1999],{},"Implement a custom password verifier that tries both formats:",[295,2001,2003],{"className":297,"code":2002,"filename":946,"language":299,"meta":300,"style":300},"import { scrypt, timingSafeEqual } from 'node:crypto'\nimport { defineServerAuth } from '@onmax/nuxt-better-auth/config'\n\nasync function verifyLegacyHash(password: string, hash: string): Promise\u003Cboolean> {\n  // Implement scrypt verification for legacy hashes\n  // Return true if password matches legacy hash\n}\n\nexport default defineServerAuth({\n  // Custom verification logic\n})\n",[162,2004,2005,2025,2039,2043,2090,2095,2100,2104,2108,2118,2123],{"__ignoreMap":300},[304,2006,2007,2009,2011,2013,2015,2018,2020,2022],{"class":306,"line":307},[304,2008,612],{"class":317},[304,2010,322],{"class":321},[304,2012,1946],{"class":522},[304,2014,329],{"class":321},[304,2016,2017],{"class":522},"timingSafeEqual",[304,2019,350],{"class":321},[304,2021,622],{"class":317},[304,2023,2024],{"class":434}," 'node:crypto'\n",[304,2026,2027,2029,2031,2033,2035,2037],{"class":306,"line":314},[304,2028,612],{"class":317},[304,2030,322],{"class":321},[304,2032,617],{"class":522},[304,2034,350],{"class":321},[304,2036,622],{"class":317},[304,2038,625],{"class":434},[304,2040,2041],{"class":306,"line":364},[304,2042,368],{"emptyLinePlaceholder":367},[304,2044,2045,2047,2049,2052,2054,2057,2059,2063,2065,2068,2070,2072,2075,2077,2081,2083,2087],{"class":306,"line":371},[304,2046,1147],{"class":317},[304,2048,1150],{"class":317},[304,2050,2051],{"class":357}," verifyLegacyHash",[304,2053,431],{"class":321},[304,2055,2056],{"class":500},"password",[304,2058,530],{"class":678},[304,2060,2062],{"class":2061},"sr8De"," string",[304,2064,329],{"class":321},[304,2066,2067],{"class":500},"hash",[304,2069,530],{"class":678},[304,2071,2062],{"class":2061},[304,2073,2074],{"class":321},")",[304,2076,530],{"class":678},[304,2078,2080],{"class":2079},"s8RlJ"," Promise",[304,2082,1098],{"class":321},[304,2084,2086],{"class":2085},"sivOE","boolean",[304,2088,2089],{"class":321},"> {\n",[304,2091,2092],{"class":306,"line":377},[304,2093,2094],{"class":310},"  // Implement scrypt verification for legacy hashes\n",[304,2096,2097],{"class":306,"line":417},[304,2098,2099],{"class":310},"  // Return true if password matches legacy hash\n",[304,2101,2102],{"class":306,"line":441},[304,2103,1183],{"class":321},[304,2105,2106],{"class":306,"line":589},[304,2107,368],{"emptyLinePlaceholder":367},[304,2109,2110,2112,2114,2116],{"class":306,"line":706},[304,2111,477],{"class":317},[304,2113,481],{"class":480},[304,2115,634],{"class":357},[304,2117,487],{"class":321},[304,2119,2120],{"class":306,"line":712},[304,2121,2122],{"class":310},"  // Custom verification logic\n",[304,2124,2125],{"class":306,"line":717},[304,2126,592],{"class":321},[1952,2128,2130],{"id":2129},"option-3-gradual-migration-custom-hashing","Option 3: Gradual Migration (Custom Hashing)",[158,2132,2133],{},"Verify with scrypt first, then re-hash with Argon2id on successful login:",[295,2135,2137],{"className":297,"code":2136,"language":299,"meta":300,"style":300},"// On successful legacy verification:\nconst newHash = await hashPassword(password) // Argon2id\nawait updateUserPassword(userId, newHash)\n",[162,2138,2139,2144,2167],{"__ignoreMap":300},[304,2140,2141],{"class":306,"line":307},[304,2142,2143],{"class":310},"// On successful legacy verification:\n",[304,2145,2146,2148,2151,2153,2155,2158,2160,2162,2164],{"class":306,"line":314},[304,2147,318],{"class":317},[304,2149,2150],{"class":325}," newHash",[304,2152,425],{"class":353},[304,2154,1629],{"class":317},[304,2156,2157],{"class":357}," hashPassword",[304,2159,431],{"class":321},[304,2161,2056],{"class":540},[304,2163,1314],{"class":321},[304,2165,2166],{"class":310},"// Argon2id\n",[304,2168,2169,2172,2175,2177,2179,2181,2184],{"class":306,"line":364},[304,2170,2171],{"class":317},"await",[304,2173,2174],{"class":357}," updateUserPassword",[304,2176,431],{"class":321},[304,2178,1648],{"class":540},[304,2180,329],{"class":321},[304,2182,2183],{"class":540},"newHash",[304,2185,438],{"class":321},[272,2187,2189],{"id":2188},"webauthn-migration","WebAuthn Migration",[158,2191,2192],{},"If you used WebAuthn with nuxt-auth-utils:",[1977,2194,2195,2198,2201],{},[1980,2196,2197],{},"Export your WebAuthn credentials from the old format",[1980,2199,2200],{},"Install the Better Auth WebAuthn plugin",[1980,2202,2203],{},"Import credentials to the new schema",[187,2205,2208],{"to":2206,":external":2207},"https://www.better-auth.com/docs/plugins/webauthn","true","See Better Auth WebAuthn documentation for schema requirements.",[272,2210,2212],{"id":2211},"data-migration","Data Migration",[158,2214,2215,2216,329,2218,2220,2221,2224],{},"Better Auth creates ",[162,2217,326],{},[162,2219,388],{},", and ",[162,2222,2223],{},"account"," tables. After setup, run schema generation:",[187,2226,1073,2228,2231],{"to":34,"icon":2227},"i-lucide-arrow-right",[182,2229,2230],{},"Schema Generation"," to set up database tables.",[203,2233,2235],{"id":2234},"troubleshooting","Troubleshooting",[272,2237,2239],{"id":2238},"sessions-not-persisting","Sessions not persisting",[158,2241,2242,2243,2246],{},"Ensure ",[162,2244,2245],{},"NUXT_BETTER_AUTH_SECRET"," is set and database is configured.",[272,2248,2250],{"id":2249},"oauth-redirect-errors","OAuth redirect errors",[158,2252,2253,2254,544],{},"Auto-detected on Vercel/Cloudflare/Netlify. For other platforms, set ",[162,2255,2256],{},"NUXT_PUBLIC_SITE_URL",[272,2258,2260],{"id":2259},"type-errors-on-user-fields","Type errors on user fields",[158,2262,2263,2264,544],{},"Run type augmentation - see ",[170,2265,28],{"href":29},[2267,2268,2269],"style",{},"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 .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 .sPAZv, html code.shiki .sPAZv{--shiki-light:#50A14F;--shiki-default:#FF8B39;--shiki-dark:#FF8B39}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 .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 .sn-Jc, html code.shiki .sn-Jc{--shiki-light:#0184BC;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .siqUp, html code.shiki .siqUp{--shiki-light:#4078F2;--shiki-default:#FE4450;--shiki-dark:#FE4450}html pre.shiki code .sI3kV, html code.shiki .sI3kV{--shiki-light:#50A14F;--shiki-default:#BBBBBB;--shiki-dark:#BBBBBB}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 .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 .sr8De, html code.shiki .sr8De{--shiki-light:#0184BC;--shiki-default:#FE4450;--shiki-dark:#FE4450}html pre.shiki code .s8RlJ, html code.shiki .s8RlJ{--shiki-light:#C18401;--shiki-default:#FE4450;--shiki-dark:#FE4450}html pre.shiki code .sivOE, html code.shiki .sivOE{--shiki-light:#383A42;--shiki-default:#FE4450;--shiki-dark:#FE4450}",{"title":300,"searchDepth":314,"depth":314,"links":2271},[2272,2273,2278,2286,2287,2292],{"id":205,"depth":314,"text":206},{"id":269,"depth":314,"text":270,"children":2274},[2275,2276,2277],{"id":274,"depth":364,"text":275},{"id":292,"depth":364,"text":293},{"id":456,"depth":364,"text":457},{"id":722,"depth":314,"text":723,"children":2279},[2280,2281,2282,2283,2284,2285],{"id":729,"depth":364,"text":730},{"id":769,"depth":364,"text":770},{"id":786,"depth":364,"text":787},{"id":1080,"depth":364,"text":1081},{"id":1283,"depth":364,"text":1284},{"id":1583,"depth":364,"text":1584},{"id":1795,"depth":314,"text":132},{"id":1934,"depth":314,"text":1935,"children":2288},[2289,2290,2291],{"id":1938,"depth":364,"text":1939},{"id":2188,"depth":364,"text":2189},{"id":2211,"depth":364,"text":2212},{"id":2234,"depth":314,"text":2235,"children":2293},[2294,2295,2296],{"id":2238,"depth":364,"text":2239},{"id":2249,"depth":364,"text":2250},{"id":2259,"depth":364,"text":2260},"Step-by-step guide to migrate from nuxt-auth-utils to Nuxt Better Auth.","md",null,{},{"title":95,"description":2297},"BcbU3GLFCu4uS_OaCxIA8VNpR7DgJGAN1WCQPz565_c",[2304,2306],{"title":90,"path":91,"stem":92,"description":2305,"icon":93,"children":-1},"Use nuxt-better-auth with a separate Better Auth server.",{"title":99,"path":100,"stem":101,"description":2307,"children":-1},"Enable two-factor auth using the Better Auth two-factor plugin.",1778075465083]