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