[{"data":1,"prerenderedAt":1906},["ShallowReactive",2],{"navigation_docs":3,"-guides-two-factor-auth":152,"-guides-two-factor-auth-surround":1901},[4,42,68,110,131],{"title":5,"path":6,"stem":7,"children":8,"icon":11},"Getting Started","/getting-started","1.getting-started/0.index",[9,12,17,22,27,32,37],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-sparkles",{"title":13,"path":14,"stem":15,"icon":16},"Installation","/getting-started/installation","1.getting-started/1.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Configuration","/getting-started/configuration","1.getting-started/2.configuration","i-lucide-settings",{"title":23,"path":24,"stem":25,"icon":26},"Client Setup","/getting-started/client-setup","1.getting-started/3.client-setup","i-lucide-monitor",{"title":28,"path":29,"stem":30,"icon":31},"Type Augmentation","/getting-started/type-augmentation","1.getting-started/4.type-augmentation","i-lucide-type",{"title":33,"path":34,"stem":35,"icon":36},"Schema Generation (NuxtHub)","/getting-started/schema-generation","1.getting-started/5.schema-generation","i-lucide-database",{"title":38,"path":39,"stem":40,"icon":41},"How It Works","/getting-started/how-it-works","1.getting-started/6.how-it-works","i-lucide-workflow",{"title":43,"path":44,"stem":45,"children":46,"page":67},"Core Concepts","/core-concepts","2.core-concepts",[47,51,55,59,63],{"title":48,"path":49,"stem":50},"serverAuth()","/core-concepts/server-auth","2.core-concepts/1.server-auth",{"title":52,"path":53,"stem":54},"Sessions","/core-concepts/sessions","2.core-concepts/2.sessions",{"title":56,"path":57,"stem":58},"Route Protection","/core-concepts/route-protection","2.core-concepts/3.route-protection",{"title":60,"path":61,"stem":62},"Auto‑Imports and Aliases","/core-concepts/auto-imports-aliases","2.core-concepts/4.auto-imports-aliases",{"title":64,"path":65,"stem":66},"Security & Caveats","/core-concepts/security-caveats","2.core-concepts/5.security-caveats",false,{"title":69,"path":70,"stem":71,"children":72,"page":67},"Guides","/guides","3.guides",[73,77,81,85,89,94,98,102,106],{"title":74,"path":75,"stem":76},"Role‑Based Access","/guides/role-based-access","3.guides/1.role-based-access",{"title":78,"path":79,"stem":80},"OAuth Providers","/guides/oauth-providers","3.guides/2.oauth-providers",{"title":82,"path":83,"stem":84},"Custom Database","/guides/custom-database","3.guides/3.custom-database",{"title":86,"path":87,"stem":88},"Database-less Mode","/guides/database-less-mode","3.guides/4.database-less-mode",{"title":90,"path":91,"stem":92,"icon":93},"External Auth Backend","/guides/external-auth-backend","3.guides/5.external-auth-backend","i-lucide-server",{"title":95,"path":96,"stem":97},"Migrating from nuxt-auth-utils","/guides/migrate-from-nuxt-auth-utils","3.guides/6.migrate-from-nuxt-auth-utils",{"title":99,"path":100,"stem":101},"Two-Factor Authentication (TOTP + Backup Codes)","/guides/two-factor-auth","3.guides/7.two-factor-auth",{"title":103,"path":104,"stem":105},"Testing","/guides/testing","3.guides/8.testing",{"title":107,"path":108,"stem":109},"Production Deployment","/guides/production-deployment","3.guides/9.production-deployment",{"title":111,"path":112,"stem":113,"children":114,"page":67},"Integrations","/integrations","4.integrations",[115,119,123,127],{"title":116,"path":117,"stem":118},"NuxtHub","/integrations/nuxthub","4.integrations/1.nuxthub",{"title":120,"path":121,"stem":122},"DevTools","/integrations/devtools","4.integrations/2.devtools",{"title":124,"path":125,"stem":126},"Convex","/integrations/convex","4.integrations/3.convex",{"title":128,"path":129,"stem":130},"i18n","/integrations/i18n","4.integrations/4.i18n",{"title":132,"path":133,"stem":134,"children":135,"page":67},"API Reference","/api","5.api",[136,140,144,148],{"title":137,"path":138,"stem":139},"Composables","/api/composables","5.api/1.composables",{"title":141,"path":142,"stem":143},"Server Utilities","/api/server-utils","5.api/2.server-utils",{"title":145,"path":146,"stem":147},"Components","/api/components","5.api/3.components",{"title":149,"path":150,"stem":151},"Types","/api/types","5.api/4.types",{"id":153,"title":99,"body":154,"description":1895,"extension":1896,"links":1897,"meta":1898,"navigation":235,"path":100,"seo":1899,"stem":101,"__hash__":1900},"docs/3.guides/7.two-factor-auth.md",{"type":155,"value":156,"toc":1883},"minimark",[157,161,169,1575,1580,1584,1587,1695,1699,1702,1873,1879],[158,159,160],"p",{},"Use this guide when you already have a database-backed auth setup and want to add TOTP with backup codes.",[158,162,163,164,168],{},"Better Auth ships a ",[165,166,167],"code",{},"twoFactor"," plugin with TOTP, OTP, and backup codes. It requires a database-backed setup (e.g., NuxtHub).",[170,171,172,177,342,346,469,473,1224,1228,1231,1251,1254,1449,1453,1467,1516,1519,1545,1549],"steps",{},[173,174,176],"h3",{"id":175},"enable-the-plugin-server","Enable the Plugin (Server)",[178,179,185],"pre",{"className":180,"code":181,"filename":182,"language":183,"meta":184,"style":184},"language-ts shiki shiki-themes one-light synthwave-84 synthwave-84","import { defineServerAuth } from '@onmax/nuxt-better-auth/config'\nimport { twoFactor } from 'better-auth/plugins/two-factor'\n\nexport default defineServerAuth({\n  emailAndPassword: { enabled: true },\n  plugins: [\n    twoFactor({\n      // Optional: customize issuer shown in authenticator apps\n      totpOptions: { issuer: 'My Nuxt App' },\n    }),\n  ],\n})\n","server/auth.config.ts","ts","",[165,186,187,214,230,237,254,278,289,297,304,324,330,336],{"__ignoreMap":184},[188,189,192,196,200,204,207,210],"span",{"class":190,"line":191},"line",1,[188,193,195],{"class":194},"sqe1H","import",[188,197,199],{"class":198},"s17Py"," { ",[188,201,203],{"class":202},"sYvLG","defineServerAuth",[188,205,206],{"class":198}," } ",[188,208,209],{"class":194},"from",[188,211,213],{"class":212},"sPAZv"," '@onmax/nuxt-better-auth/config'\n",[188,215,217,219,221,223,225,227],{"class":190,"line":216},2,[188,218,195],{"class":194},[188,220,199],{"class":198},[188,222,167],{"class":202},[188,224,206],{"class":198},[188,226,209],{"class":194},[188,228,229],{"class":212}," 'better-auth/plugins/two-factor'\n",[188,231,233],{"class":190,"line":232},3,[188,234,236],{"emptyLinePlaceholder":235},true,"\n",[188,238,240,243,247,251],{"class":190,"line":239},4,[188,241,242],{"class":194},"export",[188,244,246],{"class":245},"sKg8T"," default",[188,248,250],{"class":249},"sfT9l"," defineServerAuth",[188,252,253],{"class":198},"({\n",[188,255,257,260,264,266,269,271,275],{"class":190,"line":256},5,[188,258,259],{"class":202},"  emailAndPassword",[188,261,263],{"class":262},"sVnqq",":",[188,265,199],{"class":198},[188,267,268],{"class":202},"enabled",[188,270,263],{"class":262},[188,272,274],{"class":273},"s3ZNE"," true",[188,276,277],{"class":198}," },\n",[188,279,281,284,286],{"class":190,"line":280},6,[188,282,283],{"class":202},"  plugins",[188,285,263],{"class":262},[188,287,288],{"class":198}," [\n",[188,290,292,295],{"class":190,"line":291},7,[188,293,294],{"class":249},"    twoFactor",[188,296,253],{"class":198},[188,298,300],{"class":190,"line":299},8,[188,301,303],{"class":302},"st7cf","      // Optional: customize issuer shown in authenticator apps\n",[188,305,307,310,312,314,317,319,322],{"class":190,"line":306},9,[188,308,309],{"class":202},"      totpOptions",[188,311,263],{"class":262},[188,313,199],{"class":198},[188,315,316],{"class":202},"issuer",[188,318,263],{"class":262},[188,320,321],{"class":212}," 'My Nuxt App'",[188,323,277],{"class":198},[188,325,327],{"class":190,"line":326},10,[188,328,329],{"class":198},"    }),\n",[188,331,333],{"class":190,"line":332},11,[188,334,335],{"class":198},"  ],\n",[188,337,339],{"class":190,"line":338},12,[188,340,341],{"class":198},"})\n",[173,343,345],{"id":344},"register-client-plugin","Register Client Plugin",[178,347,350],{"className":180,"code":348,"filename":349,"language":183,"meta":184,"style":184},"import { navigateTo } from '#imports'\nimport { defineClientAuth } from '@onmax/nuxt-better-auth/config'\nimport { twoFactorClient } from 'better-auth/client/plugins'\n\nexport default defineClientAuth({\n  plugins: [\n    twoFactorClient({\n      onTwoFactorRedirect() {\n        navigateTo('/two-factor')\n      },\n    }),\n  ],\n})\n","app/auth.config.ts",[165,351,352,368,383,399,403,414,422,429,437,451,456,460,464],{"__ignoreMap":184},[188,353,354,356,358,361,363,365],{"class":190,"line":191},[188,355,195],{"class":194},[188,357,199],{"class":198},[188,359,360],{"class":202},"navigateTo",[188,362,206],{"class":198},[188,364,209],{"class":194},[188,366,367],{"class":212}," '#imports'\n",[188,369,370,372,374,377,379,381],{"class":190,"line":216},[188,371,195],{"class":194},[188,373,199],{"class":198},[188,375,376],{"class":202},"defineClientAuth",[188,378,206],{"class":198},[188,380,209],{"class":194},[188,382,213],{"class":212},[188,384,385,387,389,392,394,396],{"class":190,"line":232},[188,386,195],{"class":194},[188,388,199],{"class":198},[188,390,391],{"class":202},"twoFactorClient",[188,393,206],{"class":198},[188,395,209],{"class":194},[188,397,398],{"class":212}," 'better-auth/client/plugins'\n",[188,400,401],{"class":190,"line":239},[188,402,236],{"emptyLinePlaceholder":235},[188,404,405,407,409,412],{"class":190,"line":256},[188,406,242],{"class":194},[188,408,246],{"class":245},[188,410,411],{"class":249}," defineClientAuth",[188,413,253],{"class":198},[188,415,416,418,420],{"class":190,"line":280},[188,417,283],{"class":202},[188,419,263],{"class":262},[188,421,288],{"class":198},[188,423,424,427],{"class":190,"line":291},[188,425,426],{"class":249},"    twoFactorClient",[188,428,253],{"class":198},[188,430,431,434],{"class":190,"line":299},[188,432,433],{"class":249},"      onTwoFactorRedirect",[188,435,436],{"class":198},"() {\n",[188,438,439,442,445,448],{"class":190,"line":306},[188,440,441],{"class":249},"        navigateTo",[188,443,444],{"class":198},"(",[188,446,447],{"class":212},"'/two-factor'",[188,449,450],{"class":198},")\n",[188,452,453],{"class":190,"line":326},[188,454,455],{"class":198},"      },\n",[188,457,458],{"class":190,"line":332},[188,459,329],{"class":198},[188,461,462],{"class":190,"line":338},[188,463,335],{"class":198},[188,465,467],{"class":190,"line":466},13,[188,468,341],{"class":198},[173,470,472],{"id":471},"enable-2fa-for-a-user-totp","Enable 2FA for a User (TOTP)",[178,474,477],{"className":180,"code":475,"filename":476,"language":183,"meta":184,"style":184},"\u003Cscript setup lang=\"ts\">\ndefinePageMeta({ auth: 'user' })\nconst { client } = useUserSession()\nconst password = ref('')\nconst qr = ref\u003Cstring | null>(null)\nconst backupCodes = ref\u003Cstring[] | null>(null)\nconst error = ref('')\n\nasync function enable2fa() {\n  try {\n    const res = await client?.twoFactor.enable({ password: password.value })\n    if (res?.error) {\n      error.value = res.error.message\n      return\n    }\n    qr.value = res?.totpURI || null\n    backupCodes.value = res?.backupCodes || null\n  } catch (e) {\n    error.value = 'Failed to enable 2FA. Please try again.'\n  }\n}\n\u003C/script>\n\n\u003Ctemplate>\n  \u003Cform @submit.prevent=\"enable2fa\">\n    \u003Cinput v-model=\"password\" type=\"password\" placeholder=\"Password\" />\n    \u003Cbutton type=\"submit\">Enable 2FA\u003C/button>\n  \u003C/form>\n\n  \u003Cdiv v-if=\"qr\">\n    \u003Cp>Scan this in your authenticator app:\u003C/p>\n    \u003Cpre>{{ qr }}\u003C/pre>\n  \u003C/div>\n\n  \u003Cdiv v-if=\"backupCodes\">\n    \u003Cp>Backup codes (store securely):\u003C/p>\n    \u003Cul>\n      \u003Cli v-for=\"code in backupCodes\" :key=\"code\">{{ code }}\u003C/li>\n    \u003C/ul>\n  \u003C/div>\n\u003C/template>\n","pages/two-factor.vue",[165,478,479,505,524,545,565,596,625,642,646,659,667,710,729,751,757,763,788,811,827,842,848,854,864,869,880,907,948,981,991,996,1018,1053,1075,1084,1089,1109,1139,1149,1196,1206,1215],{"__ignoreMap":184},[188,480,481,485,489,492,495,499,502],{"class":190,"line":191},[188,482,484],{"class":483},"sn-Jc","\u003C",[188,486,488],{"class":487},"svFNh","script",[188,490,491],{"class":487}," setup",[188,493,494],{"class":487}," lang",[188,496,498],{"class":497},"sQBpM","=",[188,500,501],{"class":212},"\"ts\"",[188,503,504],{"class":483},">\n",[188,506,507,510,513,516,518,521],{"class":190,"line":216},[188,508,509],{"class":249},"definePageMeta",[188,511,512],{"class":198},"({ ",[188,514,515],{"class":202},"auth",[188,517,263],{"class":262},[188,519,520],{"class":212}," 'user'",[188,522,523],{"class":198}," })\n",[188,525,526,529,531,535,537,539,542],{"class":190,"line":232},[188,527,528],{"class":194},"const",[188,530,199],{"class":198},[188,532,534],{"class":533},"s6Rhl","client",[188,536,206],{"class":198},[188,538,498],{"class":497},[188,540,541],{"class":249}," useUserSession",[188,543,544],{"class":198},"()\n",[188,546,547,549,552,555,558,560,563],{"class":190,"line":239},[188,548,528],{"class":194},[188,550,551],{"class":533}," password",[188,553,554],{"class":497}," =",[188,556,557],{"class":249}," ref",[188,559,444],{"class":198},[188,561,562],{"class":212},"''",[188,564,450],{"class":198},[188,566,567,569,572,574,576,578,582,585,588,591,594],{"class":190,"line":256},[188,568,528],{"class":194},[188,570,571],{"class":533}," qr",[188,573,554],{"class":497},[188,575,557],{"class":249},[188,577,484],{"class":198},[188,579,581],{"class":580},"sivOE","string",[188,583,584],{"class":483}," |",[188,586,587],{"class":580}," null",[188,589,590],{"class":198},">(",[188,592,593],{"class":273},"null",[188,595,450],{"class":198},[188,597,598,600,603,605,607,609,611,614,617,619,621,623],{"class":190,"line":280},[188,599,528],{"class":194},[188,601,602],{"class":533}," backupCodes",[188,604,554],{"class":497},[188,606,557],{"class":249},[188,608,484],{"class":198},[188,610,581],{"class":580},[188,612,613],{"class":198},"[] ",[188,615,616],{"class":483},"|",[188,618,587],{"class":580},[188,620,590],{"class":198},[188,622,593],{"class":273},[188,624,450],{"class":198},[188,626,627,629,632,634,636,638,640],{"class":190,"line":291},[188,628,528],{"class":194},[188,630,631],{"class":533}," error",[188,633,554],{"class":497},[188,635,557],{"class":249},[188,637,444],{"class":198},[188,639,562],{"class":212},[188,641,450],{"class":198},[188,643,644],{"class":190,"line":299},[188,645,236],{"emptyLinePlaceholder":235},[188,647,648,651,654,657],{"class":190,"line":306},[188,649,650],{"class":194},"async",[188,652,653],{"class":194}," function",[188,655,656],{"class":249}," enable2fa",[188,658,436],{"class":198},[188,660,661,664],{"class":190,"line":326},[188,662,663],{"class":194},"  try",[188,665,666],{"class":198}," {\n",[188,668,669,672,675,677,680,683,686,688,691,694,696,699,701,703,705,708],{"class":190,"line":332},[188,670,671],{"class":194},"    const",[188,673,674],{"class":533}," res",[188,676,554],{"class":497},[188,678,679],{"class":194}," await",[188,681,682],{"class":487}," client",[188,684,685],{"class":198},"?.",[188,687,167],{"class":202},[188,689,690],{"class":198},".",[188,692,693],{"class":249},"enable",[188,695,512],{"class":198},[188,697,698],{"class":202},"password",[188,700,263],{"class":262},[188,702,551],{"class":487},[188,704,690],{"class":198},[188,706,707],{"class":202},"value",[188,709,523],{"class":198},[188,711,712,715,718,721,723,726],{"class":190,"line":338},[188,713,714],{"class":194},"    if",[188,716,717],{"class":198}," (",[188,719,720],{"class":487},"res",[188,722,685],{"class":198},[188,724,725],{"class":202},"error",[188,727,728],{"class":198},") {\n",[188,730,731,734,736,738,740,742,744,746,748],{"class":190,"line":466},[188,732,733],{"class":487},"      error",[188,735,690],{"class":198},[188,737,707],{"class":202},[188,739,554],{"class":497},[188,741,674],{"class":487},[188,743,690],{"class":198},[188,745,725],{"class":202},[188,747,690],{"class":198},[188,749,750],{"class":202},"message\n",[188,752,754],{"class":190,"line":753},14,[188,755,756],{"class":194},"      return\n",[188,758,760],{"class":190,"line":759},15,[188,761,762],{"class":198},"    }\n",[188,764,766,769,771,773,775,777,779,782,785],{"class":190,"line":765},16,[188,767,768],{"class":487},"    qr",[188,770,690],{"class":198},[188,772,707],{"class":202},[188,774,554],{"class":497},[188,776,674],{"class":487},[188,778,685],{"class":198},[188,780,781],{"class":202},"totpURI",[188,783,784],{"class":483}," ||",[188,786,787],{"class":273}," null\n",[188,789,791,794,796,798,800,802,804,807,809],{"class":190,"line":790},17,[188,792,793],{"class":487},"    backupCodes",[188,795,690],{"class":198},[188,797,707],{"class":202},[188,799,554],{"class":497},[188,801,674],{"class":487},[188,803,685],{"class":198},[188,805,806],{"class":202},"backupCodes",[188,808,784],{"class":483},[188,810,787],{"class":273},[188,812,814,817,820,822,825],{"class":190,"line":813},18,[188,815,816],{"class":198},"  } ",[188,818,819],{"class":194},"catch",[188,821,717],{"class":198},[188,823,824],{"class":487},"e",[188,826,728],{"class":198},[188,828,830,833,835,837,839],{"class":190,"line":829},19,[188,831,832],{"class":487},"    error",[188,834,690],{"class":198},[188,836,707],{"class":202},[188,838,554],{"class":497},[188,840,841],{"class":212}," 'Failed to enable 2FA. Please try again.'\n",[188,843,845],{"class":190,"line":844},20,[188,846,847],{"class":198},"  }\n",[188,849,851],{"class":190,"line":850},21,[188,852,853],{"class":198},"}\n",[188,855,857,860,862],{"class":190,"line":856},22,[188,858,859],{"class":483},"\u003C/",[188,861,488],{"class":487},[188,863,504],{"class":483},[188,865,867],{"class":190,"line":866},23,[188,868,236],{"emptyLinePlaceholder":235},[188,870,872,874,878],{"class":190,"line":871},24,[188,873,484],{"class":198},[188,875,877],{"class":876},"s8RlJ","template",[188,879,504],{"class":198},[188,881,883,886,889,892,895,897,900,902,905],{"class":190,"line":882},25,[188,884,885],{"class":483},"  \u003C",[188,887,888],{"class":487},"form",[188,890,891],{"class":198}," @",[188,893,894],{"class":487},"submit",[188,896,690],{"class":198},[188,898,899],{"class":202},"prevent",[188,901,498],{"class":497},[188,903,904],{"class":212},"\"enable2fa\"",[188,906,504],{"class":483},[188,908,910,913,916,919,922,925,927,930,933,935,937,940,942,945],{"class":190,"line":909},26,[188,911,912],{"class":483},"    \u003C",[188,914,915],{"class":487},"input",[188,917,918],{"class":487}," v",[188,920,921],{"class":483},"-",[188,923,924],{"class":487},"model",[188,926,498],{"class":497},[188,928,929],{"class":212},"\"password\"",[188,931,932],{"class":487}," type",[188,934,498],{"class":497},[188,936,929],{"class":212},[188,938,939],{"class":487}," placeholder",[188,941,498],{"class":497},[188,943,944],{"class":212},"\"Password\"",[188,946,947],{"class":483}," />\n",[188,949,951,953,956,958,960,963,966,969,972,975,977,979],{"class":190,"line":950},27,[188,952,912],{"class":483},[188,954,955],{"class":487},"button",[188,957,932],{"class":487},[188,959,498],{"class":497},[188,961,962],{"class":212},"\"submit\"",[188,964,965],{"class":483},">",[188,967,968],{"class":487},"Enable",[188,970,971],{"class":198}," 2",[188,973,974],{"class":533},"FA",[188,976,859],{"class":483},[188,978,955],{"class":487},[188,980,504],{"class":483},[188,982,984,987,989],{"class":190,"line":983},28,[188,985,986],{"class":483},"  \u003C/",[188,988,888],{"class":487},[188,990,504],{"class":483},[188,992,994],{"class":190,"line":993},29,[188,995,236],{"emptyLinePlaceholder":235},[188,997,999,1001,1004,1006,1008,1011,1013,1016],{"class":190,"line":998},30,[188,1000,885],{"class":483},[188,1002,1003],{"class":487},"div",[188,1005,918],{"class":487},[188,1007,921],{"class":483},[188,1009,1010],{"class":194},"if",[188,1012,498],{"class":497},[188,1014,1015],{"class":212},"\"qr\"",[188,1017,504],{"class":483},[188,1019,1021,1023,1025,1027,1030,1034,1037,1040,1043,1046,1049,1051],{"class":190,"line":1020},31,[188,1022,912],{"class":198},[188,1024,158],{"class":876},[188,1026,965],{"class":198},[188,1028,1029],{"class":487},"Scan",[188,1031,1033],{"class":1032},"sK50a"," this",[188,1035,1036],{"class":194}," in",[188,1038,1039],{"class":487}," your",[188,1041,1042],{"class":487}," authenticator",[188,1044,1045],{"class":580}," app",[188,1047,1048],{"class":198},":\u003C/",[188,1050,158],{"class":876},[188,1052,504],{"class":198},[188,1054,1056,1058,1060,1063,1066,1069,1071,1073],{"class":190,"line":1055},32,[188,1057,912],{"class":198},[188,1059,178],{"class":876},[188,1061,1062],{"class":198},">{{ ",[188,1064,1065],{"class":487},"qr",[188,1067,1068],{"class":198}," }}",[188,1070,859],{"class":483},[188,1072,178],{"class":487},[188,1074,504],{"class":483},[188,1076,1078,1080,1082],{"class":190,"line":1077},33,[188,1079,986],{"class":483},[188,1081,1003],{"class":487},[188,1083,504],{"class":483},[188,1085,1087],{"class":190,"line":1086},34,[188,1088,236],{"emptyLinePlaceholder":235},[188,1090,1092,1094,1096,1098,1100,1102,1104,1107],{"class":190,"line":1091},35,[188,1093,885],{"class":483},[188,1095,1003],{"class":487},[188,1097,918],{"class":487},[188,1099,921],{"class":483},[188,1101,1010],{"class":194},[188,1103,498],{"class":497},[188,1105,1106],{"class":212},"\"backupCodes\"",[188,1108,504],{"class":483},[188,1110,1112,1114,1116,1118,1121,1124,1126,1129,1132,1135,1137],{"class":190,"line":1111},36,[188,1113,912],{"class":198},[188,1115,158],{"class":876},[188,1117,965],{"class":198},[188,1119,1120],{"class":487},"Backup",[188,1122,1123],{"class":249}," codes",[188,1125,717],{"class":198},[188,1127,1128],{"class":487},"store",[188,1130,1131],{"class":487}," securely",[188,1133,1134],{"class":198},"):\u003C/",[188,1136,158],{"class":876},[188,1138,504],{"class":198},[188,1140,1142,1144,1147],{"class":190,"line":1141},37,[188,1143,912],{"class":198},[188,1145,1146],{"class":876},"ul",[188,1148,504],{"class":198},[188,1150,1152,1155,1158,1160,1162,1165,1167,1170,1173,1176,1178,1181,1183,1186,1188,1190,1192,1194],{"class":190,"line":1151},38,[188,1153,1154],{"class":483},"      \u003C",[188,1156,1157],{"class":487},"li",[188,1159,918],{"class":487},[188,1161,921],{"class":483},[188,1163,1164],{"class":487},"for",[188,1166,498],{"class":497},[188,1168,1169],{"class":212},"\"code in backupCodes\"",[188,1171,1172],{"class":198}," :",[188,1174,1175],{"class":487},"key",[188,1177,498],{"class":497},[188,1179,1180],{"class":212},"\"code\"",[188,1182,965],{"class":483},[188,1184,1185],{"class":198},"{{ ",[188,1187,165],{"class":487},[188,1189,1068],{"class":198},[188,1191,859],{"class":483},[188,1193,1157],{"class":487},[188,1195,504],{"class":483},[188,1197,1199,1202,1204],{"class":190,"line":1198},39,[188,1200,1201],{"class":483},"    \u003C/",[188,1203,1146],{"class":487},[188,1205,504],{"class":483},[188,1207,1209,1211,1213],{"class":190,"line":1208},40,[188,1210,986],{"class":483},[188,1212,1003],{"class":487},[188,1214,504],{"class":483},[188,1216,1218,1220,1222],{"class":190,"line":1217},41,[188,1219,859],{"class":483},[188,1221,877],{"class":487},[188,1223,504],{"class":483},[173,1225,1227],{"id":1226},"displaying-the-qr-code","Displaying the QR Code",[158,1229,1230],{},"Install a QR code library:",[178,1232,1236],{"className":1233,"code":1234,"language":1235,"meta":184,"style":184},"language-bash shiki shiki-themes one-light synthwave-84 synthwave-84","pnpm add qrcode\n","bash",[165,1237,1238],{"__ignoreMap":184},[188,1239,1240,1244,1248],{"class":190,"line":191},[188,1241,1243],{"class":1242},"siqUp","pnpm",[188,1245,1247],{"class":1246},"sI3kV"," add",[188,1249,1250],{"class":1246}," qrcode\n",[158,1252,1253],{},"Render the QR code:",[178,1255,1259],{"className":1256,"code":1257,"language":1258,"meta":184,"style":184},"language-vue shiki shiki-themes one-light synthwave-84 synthwave-84","\u003Cscript setup>\nimport QRCode from 'qrcode'\n\nconst qrImage = ref('')\n\nwatch(qr, async (uri) => {\n  if (uri) {\n    qrImage.value = await QRCode.toDataURL(uri)\n  }\n})\n\u003C/script>\n\n\u003Ctemplate>\n  \u003Cimg v-if=\"qrImage\" :src=\"qrImage\" alt=\"Scan with authenticator app\" />\n\u003C/template>\n","vue",[165,1260,1261,1274,1288,1292,1310,1314,1342,1353,1380,1384,1388,1396,1400,1408,1441],{"__ignoreMap":184},[188,1262,1263,1266,1269,1272],{"class":190,"line":191},[188,1264,484],{"class":1265},"sL9le",[188,1267,488],{"class":1268},"stweg",[188,1270,491],{"class":1271},"s0frj",[188,1273,504],{"class":1265},[188,1275,1276,1279,1282,1285],{"class":190,"line":216},[188,1277,195],{"class":1278},"su8fI",[188,1280,1281],{"class":202}," QRCode",[188,1283,1284],{"class":194}," from",[188,1286,1287],{"class":212}," 'qrcode'\n",[188,1289,1290],{"class":190,"line":232},[188,1291,236],{"emptyLinePlaceholder":235},[188,1293,1294,1296,1299,1301,1303,1306,1308],{"class":190,"line":239},[188,1295,528],{"class":194},[188,1297,1298],{"class":533}," qrImage",[188,1300,554],{"class":497},[188,1302,557],{"class":249},[188,1304,444],{"class":1305},"sEEOt",[188,1307,562],{"class":212},[188,1309,450],{"class":1305},[188,1311,1312],{"class":190,"line":256},[188,1313,236],{"emptyLinePlaceholder":235},[188,1315,1316,1319,1321,1323,1326,1328,1330,1334,1337,1340],{"class":190,"line":280},[188,1317,1318],{"class":249},"watch",[188,1320,444],{"class":1305},[188,1322,1065],{"class":487},[188,1324,1325],{"class":1305},", ",[188,1327,650],{"class":194},[188,1329,717],{"class":1305},[188,1331,1333],{"class":1332},"sgisi","uri",[188,1335,1336],{"class":1305},") ",[188,1338,1339],{"class":194},"=>",[188,1341,666],{"class":1305},[188,1343,1344,1347,1349,1351],{"class":190,"line":291},[188,1345,1346],{"class":194},"  if",[188,1348,717],{"class":1305},[188,1350,1333],{"class":487},[188,1352,728],{"class":1305},[188,1354,1355,1358,1360,1363,1365,1367,1369,1371,1374,1376,1378],{"class":190,"line":299},[188,1356,1357],{"class":487},"    qrImage",[188,1359,690],{"class":1305},[188,1361,707],{"class":1362},"smW3M",[188,1364,554],{"class":497},[188,1366,679],{"class":194},[188,1368,1281],{"class":487},[188,1370,690],{"class":1305},[188,1372,1373],{"class":249},"toDataURL",[188,1375,444],{"class":1305},[188,1377,1333],{"class":487},[188,1379,450],{"class":1305},[188,1381,1382],{"class":190,"line":306},[188,1383,847],{"class":1305},[188,1385,1386],{"class":190,"line":326},[188,1387,341],{"class":1305},[188,1389,1390,1392,1394],{"class":190,"line":332},[188,1391,859],{"class":1265},[188,1393,488],{"class":1268},[188,1395,504],{"class":1265},[188,1397,1398],{"class":190,"line":338},[188,1399,236],{"emptyLinePlaceholder":235},[188,1401,1402,1404,1406],{"class":190,"line":466},[188,1403,484],{"class":1265},[188,1405,877],{"class":1268},[188,1407,504],{"class":1265},[188,1409,1410,1412,1415,1418,1421,1424,1427,1429,1431,1434,1436,1439],{"class":190,"line":753},[188,1411,885],{"class":1265},[188,1413,1414],{"class":1268},"img",[188,1416,1417],{"class":1271}," v-if",[188,1419,498],{"class":1420},"sNM9w",[188,1422,1423],{"class":212},"\"qrImage\"",[188,1425,1426],{"class":1271}," :src",[188,1428,498],{"class":1420},[188,1430,1423],{"class":212},[188,1432,1433],{"class":1271}," alt",[188,1435,498],{"class":1420},[188,1437,1438],{"class":212},"\"Scan with authenticator app\"",[188,1440,947],{"class":1265},[188,1442,1443,1445,1447],{"class":190,"line":759},[188,1444,859],{"class":1265},[188,1446,877],{"class":1268},[188,1448,504],{"class":1265},[173,1450,1452],{"id":1451},"trustverify-during-sign-in","Trust/Verify During Sign-In",[158,1454,1455,1456,1458,1459,1462,1463,1466],{},"When a user signs in and 2FA is required, ",[165,1457,391],{}," triggers ",[165,1460,1461],{},"onTwoFactorRedirect",". On your ",[165,1464,1465],{},"/two-factor"," page, prompt for the code and call:",[178,1468,1470],{"className":180,"code":1469,"language":183,"meta":184,"style":184},"await client?.twoFactor.verifyTotp({\n  code,\n  trustDevice: true, // optional\n})\n",[165,1471,1472,1490,1498,1512],{"__ignoreMap":184},[188,1473,1474,1477,1479,1481,1483,1485,1488],{"class":190,"line":191},[188,1475,1476],{"class":194},"await",[188,1478,682],{"class":487},[188,1480,685],{"class":198},[188,1482,167],{"class":202},[188,1484,690],{"class":198},[188,1486,1487],{"class":249},"verifyTotp",[188,1489,253],{"class":198},[188,1491,1492,1495],{"class":190,"line":216},[188,1493,1494],{"class":487},"  code",[188,1496,1497],{"class":198},",\n",[188,1499,1500,1503,1505,1507,1509],{"class":190,"line":232},[188,1501,1502],{"class":202},"  trustDevice",[188,1504,263],{"class":262},[188,1506,274],{"class":273},[188,1508,1325],{"class":198},[188,1510,1511],{"class":302},"// optional\n",[188,1513,1514],{"class":190,"line":239},[188,1515,341],{"class":198},[158,1517,1518],{},"Backup codes can be verified via:",[178,1520,1522],{"className":180,"code":1521,"language":183,"meta":184,"style":184},"await client?.twoFactor.verifyBackupCode({ code })\n",[165,1523,1524],{"__ignoreMap":184},[188,1525,1526,1528,1530,1532,1534,1536,1539,1541,1543],{"class":190,"line":191},[188,1527,1476],{"class":194},[188,1529,682],{"class":487},[188,1531,685],{"class":198},[188,1533,167],{"class":202},[188,1535,690],{"class":198},[188,1537,1538],{"class":249},"verifyBackupCode",[188,1540,512],{"class":198},[188,1542,165],{"class":487},[188,1544,523],{"class":198},[173,1546,1548],{"id":1547},"disable-2fa","Disable 2FA",[178,1550,1552],{"className":180,"code":1551,"language":183,"meta":184,"style":184},"await client?.twoFactor.disable({ password })\n",[165,1553,1554],{"__ignoreMap":184},[188,1555,1556,1558,1560,1562,1564,1566,1569,1571,1573],{"class":190,"line":191},[188,1557,1476],{"class":194},[188,1559,682],{"class":487},[188,1561,685],{"class":198},[188,1563,167],{"class":202},[188,1565,690],{"class":198},[188,1567,1568],{"class":249},"disable",[188,1570,512],{"class":198},[188,1572,698],{"class":487},[188,1574,523],{"class":198},[1576,1577,1579],"h2",{"id":1578},"account-recovery","Account Recovery",[173,1581,1583],{"id":1582},"backup-codes","Backup Codes",[158,1585,1586],{},"Display backup codes to users during 2FA setup. Each code can only be used once.",[178,1588,1590],{"className":1256,"code":1589,"language":1258,"meta":184,"style":184},"\u003Ctemplate>\n  \u003Cdiv v-if=\"backupCodes.length\">\n    \u003Cp>Save these backup codes in a secure location:\u003C/p>\n    \u003Cul>\n      \u003Cli v-for=\"code in backupCodes\" :key=\"code\">{{ code }}\u003C/li>\n    \u003C/ul>\n  \u003C/div>\n\u003C/template>\n",[165,1591,1592,1600,1615,1632,1640,1671,1679,1687],{"__ignoreMap":184},[188,1593,1594,1596,1598],{"class":190,"line":191},[188,1595,484],{"class":1265},[188,1597,877],{"class":1268},[188,1599,504],{"class":1265},[188,1601,1602,1604,1606,1608,1610,1613],{"class":190,"line":216},[188,1603,885],{"class":1265},[188,1605,1003],{"class":1268},[188,1607,1417],{"class":1271},[188,1609,498],{"class":1420},[188,1611,1612],{"class":212},"\"backupCodes.length\"",[188,1614,504],{"class":1265},[188,1616,1617,1619,1621,1623,1626,1628,1630],{"class":190,"line":232},[188,1618,912],{"class":1265},[188,1620,158],{"class":1268},[188,1622,965],{"class":1265},[188,1624,1625],{"class":1305},"Save these backup codes in a secure location:",[188,1627,859],{"class":1265},[188,1629,158],{"class":1268},[188,1631,504],{"class":1265},[188,1633,1634,1636,1638],{"class":190,"line":239},[188,1635,912],{"class":1265},[188,1637,1146],{"class":1268},[188,1639,504],{"class":1265},[188,1641,1642,1644,1646,1649,1651,1653,1656,1658,1660,1662,1665,1667,1669],{"class":190,"line":256},[188,1643,1154],{"class":1265},[188,1645,1157],{"class":1268},[188,1647,1648],{"class":1271}," v-for",[188,1650,498],{"class":1420},[188,1652,1169],{"class":212},[188,1654,1655],{"class":1271}," :key",[188,1657,498],{"class":1420},[188,1659,1180],{"class":212},[188,1661,965],{"class":1265},[188,1663,1664],{"class":1305},"{{ code }}",[188,1666,859],{"class":1265},[188,1668,1157],{"class":1268},[188,1670,504],{"class":1265},[188,1672,1673,1675,1677],{"class":190,"line":280},[188,1674,1201],{"class":1265},[188,1676,1146],{"class":1268},[188,1678,504],{"class":1265},[188,1680,1681,1683,1685],{"class":190,"line":291},[188,1682,986],{"class":1265},[188,1684,1003],{"class":1268},[188,1686,504],{"class":1265},[188,1688,1689,1691,1693],{"class":190,"line":299},[188,1690,859],{"class":1265},[188,1692,877],{"class":1268},[188,1694,504],{"class":1265},[173,1696,1698],{"id":1697},"admin-recovery","Admin Recovery",[158,1700,1701],{},"For users who lose their device and backup codes, implement an admin recovery flow:",[178,1703,1706],{"className":180,"code":1704,"filename":1705,"language":183,"meta":184,"style":184},"export default defineEventHandler(async (event) => {\n  await requireUserSession(event, { user: { role: 'admin' } })\n\n  const { userId } = await readBody(event)\n  const auth = serverAuth(event)\n\n  // Reset 2FA for user (requires admin plugin)\n  await auth.api.admin.disableTwoFactor({ userId })\n\n  return { success: true }\n})\n","server/api/admin/reset-2fa.ts",[165,1707,1708,1732,1765,1769,1794,1812,1816,1821,1848,1852,1869],{"__ignoreMap":184},[188,1709,1710,1712,1714,1717,1719,1721,1723,1726,1728,1730],{"class":190,"line":191},[188,1711,242],{"class":194},[188,1713,246],{"class":245},[188,1715,1716],{"class":249}," defineEventHandler",[188,1718,444],{"class":198},[188,1720,650],{"class":194},[188,1722,717],{"class":198},[188,1724,1725],{"class":1332},"event",[188,1727,1336],{"class":198},[188,1729,1339],{"class":194},[188,1731,666],{"class":198},[188,1733,1734,1737,1740,1742,1744,1747,1750,1752,1754,1757,1759,1762],{"class":190,"line":216},[188,1735,1736],{"class":194},"  await",[188,1738,1739],{"class":249}," requireUserSession",[188,1741,444],{"class":198},[188,1743,1725],{"class":202},[188,1745,1746],{"class":198},", { ",[188,1748,1749],{"class":202},"user",[188,1751,263],{"class":262},[188,1753,199],{"class":198},[188,1755,1756],{"class":202},"role",[188,1758,263],{"class":262},[188,1760,1761],{"class":212}," 'admin'",[188,1763,1764],{"class":198}," } })\n",[188,1766,1767],{"class":190,"line":232},[188,1768,236],{"emptyLinePlaceholder":235},[188,1770,1771,1774,1776,1779,1781,1783,1785,1788,1790,1792],{"class":190,"line":239},[188,1772,1773],{"class":194},"  const",[188,1775,199],{"class":198},[188,1777,1778],{"class":533},"userId",[188,1780,206],{"class":198},[188,1782,498],{"class":497},[188,1784,679],{"class":194},[188,1786,1787],{"class":249}," readBody",[188,1789,444],{"class":198},[188,1791,1725],{"class":202},[188,1793,450],{"class":198},[188,1795,1796,1798,1801,1803,1806,1808,1810],{"class":190,"line":256},[188,1797,1773],{"class":194},[188,1799,1800],{"class":533}," auth",[188,1802,554],{"class":497},[188,1804,1805],{"class":249}," serverAuth",[188,1807,444],{"class":198},[188,1809,1725],{"class":202},[188,1811,450],{"class":198},[188,1813,1814],{"class":190,"line":280},[188,1815,236],{"emptyLinePlaceholder":235},[188,1817,1818],{"class":190,"line":291},[188,1819,1820],{"class":302},"  // Reset 2FA for user (requires admin plugin)\n",[188,1822,1823,1825,1827,1829,1832,1834,1837,1839,1842,1844,1846],{"class":190,"line":299},[188,1824,1736],{"class":194},[188,1826,1800],{"class":487},[188,1828,690],{"class":198},[188,1830,1831],{"class":202},"api",[188,1833,690],{"class":198},[188,1835,1836],{"class":202},"admin",[188,1838,690],{"class":198},[188,1840,1841],{"class":249},"disableTwoFactor",[188,1843,512],{"class":198},[188,1845,1778],{"class":202},[188,1847,523],{"class":198},[188,1849,1850],{"class":190,"line":306},[188,1851,236],{"emptyLinePlaceholder":235},[188,1853,1854,1857,1859,1862,1864,1866],{"class":190,"line":326},[188,1855,1856],{"class":194},"  return",[188,1858,199],{"class":198},[188,1860,1861],{"class":202},"success",[188,1863,263],{"class":262},[188,1865,274],{"class":273},[188,1867,1868],{"class":198}," }\n",[188,1870,1871],{"class":190,"line":332},[188,1872,341],{"class":198},[1874,1875,1878],"callout",{"icon":1876,"to":1877},"i-lucide-link","https://better-auth.com/docs/plugins/2fa","See the Better Auth 2FA docs for provider options and OTP flows.",[1880,1881,1882],"style",{},"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 .sYvLG, html code.shiki .sYvLG{--shiki-light:#E45649;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .sPAZv, html code.shiki .sPAZv{--shiki-light:#50A14F;--shiki-default:#FF8B39;--shiki-dark:#FF8B39}html pre.shiki code .sKg8T, html code.shiki .sKg8T{--shiki-light:#E45649;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .sfT9l, html code.shiki .sfT9l{--shiki-light:#4078F2;--shiki-default:#36F9F6;--shiki-dark:#36F9F6}html pre.shiki code .sVnqq, html code.shiki .sVnqq{--shiki-light:#0184BC;--shiki-default:#B6B1B1;--shiki-dark:#B6B1B1}html pre.shiki code .s3ZNE, html code.shiki .s3ZNE{--shiki-light:#986801;--shiki-default:#F97E72;--shiki-dark:#F97E72}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 .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 .sn-Jc, html code.shiki .sn-Jc{--shiki-light:#0184BC;--shiki-default:#FEDE5D;--shiki-dark:#FEDE5D}html pre.shiki code .svFNh, html code.shiki .svFNh{--shiki-light:#383A42;--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 .s6Rhl, html code.shiki .s6Rhl{--shiki-light:#986801;--shiki-default:#FF7EDB;--shiki-dark:#FF7EDB}html pre.shiki code .sivOE, html code.shiki .sivOE{--shiki-light:#383A42;--shiki-default:#FE4450;--shiki-dark:#FE4450}html pre.shiki code .s8RlJ, html code.shiki .s8RlJ{--shiki-light:#C18401;--shiki-default:#FE4450;--shiki-dark:#FE4450}html pre.shiki code .sK50a, html code.shiki .sK50a{--shiki-light:#E45649;--shiki-light-font-weight:inherit;--shiki-default:#FE4450;--shiki-default-font-weight:bold;--shiki-dark:#FE4450;--shiki-dark-font-weight:bold}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 .su8fI, html code.shiki .su8fI{--shiki-light:#A626A4;--shiki-default:#72F1B8;--shiki-dark:#72F1B8}html pre.shiki code .sEEOt, html code.shiki .sEEOt{--shiki-light:#383A42;--shiki-default:#FFFFFFEE;--shiki-dark:#FFFFFFEE}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 .smW3M, html code.shiki .smW3M{--shiki-light:#E45649;--shiki-default:#2EE2FA;--shiki-dark:#2EE2FA}html pre.shiki code .sNM9w, html code.shiki .sNM9w{--shiki-light:#383A42;--shiki-default:#B6B1B1;--shiki-dark:#B6B1B1}",{"title":184,"searchDepth":216,"depth":216,"links":1884},[1885,1886,1887,1888,1889,1890,1891],{"id":175,"depth":232,"text":176},{"id":344,"depth":232,"text":345},{"id":471,"depth":232,"text":472},{"id":1226,"depth":232,"text":1227},{"id":1451,"depth":232,"text":1452},{"id":1547,"depth":232,"text":1548},{"id":1578,"depth":216,"text":1579,"children":1892},[1893,1894],{"id":1582,"depth":232,"text":1583},{"id":1697,"depth":232,"text":1698},"Enable two-factor auth using the Better Auth two-factor plugin.","md",null,{},{"title":99,"description":1895},"-YwqsSgpBpIkQyC5MHPOSbCnsu6_vPpTl2TK8Hh8bHc",[1902,1904],{"title":95,"path":96,"stem":97,"description":1903,"children":-1},"Step-by-step guide to migrate from nuxt-auth-utils to Nuxt Better Auth.",{"title":103,"path":104,"stem":105,"description":1905,"children":-1},"Mock authentication in tests.",1777451672840]