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