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