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