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