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