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