[{"data":1,"prerenderedAt":6417},["ShallowReactive",2],{"navigation":3,"\u002Fpassport\u002Ftwo-factor":170,"\u002Fpassport\u002Ftwo-factor-surround":6412},[4,18,43,75,103,120,134],{"title":5,"path":6,"stem":7,"children":8,"icon":17},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,12],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-simple-icons-laravel",{"title":13,"path":14,"stem":15,"icon":16},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",false,{"title":19,"path":20,"stem":21,"children":22,"page":17},"Sanctum","\u002Fsanctum","2.sanctum",[23,28,33,38],{"title":24,"path":25,"stem":26,"icon":27},"Configuration","\u002Fsanctum\u002Fconfiguration","2.sanctum\u002F1.configuration","i-lucide-cog",{"title":29,"path":30,"stem":31,"icon":32},"Cookie Authentication","\u002Fsanctum\u002Fcookie","2.sanctum\u002F2.cookie","i-lucide-cookie",{"title":34,"path":35,"stem":36,"icon":37},"Sanctum 2FA Flow","\u002Fsanctum\u002Ftwo-factor","2.sanctum\u002F3.two-factor","i-lucide-shield-check",{"title":39,"path":40,"stem":41,"icon":42},"Server Proxy","\u002Fsanctum\u002Fproxy","2.sanctum\u002F4.proxy","i-lucide-waypoints",{"title":44,"path":45,"stem":46,"children":47,"page":17},"Passport","\u002Fpassport","3.passport",[48,51,56,61,66,70],{"title":24,"path":49,"stem":50,"icon":27},"\u002Fpassport\u002Fconfiguration","3.passport\u002F1.configuration",{"title":52,"path":53,"stem":54,"icon":55},"Login & Logout","\u002Fpassport\u002Flogin-logout","3.passport\u002F2.login-logout","i-lucide-log-in",{"title":57,"path":58,"stem":59,"icon":60},"Token Management","\u002Fpassport\u002Ftokens","3.passport\u002F3.tokens","i-lucide-key",{"title":62,"path":63,"stem":64,"icon":65},"Two-Factor Authentication","\u002Fpassport\u002Ftwo-factor","3.passport\u002F4.two-factor","i-lucide-shield",{"title":67,"path":68,"stem":69,"icon":37},"Middleware & Route Protection","\u002Fpassport\u002Fmiddleware","3.passport\u002F5.middleware",{"title":71,"path":72,"stem":73,"icon":74},"Examples & Use Cases","\u002Fpassport\u002Fexamples","3.passport\u002F6.examples","i-lucide-code",{"title":76,"path":77,"stem":78,"children":79,"page":17},"Composables","\u002Fcomposables","4.composables",[80,84,89,94,99],{"title":76,"path":81,"stem":82,"icon":83},"\u002Fcomposables\u002Fcomposables","4.composables\u002F1.composables","i-lucide-code-2",{"title":85,"path":86,"stem":87,"icon":88},"$autx","\u002Fcomposables\u002Fautx","4.composables\u002F2.autx","i-lucide-globe",{"title":90,"path":91,"stem":92,"icon":93},"useAuthConfig","\u002Fcomposables\u002Fuse-auth-config","4.composables\u002F3.use-auth-config","i-lucide-settings",{"title":95,"path":96,"stem":97,"icon":98},"useAuthStore","\u002Fcomposables\u002Fuse-auth-store","4.composables\u002F4.use-auth-store","i-lucide-database",{"title":100,"path":101,"stem":102,"icon":37},"useEnsureCsrf","\u002Fcomposables\u002Fuse-ensure-csrf","4.composables\u002F5.use-ensure-csrf",{"title":104,"path":105,"stem":106,"children":107,"page":17},"Middleware","\u002Fmiddleware","5.middleware",[108,111,116],{"title":104,"path":109,"stem":110,"icon":37},"\u002Fmiddleware\u002Fmiddleware","5.middleware\u002F1.middleware",{"title":112,"path":113,"stem":114,"icon":115},"auth","\u002Fmiddleware\u002Fauth","5.middleware\u002F2.auth","i-lucide-lock",{"title":117,"path":118,"stem":119,"icon":65},"two-factor","\u002Fmiddleware\u002Ftwo-factor","5.middleware\u002F3.two-factor",{"title":121,"path":122,"stem":123,"children":124,"page":17},"Hooks","\u002Fhooks","6.hooks",[125,129],{"title":121,"path":126,"stem":127,"icon":128},"\u002Fhooks\u002Fhooks","6.hooks\u002F1.hooks","i-lucide-webhook",{"title":130,"path":131,"stem":132,"icon":133},"prepare:types","\u002Fhooks\u002Fprepare-types","6.hooks\u002F2.prepare-types","i-lucide-file-code",{"title":135,"path":136,"stem":137,"children":138,"page":17},"Advanced","\u002Fadvanced","7.advanced",[139,143,148,152,156,161,165],{"title":135,"path":140,"stem":141,"icon":142},"\u002Fadvanced\u002Fadvanced","7.advanced\u002F1.advanced","i-lucide-settings-2",{"title":144,"path":145,"stem":146,"icon":147},"Custom Configuration","\u002Fadvanced\u002Fcustom-configuration","7.advanced\u002F2.custom-configuration","i-lucide-sliders",{"title":149,"path":150,"stem":151,"icon":32},"Cookie Configuration","\u002Fadvanced\u002Fcookie-configuration","7.advanced\u002F3.cookie-configuration",{"title":153,"path":154,"stem":155,"icon":133},"TypeScript Integration","\u002Fadvanced\u002Ftypescript-integration","7.advanced\u002F4.typescript-integration",{"title":157,"path":158,"stem":159,"icon":160},"Module Aliases","\u002Fadvanced\u002Fmodule-aliases","7.advanced\u002F5.module-aliases","i-lucide-square-library",{"title":162,"path":163,"stem":164,"icon":37},"Security Features","\u002Fadvanced\u002Fsecurity-features","7.advanced\u002F6.security-features",{"title":166,"path":167,"stem":168,"icon":169},"Runtime Configuration","\u002Fadvanced\u002Fruntime-configuration","7.advanced\u002F7.runtime-configuration","i-lucide-server",{"id":171,"title":62,"body":172,"description":6405,"extension":6406,"links":6407,"meta":6408,"navigation":6409,"path":63,"seo":6410,"stem":64,"__hash__":6411},"docs\u002F3.passport\u002F4.two-factor.md",{"type":173,"value":174,"toc":6377},"minimark",[175,179,182,187,190,194,197,456,460,465,1598,1602,1606,2013,2017,2906,2910,2914,3160,3164,3515,3519,3523,3530,4329,4343,4347,4588,4592,4596,4754,4758,5083,5087,5296,5300,5304,5370,5374,6360,6362,6373],[176,177,178],"p",{},"Learn how to implement secure two-factor authentication (2FA) using Laravel Passport with Nuxt Umbu.",[180,181],"hr",{},[183,184,186],"h2",{"id":185},"overview","Overview",[176,188,189],{},"Two-factor authentication adds an extra layer of security by requiring users to provide a second form of verification beyond their password. Nuxt Umbu provides built-in support for 2FA flows with Laravel Passport.",[183,191,193],{"id":192},"_2fa-configuration","2FA Configuration",[176,195,196],{},"Configure 2FA endpoints in your Nuxt configuration:",[198,199,205],"pre",{"className":200,"code":201,"filename":202,"language":203,"meta":204,"style":204},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  auth: {\n    provider: 'passport',\n    strategies: {\n      client: {\n        endpoints: {\n          twoFactor: {\n            url: '\u002Fapi\u002Fsend-token-2fa',\n            method: 'POST',\n            alias: '2fa-token',\n            property: 'access_token',  \u002F\u002F Token property name\n            expires: 'expires_in',     \u002F\u002F Expiration property name\n            headerName: '2fa'          \u002F\u002F Header name for 2FA token\n          }\n        }\n      }\n    }\n  }\n})\n","nuxt.config.ts","typescript","",[206,207,208,232,245,266,276,286,296,306,323,340,357,379,399,417,423,429,435,441,447],"code",{"__ignoreMap":204},[209,210,213,217,220,224,228],"span",{"class":211,"line":212},"line",1,[209,214,216],{"class":215},"s7zQu","export",[209,218,219],{"class":215}," default",[209,221,223],{"class":222},"s2Zo4"," defineNuxtConfig",[209,225,227],{"class":226},"sTEyZ","(",[209,229,231],{"class":230},"sMK4o","{\n",[209,233,235,239,242],{"class":211,"line":234},2,[209,236,238],{"class":237},"swJcz","  auth",[209,240,241],{"class":230},":",[209,243,244],{"class":230}," {\n",[209,246,248,251,253,256,260,263],{"class":211,"line":247},3,[209,249,250],{"class":237},"    provider",[209,252,241],{"class":230},[209,254,255],{"class":230}," '",[209,257,259],{"class":258},"sfazB","passport",[209,261,262],{"class":230},"'",[209,264,265],{"class":230},",\n",[209,267,269,272,274],{"class":211,"line":268},4,[209,270,271],{"class":237},"    strategies",[209,273,241],{"class":230},[209,275,244],{"class":230},[209,277,279,282,284],{"class":211,"line":278},5,[209,280,281],{"class":237},"      client",[209,283,241],{"class":230},[209,285,244],{"class":230},[209,287,289,292,294],{"class":211,"line":288},6,[209,290,291],{"class":237},"        endpoints",[209,293,241],{"class":230},[209,295,244],{"class":230},[209,297,299,302,304],{"class":211,"line":298},7,[209,300,301],{"class":237},"          twoFactor",[209,303,241],{"class":230},[209,305,244],{"class":230},[209,307,309,312,314,316,319,321],{"class":211,"line":308},8,[209,310,311],{"class":237},"            url",[209,313,241],{"class":230},[209,315,255],{"class":230},[209,317,318],{"class":258},"\u002Fapi\u002Fsend-token-2fa",[209,320,262],{"class":230},[209,322,265],{"class":230},[209,324,326,329,331,333,336,338],{"class":211,"line":325},9,[209,327,328],{"class":237},"            method",[209,330,241],{"class":230},[209,332,255],{"class":230},[209,334,335],{"class":258},"POST",[209,337,262],{"class":230},[209,339,265],{"class":230},[209,341,343,346,348,350,353,355],{"class":211,"line":342},10,[209,344,345],{"class":237},"            alias",[209,347,241],{"class":230},[209,349,255],{"class":230},[209,351,352],{"class":258},"2fa-token",[209,354,262],{"class":230},[209,356,265],{"class":230},[209,358,360,363,365,367,370,372,375],{"class":211,"line":359},11,[209,361,362],{"class":237},"            property",[209,364,241],{"class":230},[209,366,255],{"class":230},[209,368,369],{"class":258},"access_token",[209,371,262],{"class":230},[209,373,374],{"class":230},",",[209,376,378],{"class":377},"sHwdD","  \u002F\u002F Token property name\n",[209,380,382,385,387,389,392,394,396],{"class":211,"line":381},12,[209,383,384],{"class":237},"            expires",[209,386,241],{"class":230},[209,388,255],{"class":230},[209,390,391],{"class":258},"expires_in",[209,393,262],{"class":230},[209,395,374],{"class":230},[209,397,398],{"class":377},"     \u002F\u002F Expiration property name\n",[209,400,402,405,407,409,412,414],{"class":211,"line":401},13,[209,403,404],{"class":237},"            headerName",[209,406,241],{"class":230},[209,408,255],{"class":230},[209,410,411],{"class":258},"2fa",[209,413,262],{"class":230},[209,415,416],{"class":377},"          \u002F\u002F Header name for 2FA token\n",[209,418,420],{"class":211,"line":419},14,[209,421,422],{"class":230},"          }\n",[209,424,426],{"class":211,"line":425},15,[209,427,428],{"class":230},"        }\n",[209,430,432],{"class":211,"line":431},16,[209,433,434],{"class":230},"      }\n",[209,436,438],{"class":211,"line":437},17,[209,439,440],{"class":230},"    }\n",[209,442,444],{"class":211,"line":443},18,[209,445,446],{"class":230},"  }\n",[209,448,450,453],{"class":211,"line":449},19,[209,451,452],{"class":230},"}",[209,454,455],{"class":226},")\n",[183,457,459],{"id":458},"basic-2fa-implementation","Basic 2FA Implementation",[461,462,464],"h3",{"id":463},"login-with-2fa","Login with 2FA",[198,466,470],{"className":467,"code":468,"language":469,"meta":204,"style":204},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Ctemplate>\n  \u003Cform @submit.prevent=\"handleLogin\">\n    \u003C!-- Regular login fields -->\n    \u003Cdiv>\n      \u003Clabel for=\"email\">Email\u003C\u002Flabel>\n      \u003Cinput id=\"email\" v-model=\"credentials.email\" type=\"email\" required \u002F>\n    \u003C\u002Fdiv>\n    \n    \u003Cdiv>\n      \u003Clabel for=\"password\">Password\u003C\u002Flabel>\n      \u003Cinput id=\"password\" v-model=\"credentials.password\" type=\"password\" required \u002F>\n    \u003C\u002Fdiv>\n    \n    \u003Cbutton type=\"submit\" :disabled=\"loading\">\n      {{ loading ? 'Signing in...' : 'Sign In' }}\n    \u003C\u002Fbutton>\n  \u003C\u002Fform>\n  \n  \u003C!-- 2FA Modal -->\n  \u003Cdiv v-if=\"show2FAModal\" class=\"modal\">\n    \u003Ch3>Enter 2FA Code\u003C\u002Fh3>\n    \u003Cform @submit.prevent=\"handle2FA\">\n      \u003Cinput \n        v-model=\"twoFactorCode\" \n        type=\"text\" \n        placeholder=\"Enter 6-digit code\"\n        maxlength=\"6\"\n        required \n      \u002F>\n      \u003Cbutton type=\"submit\" :disabled=\"twoFactorLoading\">\n        Verify\n      \u003C\u002Fbutton>\n    \u003C\u002Fform>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nconst { loginWith, twoFactor } = useAuth()\n\nconst credentials = ref({\n  email: '',\n  password: ''\n})\n\nconst show2FAModal = ref(false)\nconst twoFactorCode = ref('')\nconst loading = ref(false)\nconst twoFactorLoading = ref(false)\n\nconst handleLogin = async () => {\n  try {\n    loading.value = true\n    await loginWith('client', credentials.value)\n    \u002F\u002F Login successful\n  } catch (error) {\n    if (error.statusCode === 423) {\n      \u002F\u002F 2FA required\n      show2FAModal.value = true\n    } else {\n      console.error('Login failed:', error)\n    }\n  } finally {\n    loading.value = false\n  }\n}\n\nconst handle2FA = async () => {\n  try {\n    twoFactorLoading.value = true\n    await twoFactor('client', twoFactorCode.value)\n    show2FAModal.value = false\n    twoFactorCode.value = ''\n    \u002F\u002F 2FA successful, user is now fully authenticated\n  } catch (error) {\n    console.error('2FA failed:', error)\n  } finally {\n    twoFactorLoading.value = false\n  }\n}\n\u003C\u002Fscript>\n","vue",[206,471,472,483,508,513,523,556,603,612,617,625,653,694,702,706,738,743,751,760,765,770,803,821,841,851,868,885,901,916,924,930,960,966,976,985,994,1003,1010,1023,1051,1056,1073,1086,1097,1104,1109,1129,1148,1166,1184,1189,1210,1218,1235,1263,1269,1289,1315,1321,1335,1346,1372,1377,1387,1401,1406,1412,1417,1435,1442,1456,1483,1497,1511,1517,1532,1557,1566,1579,1584,1589],{"__ignoreMap":204},[209,473,474,477,480],{"class":211,"line":212},[209,475,476],{"class":230},"\u003C",[209,478,479],{"class":237},"template",[209,481,482],{"class":230},">\n",[209,484,485,488,491,495,498,501,504,506],{"class":211,"line":234},[209,486,487],{"class":230},"  \u003C",[209,489,490],{"class":237},"form",[209,492,494],{"class":493},"spNyl"," @submit.prevent",[209,496,497],{"class":230},"=",[209,499,500],{"class":230},"\"",[209,502,503],{"class":258},"handleLogin",[209,505,500],{"class":230},[209,507,482],{"class":230},[209,509,510],{"class":211,"line":247},[209,511,512],{"class":377},"    \u003C!-- Regular login fields -->\n",[209,514,515,518,521],{"class":211,"line":268},[209,516,517],{"class":230},"    \u003C",[209,519,520],{"class":237},"div",[209,522,482],{"class":230},[209,524,525,528,531,534,536,538,541,543,546,549,552,554],{"class":211,"line":278},[209,526,527],{"class":230},"      \u003C",[209,529,530],{"class":237},"label",[209,532,533],{"class":493}," for",[209,535,497],{"class":230},[209,537,500],{"class":230},[209,539,540],{"class":258},"email",[209,542,500],{"class":230},[209,544,545],{"class":230},">",[209,547,548],{"class":226},"Email",[209,550,551],{"class":230},"\u003C\u002F",[209,553,530],{"class":237},[209,555,482],{"class":230},[209,557,558,560,563,566,568,570,572,574,577,579,581,584,586,589,591,593,595,597,600],{"class":211,"line":288},[209,559,527],{"class":230},[209,561,562],{"class":237},"input",[209,564,565],{"class":493}," id",[209,567,497],{"class":230},[209,569,500],{"class":230},[209,571,540],{"class":258},[209,573,500],{"class":230},[209,575,576],{"class":493}," v-model",[209,578,497],{"class":230},[209,580,500],{"class":230},[209,582,583],{"class":258},"credentials.email",[209,585,500],{"class":230},[209,587,588],{"class":493}," type",[209,590,497],{"class":230},[209,592,500],{"class":230},[209,594,540],{"class":258},[209,596,500],{"class":230},[209,598,599],{"class":493}," required",[209,601,602],{"class":230}," \u002F>\n",[209,604,605,608,610],{"class":211,"line":298},[209,606,607],{"class":230},"    \u003C\u002F",[209,609,520],{"class":237},[209,611,482],{"class":230},[209,613,614],{"class":211,"line":308},[209,615,616],{"class":226},"    \n",[209,618,619,621,623],{"class":211,"line":325},[209,620,517],{"class":230},[209,622,520],{"class":237},[209,624,482],{"class":230},[209,626,627,629,631,633,635,637,640,642,644,647,649,651],{"class":211,"line":342},[209,628,527],{"class":230},[209,630,530],{"class":237},[209,632,533],{"class":493},[209,634,497],{"class":230},[209,636,500],{"class":230},[209,638,639],{"class":258},"password",[209,641,500],{"class":230},[209,643,545],{"class":230},[209,645,646],{"class":226},"Password",[209,648,551],{"class":230},[209,650,530],{"class":237},[209,652,482],{"class":230},[209,654,655,657,659,661,663,665,667,669,671,673,675,678,680,682,684,686,688,690,692],{"class":211,"line":359},[209,656,527],{"class":230},[209,658,562],{"class":237},[209,660,565],{"class":493},[209,662,497],{"class":230},[209,664,500],{"class":230},[209,666,639],{"class":258},[209,668,500],{"class":230},[209,670,576],{"class":493},[209,672,497],{"class":230},[209,674,500],{"class":230},[209,676,677],{"class":258},"credentials.password",[209,679,500],{"class":230},[209,681,588],{"class":493},[209,683,497],{"class":230},[209,685,500],{"class":230},[209,687,639],{"class":258},[209,689,500],{"class":230},[209,691,599],{"class":493},[209,693,602],{"class":230},[209,695,696,698,700],{"class":211,"line":381},[209,697,607],{"class":230},[209,699,520],{"class":237},[209,701,482],{"class":230},[209,703,704],{"class":211,"line":401},[209,705,616],{"class":226},[209,707,708,710,713,715,717,719,722,724,727,729,731,734,736],{"class":211,"line":419},[209,709,517],{"class":230},[209,711,712],{"class":237},"button",[209,714,588],{"class":493},[209,716,497],{"class":230},[209,718,500],{"class":230},[209,720,721],{"class":258},"submit",[209,723,500],{"class":230},[209,725,726],{"class":493}," :disabled",[209,728,497],{"class":230},[209,730,500],{"class":230},[209,732,733],{"class":258},"loading",[209,735,500],{"class":230},[209,737,482],{"class":230},[209,739,740],{"class":211,"line":425},[209,741,742],{"class":226},"      {{ loading ? 'Signing in...' : 'Sign In' }}\n",[209,744,745,747,749],{"class":211,"line":431},[209,746,607],{"class":230},[209,748,712],{"class":237},[209,750,482],{"class":230},[209,752,753,756,758],{"class":211,"line":437},[209,754,755],{"class":230},"  \u003C\u002F",[209,757,490],{"class":237},[209,759,482],{"class":230},[209,761,762],{"class":211,"line":443},[209,763,764],{"class":226},"  \n",[209,766,767],{"class":211,"line":449},[209,768,769],{"class":377},"  \u003C!-- 2FA Modal -->\n",[209,771,773,775,777,780,782,784,787,789,792,794,796,799,801],{"class":211,"line":772},20,[209,774,487],{"class":230},[209,776,520],{"class":237},[209,778,779],{"class":493}," v-if",[209,781,497],{"class":230},[209,783,500],{"class":230},[209,785,786],{"class":258},"show2FAModal",[209,788,500],{"class":230},[209,790,791],{"class":493}," class",[209,793,497],{"class":230},[209,795,500],{"class":230},[209,797,798],{"class":258},"modal",[209,800,500],{"class":230},[209,802,482],{"class":230},[209,804,806,808,810,812,815,817,819],{"class":211,"line":805},21,[209,807,517],{"class":230},[209,809,461],{"class":237},[209,811,545],{"class":230},[209,813,814],{"class":226},"Enter 2FA Code",[209,816,551],{"class":230},[209,818,461],{"class":237},[209,820,482],{"class":230},[209,822,824,826,828,830,832,834,837,839],{"class":211,"line":823},22,[209,825,517],{"class":230},[209,827,490],{"class":237},[209,829,494],{"class":493},[209,831,497],{"class":230},[209,833,500],{"class":230},[209,835,836],{"class":258},"handle2FA",[209,838,500],{"class":230},[209,840,482],{"class":230},[209,842,844,846,848],{"class":211,"line":843},23,[209,845,527],{"class":230},[209,847,562],{"class":237},[209,849,850],{"class":230}," \n",[209,852,854,857,859,861,864,866],{"class":211,"line":853},24,[209,855,856],{"class":493},"        v-model",[209,858,497],{"class":230},[209,860,500],{"class":230},[209,862,863],{"class":258},"twoFactorCode",[209,865,500],{"class":230},[209,867,850],{"class":230},[209,869,871,874,876,878,881,883],{"class":211,"line":870},25,[209,872,873],{"class":493},"        type",[209,875,497],{"class":230},[209,877,500],{"class":230},[209,879,880],{"class":258},"text",[209,882,500],{"class":230},[209,884,850],{"class":230},[209,886,888,891,893,895,898],{"class":211,"line":887},26,[209,889,890],{"class":493},"        placeholder",[209,892,497],{"class":230},[209,894,500],{"class":230},[209,896,897],{"class":258},"Enter 6-digit code",[209,899,900],{"class":230},"\"\n",[209,902,904,907,909,911,914],{"class":211,"line":903},27,[209,905,906],{"class":493},"        maxlength",[209,908,497],{"class":230},[209,910,500],{"class":230},[209,912,913],{"class":258},"6",[209,915,900],{"class":230},[209,917,919,922],{"class":211,"line":918},28,[209,920,921],{"class":493},"        required",[209,923,850],{"class":230},[209,925,927],{"class":211,"line":926},29,[209,928,929],{"class":230},"      \u002F>\n",[209,931,933,935,937,939,941,943,945,947,949,951,953,956,958],{"class":211,"line":932},30,[209,934,527],{"class":230},[209,936,712],{"class":237},[209,938,588],{"class":493},[209,940,497],{"class":230},[209,942,500],{"class":230},[209,944,721],{"class":258},[209,946,500],{"class":230},[209,948,726],{"class":493},[209,950,497],{"class":230},[209,952,500],{"class":230},[209,954,955],{"class":258},"twoFactorLoading",[209,957,500],{"class":230},[209,959,482],{"class":230},[209,961,963],{"class":211,"line":962},31,[209,964,965],{"class":226},"        Verify\n",[209,967,969,972,974],{"class":211,"line":968},32,[209,970,971],{"class":230},"      \u003C\u002F",[209,973,712],{"class":237},[209,975,482],{"class":230},[209,977,979,981,983],{"class":211,"line":978},33,[209,980,607],{"class":230},[209,982,490],{"class":237},[209,984,482],{"class":230},[209,986,988,990,992],{"class":211,"line":987},34,[209,989,755],{"class":230},[209,991,520],{"class":237},[209,993,482],{"class":230},[209,995,997,999,1001],{"class":211,"line":996},35,[209,998,551],{"class":230},[209,1000,479],{"class":237},[209,1002,482],{"class":230},[209,1004,1006],{"class":211,"line":1005},36,[209,1007,1009],{"emptyLinePlaceholder":1008},true,"\n",[209,1011,1013,1015,1018,1021],{"class":211,"line":1012},37,[209,1014,476],{"class":230},[209,1016,1017],{"class":237},"script",[209,1019,1020],{"class":493}," setup",[209,1022,482],{"class":230},[209,1024,1026,1029,1032,1035,1037,1040,1042,1045,1048],{"class":211,"line":1025},38,[209,1027,1028],{"class":493},"const",[209,1030,1031],{"class":230}," {",[209,1033,1034],{"class":226}," loginWith",[209,1036,374],{"class":230},[209,1038,1039],{"class":226}," twoFactor ",[209,1041,452],{"class":230},[209,1043,1044],{"class":230}," =",[209,1046,1047],{"class":222}," useAuth",[209,1049,1050],{"class":226},"()\n",[209,1052,1054],{"class":211,"line":1053},39,[209,1055,1009],{"emptyLinePlaceholder":1008},[209,1057,1059,1061,1064,1066,1069,1071],{"class":211,"line":1058},40,[209,1060,1028],{"class":493},[209,1062,1063],{"class":226}," credentials ",[209,1065,497],{"class":230},[209,1067,1068],{"class":222}," ref",[209,1070,227],{"class":226},[209,1072,231],{"class":230},[209,1074,1076,1079,1081,1084],{"class":211,"line":1075},41,[209,1077,1078],{"class":237},"  email",[209,1080,241],{"class":230},[209,1082,1083],{"class":230}," ''",[209,1085,265],{"class":230},[209,1087,1089,1092,1094],{"class":211,"line":1088},42,[209,1090,1091],{"class":237},"  password",[209,1093,241],{"class":230},[209,1095,1096],{"class":230}," ''\n",[209,1098,1100,1102],{"class":211,"line":1099},43,[209,1101,452],{"class":230},[209,1103,455],{"class":226},[209,1105,1107],{"class":211,"line":1106},44,[209,1108,1009],{"emptyLinePlaceholder":1008},[209,1110,1112,1114,1117,1119,1121,1123,1127],{"class":211,"line":1111},45,[209,1113,1028],{"class":493},[209,1115,1116],{"class":226}," show2FAModal ",[209,1118,497],{"class":230},[209,1120,1068],{"class":222},[209,1122,227],{"class":226},[209,1124,1126],{"class":1125},"sfNiH","false",[209,1128,455],{"class":226},[209,1130,1132,1134,1137,1139,1141,1143,1146],{"class":211,"line":1131},46,[209,1133,1028],{"class":493},[209,1135,1136],{"class":226}," twoFactorCode ",[209,1138,497],{"class":230},[209,1140,1068],{"class":222},[209,1142,227],{"class":226},[209,1144,1145],{"class":230},"''",[209,1147,455],{"class":226},[209,1149,1151,1153,1156,1158,1160,1162,1164],{"class":211,"line":1150},47,[209,1152,1028],{"class":493},[209,1154,1155],{"class":226}," loading ",[209,1157,497],{"class":230},[209,1159,1068],{"class":222},[209,1161,227],{"class":226},[209,1163,1126],{"class":1125},[209,1165,455],{"class":226},[209,1167,1169,1171,1174,1176,1178,1180,1182],{"class":211,"line":1168},48,[209,1170,1028],{"class":493},[209,1172,1173],{"class":226}," twoFactorLoading ",[209,1175,497],{"class":230},[209,1177,1068],{"class":222},[209,1179,227],{"class":226},[209,1181,1126],{"class":1125},[209,1183,455],{"class":226},[209,1185,1187],{"class":211,"line":1186},49,[209,1188,1009],{"emptyLinePlaceholder":1008},[209,1190,1192,1194,1197,1199,1202,1205,1208],{"class":211,"line":1191},50,[209,1193,1028],{"class":493},[209,1195,1196],{"class":226}," handleLogin ",[209,1198,497],{"class":230},[209,1200,1201],{"class":493}," async",[209,1203,1204],{"class":230}," ()",[209,1206,1207],{"class":493}," =>",[209,1209,244],{"class":230},[209,1211,1213,1216],{"class":211,"line":1212},51,[209,1214,1215],{"class":215},"  try",[209,1217,244],{"class":230},[209,1219,1221,1224,1227,1230,1232],{"class":211,"line":1220},52,[209,1222,1223],{"class":226},"    loading",[209,1225,1226],{"class":230},".",[209,1228,1229],{"class":226},"value",[209,1231,1044],{"class":230},[209,1233,1234],{"class":1125}," true\n",[209,1236,1238,1241,1243,1245,1247,1250,1252,1254,1257,1259,1261],{"class":211,"line":1237},53,[209,1239,1240],{"class":215},"    await",[209,1242,1034],{"class":222},[209,1244,227],{"class":237},[209,1246,262],{"class":230},[209,1248,1249],{"class":258},"client",[209,1251,262],{"class":230},[209,1253,374],{"class":230},[209,1255,1256],{"class":226}," credentials",[209,1258,1226],{"class":230},[209,1260,1229],{"class":226},[209,1262,455],{"class":237},[209,1264,1266],{"class":211,"line":1265},54,[209,1267,1268],{"class":377},"    \u002F\u002F Login successful\n",[209,1270,1272,1275,1278,1281,1284,1287],{"class":211,"line":1271},55,[209,1273,1274],{"class":230},"  }",[209,1276,1277],{"class":215}," catch",[209,1279,1280],{"class":237}," (",[209,1282,1283],{"class":226},"error",[209,1285,1286],{"class":237},") ",[209,1288,231],{"class":230},[209,1290,1292,1295,1297,1299,1301,1304,1307,1311,1313],{"class":211,"line":1291},56,[209,1293,1294],{"class":215},"    if",[209,1296,1280],{"class":237},[209,1298,1283],{"class":226},[209,1300,1226],{"class":230},[209,1302,1303],{"class":226},"statusCode",[209,1305,1306],{"class":230}," ===",[209,1308,1310],{"class":1309},"sbssI"," 423",[209,1312,1286],{"class":237},[209,1314,231],{"class":230},[209,1316,1318],{"class":211,"line":1317},57,[209,1319,1320],{"class":377},"      \u002F\u002F 2FA required\n",[209,1322,1324,1327,1329,1331,1333],{"class":211,"line":1323},58,[209,1325,1326],{"class":226},"      show2FAModal",[209,1328,1226],{"class":230},[209,1330,1229],{"class":226},[209,1332,1044],{"class":230},[209,1334,1234],{"class":1125},[209,1336,1338,1341,1344],{"class":211,"line":1337},59,[209,1339,1340],{"class":230},"    }",[209,1342,1343],{"class":215}," else",[209,1345,244],{"class":230},[209,1347,1349,1352,1354,1356,1358,1360,1363,1365,1367,1370],{"class":211,"line":1348},60,[209,1350,1351],{"class":226},"      console",[209,1353,1226],{"class":230},[209,1355,1283],{"class":222},[209,1357,227],{"class":237},[209,1359,262],{"class":230},[209,1361,1362],{"class":258},"Login failed:",[209,1364,262],{"class":230},[209,1366,374],{"class":230},[209,1368,1369],{"class":226}," error",[209,1371,455],{"class":237},[209,1373,1375],{"class":211,"line":1374},61,[209,1376,440],{"class":230},[209,1378,1380,1382,1385],{"class":211,"line":1379},62,[209,1381,1274],{"class":230},[209,1383,1384],{"class":215}," finally",[209,1386,244],{"class":230},[209,1388,1390,1392,1394,1396,1398],{"class":211,"line":1389},63,[209,1391,1223],{"class":226},[209,1393,1226],{"class":230},[209,1395,1229],{"class":226},[209,1397,1044],{"class":230},[209,1399,1400],{"class":1125}," false\n",[209,1402,1404],{"class":211,"line":1403},64,[209,1405,446],{"class":230},[209,1407,1409],{"class":211,"line":1408},65,[209,1410,1411],{"class":230},"}\n",[209,1413,1415],{"class":211,"line":1414},66,[209,1416,1009],{"emptyLinePlaceholder":1008},[209,1418,1420,1422,1425,1427,1429,1431,1433],{"class":211,"line":1419},67,[209,1421,1028],{"class":493},[209,1423,1424],{"class":226}," handle2FA ",[209,1426,497],{"class":230},[209,1428,1201],{"class":493},[209,1430,1204],{"class":230},[209,1432,1207],{"class":493},[209,1434,244],{"class":230},[209,1436,1438,1440],{"class":211,"line":1437},68,[209,1439,1215],{"class":215},[209,1441,244],{"class":230},[209,1443,1445,1448,1450,1452,1454],{"class":211,"line":1444},69,[209,1446,1447],{"class":226},"    twoFactorLoading",[209,1449,1226],{"class":230},[209,1451,1229],{"class":226},[209,1453,1044],{"class":230},[209,1455,1234],{"class":1125},[209,1457,1459,1461,1464,1466,1468,1470,1472,1474,1477,1479,1481],{"class":211,"line":1458},70,[209,1460,1240],{"class":215},[209,1462,1463],{"class":222}," twoFactor",[209,1465,227],{"class":237},[209,1467,262],{"class":230},[209,1469,1249],{"class":258},[209,1471,262],{"class":230},[209,1473,374],{"class":230},[209,1475,1476],{"class":226}," twoFactorCode",[209,1478,1226],{"class":230},[209,1480,1229],{"class":226},[209,1482,455],{"class":237},[209,1484,1486,1489,1491,1493,1495],{"class":211,"line":1485},71,[209,1487,1488],{"class":226},"    show2FAModal",[209,1490,1226],{"class":230},[209,1492,1229],{"class":226},[209,1494,1044],{"class":230},[209,1496,1400],{"class":1125},[209,1498,1500,1503,1505,1507,1509],{"class":211,"line":1499},72,[209,1501,1502],{"class":226},"    twoFactorCode",[209,1504,1226],{"class":230},[209,1506,1229],{"class":226},[209,1508,1044],{"class":230},[209,1510,1096],{"class":230},[209,1512,1514],{"class":211,"line":1513},73,[209,1515,1516],{"class":377},"    \u002F\u002F 2FA successful, user is now fully authenticated\n",[209,1518,1520,1522,1524,1526,1528,1530],{"class":211,"line":1519},74,[209,1521,1274],{"class":230},[209,1523,1277],{"class":215},[209,1525,1280],{"class":237},[209,1527,1283],{"class":226},[209,1529,1286],{"class":237},[209,1531,231],{"class":230},[209,1533,1535,1538,1540,1542,1544,1546,1549,1551,1553,1555],{"class":211,"line":1534},75,[209,1536,1537],{"class":226},"    console",[209,1539,1226],{"class":230},[209,1541,1283],{"class":222},[209,1543,227],{"class":237},[209,1545,262],{"class":230},[209,1547,1548],{"class":258},"2FA failed:",[209,1550,262],{"class":230},[209,1552,374],{"class":230},[209,1554,1369],{"class":226},[209,1556,455],{"class":237},[209,1558,1560,1562,1564],{"class":211,"line":1559},76,[209,1561,1274],{"class":230},[209,1563,1384],{"class":215},[209,1565,244],{"class":230},[209,1567,1569,1571,1573,1575,1577],{"class":211,"line":1568},77,[209,1570,1447],{"class":226},[209,1572,1226],{"class":230},[209,1574,1229],{"class":226},[209,1576,1044],{"class":230},[209,1578,1400],{"class":1125},[209,1580,1582],{"class":211,"line":1581},78,[209,1583,446],{"class":230},[209,1585,1587],{"class":211,"line":1586},79,[209,1588,1411],{"class":230},[209,1590,1592,1594,1596],{"class":211,"line":1591},80,[209,1593,551],{"class":230},[209,1595,1017],{"class":237},[209,1597,482],{"class":230},[183,1599,1601],{"id":1600},"advanced-2fa-flow","Advanced 2FA Flow",[461,1603,1605],{"id":1604},"_2fa-state-management","2FA State Management",[198,1607,1609],{"className":467,"code":1608,"language":469,"meta":204,"style":204},"\u003Cscript setup>\nconst { loggedIn, user, twoFactor, loginWith } = useAuth()\n\nconst authState = ref('login') \u002F\u002F 'login', '2fa', 'authenticated'\nconst twoFactorMethods = ref([]) \u002F\u002F Available 2FA methods\n\nconst handleLogin = async (credentials) => {\n  try {\n    await loginWith('client', credentials)\n    authState.value = 'authenticated'\n  } catch (error) {\n    if (error.statusCode === 423) {\n      authState.value = '2fa'\n      twoFactorMethods.value = error.data?.methods || []\n    } else {\n      throw error\n    }\n  }\n}\n\nconst handle2FA = async (code, method = 'totp') => {\n  try {\n    await twoFactor('client', code)\n    authState.value = 'authenticated'\n  } catch (error) {\n    console.error('2FA verification failed:', error)\n  }\n}\n\u003C\u002Fscript>\n",[206,1610,1611,1621,1652,1656,1681,1698,1702,1725,1731,1751,1770,1784,1804,1821,1851,1859,1867,1871,1875,1879,1883,1917,1923,1944,1960,1974,1997,2001,2005],{"__ignoreMap":204},[209,1612,1613,1615,1617,1619],{"class":211,"line":212},[209,1614,476],{"class":230},[209,1616,1017],{"class":237},[209,1618,1020],{"class":493},[209,1620,482],{"class":230},[209,1622,1623,1625,1627,1630,1632,1635,1637,1639,1641,1644,1646,1648,1650],{"class":211,"line":234},[209,1624,1028],{"class":493},[209,1626,1031],{"class":230},[209,1628,1629],{"class":226}," loggedIn",[209,1631,374],{"class":230},[209,1633,1634],{"class":226}," user",[209,1636,374],{"class":230},[209,1638,1463],{"class":226},[209,1640,374],{"class":230},[209,1642,1643],{"class":226}," loginWith ",[209,1645,452],{"class":230},[209,1647,1044],{"class":230},[209,1649,1047],{"class":222},[209,1651,1050],{"class":226},[209,1653,1654],{"class":211,"line":247},[209,1655,1009],{"emptyLinePlaceholder":1008},[209,1657,1658,1660,1663,1665,1667,1669,1671,1674,1676,1678],{"class":211,"line":268},[209,1659,1028],{"class":493},[209,1661,1662],{"class":226}," authState ",[209,1664,497],{"class":230},[209,1666,1068],{"class":222},[209,1668,227],{"class":226},[209,1670,262],{"class":230},[209,1672,1673],{"class":258},"login",[209,1675,262],{"class":230},[209,1677,1286],{"class":226},[209,1679,1680],{"class":377},"\u002F\u002F 'login', '2fa', 'authenticated'\n",[209,1682,1683,1685,1688,1690,1692,1695],{"class":211,"line":278},[209,1684,1028],{"class":493},[209,1686,1687],{"class":226}," twoFactorMethods ",[209,1689,497],{"class":230},[209,1691,1068],{"class":222},[209,1693,1694],{"class":226},"([]) ",[209,1696,1697],{"class":377},"\u002F\u002F Available 2FA methods\n",[209,1699,1700],{"class":211,"line":288},[209,1701,1009],{"emptyLinePlaceholder":1008},[209,1703,1704,1706,1708,1710,1712,1714,1718,1721,1723],{"class":211,"line":298},[209,1705,1028],{"class":493},[209,1707,1196],{"class":226},[209,1709,497],{"class":230},[209,1711,1201],{"class":493},[209,1713,1280],{"class":230},[209,1715,1717],{"class":1716},"sHdIc","credentials",[209,1719,1720],{"class":230},")",[209,1722,1207],{"class":493},[209,1724,244],{"class":230},[209,1726,1727,1729],{"class":211,"line":308},[209,1728,1215],{"class":215},[209,1730,244],{"class":230},[209,1732,1733,1735,1737,1739,1741,1743,1745,1747,1749],{"class":211,"line":325},[209,1734,1240],{"class":215},[209,1736,1034],{"class":222},[209,1738,227],{"class":237},[209,1740,262],{"class":230},[209,1742,1249],{"class":258},[209,1744,262],{"class":230},[209,1746,374],{"class":230},[209,1748,1256],{"class":226},[209,1750,455],{"class":237},[209,1752,1753,1756,1758,1760,1762,1764,1767],{"class":211,"line":342},[209,1754,1755],{"class":226},"    authState",[209,1757,1226],{"class":230},[209,1759,1229],{"class":226},[209,1761,1044],{"class":230},[209,1763,255],{"class":230},[209,1765,1766],{"class":258},"authenticated",[209,1768,1769],{"class":230},"'\n",[209,1771,1772,1774,1776,1778,1780,1782],{"class":211,"line":359},[209,1773,1274],{"class":230},[209,1775,1277],{"class":215},[209,1777,1280],{"class":237},[209,1779,1283],{"class":226},[209,1781,1286],{"class":237},[209,1783,231],{"class":230},[209,1785,1786,1788,1790,1792,1794,1796,1798,1800,1802],{"class":211,"line":381},[209,1787,1294],{"class":215},[209,1789,1280],{"class":237},[209,1791,1283],{"class":226},[209,1793,1226],{"class":230},[209,1795,1303],{"class":226},[209,1797,1306],{"class":230},[209,1799,1310],{"class":1309},[209,1801,1286],{"class":237},[209,1803,231],{"class":230},[209,1805,1806,1809,1811,1813,1815,1817,1819],{"class":211,"line":401},[209,1807,1808],{"class":226},"      authState",[209,1810,1226],{"class":230},[209,1812,1229],{"class":226},[209,1814,1044],{"class":230},[209,1816,255],{"class":230},[209,1818,411],{"class":258},[209,1820,1769],{"class":230},[209,1822,1823,1826,1828,1830,1832,1834,1836,1839,1842,1845,1848],{"class":211,"line":419},[209,1824,1825],{"class":226},"      twoFactorMethods",[209,1827,1226],{"class":230},[209,1829,1229],{"class":226},[209,1831,1044],{"class":230},[209,1833,1369],{"class":226},[209,1835,1226],{"class":230},[209,1837,1838],{"class":226},"data",[209,1840,1841],{"class":230},"?.",[209,1843,1844],{"class":226},"methods",[209,1846,1847],{"class":230}," ||",[209,1849,1850],{"class":237}," []\n",[209,1852,1853,1855,1857],{"class":211,"line":425},[209,1854,1340],{"class":230},[209,1856,1343],{"class":215},[209,1858,244],{"class":230},[209,1860,1861,1864],{"class":211,"line":431},[209,1862,1863],{"class":215},"      throw",[209,1865,1866],{"class":226}," error\n",[209,1868,1869],{"class":211,"line":437},[209,1870,440],{"class":230},[209,1872,1873],{"class":211,"line":443},[209,1874,446],{"class":230},[209,1876,1877],{"class":211,"line":449},[209,1878,1411],{"class":230},[209,1880,1881],{"class":211,"line":772},[209,1882,1009],{"emptyLinePlaceholder":1008},[209,1884,1885,1887,1889,1891,1893,1895,1897,1899,1902,1904,1906,1909,1911,1913,1915],{"class":211,"line":805},[209,1886,1028],{"class":493},[209,1888,1424],{"class":226},[209,1890,497],{"class":230},[209,1892,1201],{"class":493},[209,1894,1280],{"class":230},[209,1896,206],{"class":1716},[209,1898,374],{"class":230},[209,1900,1901],{"class":1716}," method",[209,1903,1044],{"class":230},[209,1905,255],{"class":230},[209,1907,1908],{"class":258},"totp",[209,1910,262],{"class":230},[209,1912,1720],{"class":230},[209,1914,1207],{"class":493},[209,1916,244],{"class":230},[209,1918,1919,1921],{"class":211,"line":823},[209,1920,1215],{"class":215},[209,1922,244],{"class":230},[209,1924,1925,1927,1929,1931,1933,1935,1937,1939,1942],{"class":211,"line":843},[209,1926,1240],{"class":215},[209,1928,1463],{"class":222},[209,1930,227],{"class":237},[209,1932,262],{"class":230},[209,1934,1249],{"class":258},[209,1936,262],{"class":230},[209,1938,374],{"class":230},[209,1940,1941],{"class":226}," code",[209,1943,455],{"class":237},[209,1945,1946,1948,1950,1952,1954,1956,1958],{"class":211,"line":853},[209,1947,1755],{"class":226},[209,1949,1226],{"class":230},[209,1951,1229],{"class":226},[209,1953,1044],{"class":230},[209,1955,255],{"class":230},[209,1957,1766],{"class":258},[209,1959,1769],{"class":230},[209,1961,1962,1964,1966,1968,1970,1972],{"class":211,"line":870},[209,1963,1274],{"class":230},[209,1965,1277],{"class":215},[209,1967,1280],{"class":237},[209,1969,1283],{"class":226},[209,1971,1286],{"class":237},[209,1973,231],{"class":230},[209,1975,1976,1978,1980,1982,1984,1986,1989,1991,1993,1995],{"class":211,"line":887},[209,1977,1537],{"class":226},[209,1979,1226],{"class":230},[209,1981,1283],{"class":222},[209,1983,227],{"class":237},[209,1985,262],{"class":230},[209,1987,1988],{"class":258},"2FA verification failed:",[209,1990,262],{"class":230},[209,1992,374],{"class":230},[209,1994,1369],{"class":226},[209,1996,455],{"class":237},[209,1998,1999],{"class":211,"line":903},[209,2000,446],{"class":230},[209,2002,2003],{"class":211,"line":918},[209,2004,1411],{"class":230},[209,2006,2007,2009,2011],{"class":211,"line":926},[209,2008,551],{"class":230},[209,2010,1017],{"class":237},[209,2012,482],{"class":230},[461,2014,2016],{"id":2015},"multiple-2fa-methods","Multiple 2FA Methods",[198,2018,2020],{"className":467,"code":2019,"language":469,"meta":204,"style":204},"\u003Ctemplate>\n  \u003Cdiv v-if=\"authState === '2fa'\" class=\"two-factor-container\">\n    \u003Ch3>Two-Factor Authentication\u003C\u002Fh3>\n    \n    \u003C!-- Method Selection -->\n    \u003Cdiv v-if=\"selectedMethod === null\" class=\"method-selection\">\n      \u003Cp>Choose a verification method:\u003C\u002Fp>\n      \u003Cbutton \n        v-for=\"method in twoFactorMethods\" \n        :key=\"method.type\"\n        @click=\"selectedMethod = method.type\"\n      >\n        {{ method.name }}\n      \u003C\u002Fbutton>\n    \u003C\u002Fdiv>\n    \n    \u003C!-- TOTP Input -->\n    \u003Cdiv v-else-if=\"selectedMethod === 'totp'\" class=\"totp-input\">\n      \u003Cp>Enter your 6-digit code:\u003C\u002Fp>\n      \u003Cinput \n        v-model=\"totpCode\" \n        type=\"text\" \n        maxlength=\"6\" \n        @keyup.enter=\"verify2FA\"\n      \u002F>\n      \u003Cbutton @click=\"verify2FA\">Verify\u003C\u002Fbutton>\n    \u003C\u002Fdiv>\n    \n    \u003C!-- SMS Input -->\n    \u003Cdiv v-else-if=\"selectedMethod === 'sms'\" class=\"sms-input\">\n      \u003Cp>Enter the code sent to your phone:\u003C\u002Fp>\n      \u003Cinput \n        v-model=\"smsCode\" \n        type=\"text\" \n        maxlength=\"6\" \n        @keyup.enter=\"verify2FA\"\n      \u002F>\n      \u003Cbutton @click=\"verify2FA\">Verify\u003C\u002Fbutton>\n      \u003Cbutton @click=\"resendSMS\" class=\"resend-btn\">Resend Code\u003C\u002Fbutton>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nconst selectedMethod = ref(null)\nconst totpCode = ref('')\nconst smsCode = ref('')\n\nconst verify2FA = async () => {\n  const code = selectedMethod.value === 'totp' ? totpCode.value : smsCode.value\n  await handle2FA(code, selectedMethod.value)\n}\n\nconst resendSMS = async () => {\n  try {\n    await $fetch('\u002Fapi\u002Fresend-sms-2fa', {\n      method: 'POST',\n      body: { strategy: 'client' }\n    })\n    console.log('SMS code resent')\n  } catch (error) {\n    console.error('Failed to resend SMS:', error)\n  }\n}\n\u003C\u002Fscript>\n",[206,2021,2022,2030,2060,2076,2080,2085,2115,2132,2140,2156,2170,2184,2189,2194,2202,2210,2214,2219,2250,2267,2275,2290,2304,2318,2332,2336,2364,2372,2376,2381,2411,2428,2436,2451,2465,2479,2491,2495,2521,2560,2568,2576,2584,2588,2598,2616,2633,2650,2654,2671,2716,2738,2742,2746,2763,2769,2789,2804,2827,2833,2853,2867,2890,2894,2898],{"__ignoreMap":204},[209,2023,2024,2026,2028],{"class":211,"line":212},[209,2025,476],{"class":230},[209,2027,479],{"class":237},[209,2029,482],{"class":230},[209,2031,2032,2034,2036,2038,2040,2042,2045,2047,2049,2051,2053,2056,2058],{"class":211,"line":234},[209,2033,487],{"class":230},[209,2035,520],{"class":237},[209,2037,779],{"class":493},[209,2039,497],{"class":230},[209,2041,500],{"class":230},[209,2043,2044],{"class":258},"authState === '2fa'",[209,2046,500],{"class":230},[209,2048,791],{"class":493},[209,2050,497],{"class":230},[209,2052,500],{"class":230},[209,2054,2055],{"class":258},"two-factor-container",[209,2057,500],{"class":230},[209,2059,482],{"class":230},[209,2061,2062,2064,2066,2068,2070,2072,2074],{"class":211,"line":247},[209,2063,517],{"class":230},[209,2065,461],{"class":237},[209,2067,545],{"class":230},[209,2069,62],{"class":226},[209,2071,551],{"class":230},[209,2073,461],{"class":237},[209,2075,482],{"class":230},[209,2077,2078],{"class":211,"line":268},[209,2079,616],{"class":226},[209,2081,2082],{"class":211,"line":278},[209,2083,2084],{"class":377},"    \u003C!-- Method Selection -->\n",[209,2086,2087,2089,2091,2093,2095,2097,2100,2102,2104,2106,2108,2111,2113],{"class":211,"line":288},[209,2088,517],{"class":230},[209,2090,520],{"class":237},[209,2092,779],{"class":493},[209,2094,497],{"class":230},[209,2096,500],{"class":230},[209,2098,2099],{"class":258},"selectedMethod === null",[209,2101,500],{"class":230},[209,2103,791],{"class":493},[209,2105,497],{"class":230},[209,2107,500],{"class":230},[209,2109,2110],{"class":258},"method-selection",[209,2112,500],{"class":230},[209,2114,482],{"class":230},[209,2116,2117,2119,2121,2123,2126,2128,2130],{"class":211,"line":298},[209,2118,527],{"class":230},[209,2120,176],{"class":237},[209,2122,545],{"class":230},[209,2124,2125],{"class":226},"Choose a verification method:",[209,2127,551],{"class":230},[209,2129,176],{"class":237},[209,2131,482],{"class":230},[209,2133,2134,2136,2138],{"class":211,"line":308},[209,2135,527],{"class":230},[209,2137,712],{"class":237},[209,2139,850],{"class":230},[209,2141,2142,2145,2147,2149,2152,2154],{"class":211,"line":325},[209,2143,2144],{"class":493},"        v-for",[209,2146,497],{"class":230},[209,2148,500],{"class":230},[209,2150,2151],{"class":258},"method in twoFactorMethods",[209,2153,500],{"class":230},[209,2155,850],{"class":230},[209,2157,2158,2161,2163,2165,2168],{"class":211,"line":342},[209,2159,2160],{"class":493},"        :key",[209,2162,497],{"class":230},[209,2164,500],{"class":230},[209,2166,2167],{"class":258},"method.type",[209,2169,900],{"class":230},[209,2171,2172,2175,2177,2179,2182],{"class":211,"line":359},[209,2173,2174],{"class":493},"        @click",[209,2176,497],{"class":230},[209,2178,500],{"class":230},[209,2180,2181],{"class":258},"selectedMethod = method.type",[209,2183,900],{"class":230},[209,2185,2186],{"class":211,"line":381},[209,2187,2188],{"class":230},"      >\n",[209,2190,2191],{"class":211,"line":401},[209,2192,2193],{"class":226},"        {{ method.name }}\n",[209,2195,2196,2198,2200],{"class":211,"line":419},[209,2197,971],{"class":230},[209,2199,712],{"class":237},[209,2201,482],{"class":230},[209,2203,2204,2206,2208],{"class":211,"line":425},[209,2205,607],{"class":230},[209,2207,520],{"class":237},[209,2209,482],{"class":230},[209,2211,2212],{"class":211,"line":431},[209,2213,616],{"class":226},[209,2215,2216],{"class":211,"line":437},[209,2217,2218],{"class":377},"    \u003C!-- TOTP Input -->\n",[209,2220,2221,2223,2225,2228,2230,2232,2235,2237,2239,2241,2243,2246,2248],{"class":211,"line":443},[209,2222,517],{"class":230},[209,2224,520],{"class":237},[209,2226,2227],{"class":493}," v-else-if",[209,2229,497],{"class":230},[209,2231,500],{"class":230},[209,2233,2234],{"class":258},"selectedMethod === 'totp'",[209,2236,500],{"class":230},[209,2238,791],{"class":493},[209,2240,497],{"class":230},[209,2242,500],{"class":230},[209,2244,2245],{"class":258},"totp-input",[209,2247,500],{"class":230},[209,2249,482],{"class":230},[209,2251,2252,2254,2256,2258,2261,2263,2265],{"class":211,"line":449},[209,2253,527],{"class":230},[209,2255,176],{"class":237},[209,2257,545],{"class":230},[209,2259,2260],{"class":226},"Enter your 6-digit code:",[209,2262,551],{"class":230},[209,2264,176],{"class":237},[209,2266,482],{"class":230},[209,2268,2269,2271,2273],{"class":211,"line":772},[209,2270,527],{"class":230},[209,2272,562],{"class":237},[209,2274,850],{"class":230},[209,2276,2277,2279,2281,2283,2286,2288],{"class":211,"line":805},[209,2278,856],{"class":493},[209,2280,497],{"class":230},[209,2282,500],{"class":230},[209,2284,2285],{"class":258},"totpCode",[209,2287,500],{"class":230},[209,2289,850],{"class":230},[209,2291,2292,2294,2296,2298,2300,2302],{"class":211,"line":823},[209,2293,873],{"class":493},[209,2295,497],{"class":230},[209,2297,500],{"class":230},[209,2299,880],{"class":258},[209,2301,500],{"class":230},[209,2303,850],{"class":230},[209,2305,2306,2308,2310,2312,2314,2316],{"class":211,"line":843},[209,2307,906],{"class":493},[209,2309,497],{"class":230},[209,2311,500],{"class":230},[209,2313,913],{"class":258},[209,2315,500],{"class":230},[209,2317,850],{"class":230},[209,2319,2320,2323,2325,2327,2330],{"class":211,"line":853},[209,2321,2322],{"class":493},"        @keyup.enter",[209,2324,497],{"class":230},[209,2326,500],{"class":230},[209,2328,2329],{"class":258},"verify2FA",[209,2331,900],{"class":230},[209,2333,2334],{"class":211,"line":870},[209,2335,929],{"class":230},[209,2337,2338,2340,2342,2345,2347,2349,2351,2353,2355,2358,2360,2362],{"class":211,"line":887},[209,2339,527],{"class":230},[209,2341,712],{"class":237},[209,2343,2344],{"class":493}," @click",[209,2346,497],{"class":230},[209,2348,500],{"class":230},[209,2350,2329],{"class":258},[209,2352,500],{"class":230},[209,2354,545],{"class":230},[209,2356,2357],{"class":226},"Verify",[209,2359,551],{"class":230},[209,2361,712],{"class":237},[209,2363,482],{"class":230},[209,2365,2366,2368,2370],{"class":211,"line":903},[209,2367,607],{"class":230},[209,2369,520],{"class":237},[209,2371,482],{"class":230},[209,2373,2374],{"class":211,"line":918},[209,2375,616],{"class":226},[209,2377,2378],{"class":211,"line":926},[209,2379,2380],{"class":377},"    \u003C!-- SMS Input -->\n",[209,2382,2383,2385,2387,2389,2391,2393,2396,2398,2400,2402,2404,2407,2409],{"class":211,"line":932},[209,2384,517],{"class":230},[209,2386,520],{"class":237},[209,2388,2227],{"class":493},[209,2390,497],{"class":230},[209,2392,500],{"class":230},[209,2394,2395],{"class":258},"selectedMethod === 'sms'",[209,2397,500],{"class":230},[209,2399,791],{"class":493},[209,2401,497],{"class":230},[209,2403,500],{"class":230},[209,2405,2406],{"class":258},"sms-input",[209,2408,500],{"class":230},[209,2410,482],{"class":230},[209,2412,2413,2415,2417,2419,2422,2424,2426],{"class":211,"line":962},[209,2414,527],{"class":230},[209,2416,176],{"class":237},[209,2418,545],{"class":230},[209,2420,2421],{"class":226},"Enter the code sent to your phone:",[209,2423,551],{"class":230},[209,2425,176],{"class":237},[209,2427,482],{"class":230},[209,2429,2430,2432,2434],{"class":211,"line":968},[209,2431,527],{"class":230},[209,2433,562],{"class":237},[209,2435,850],{"class":230},[209,2437,2438,2440,2442,2444,2447,2449],{"class":211,"line":978},[209,2439,856],{"class":493},[209,2441,497],{"class":230},[209,2443,500],{"class":230},[209,2445,2446],{"class":258},"smsCode",[209,2448,500],{"class":230},[209,2450,850],{"class":230},[209,2452,2453,2455,2457,2459,2461,2463],{"class":211,"line":987},[209,2454,873],{"class":493},[209,2456,497],{"class":230},[209,2458,500],{"class":230},[209,2460,880],{"class":258},[209,2462,500],{"class":230},[209,2464,850],{"class":230},[209,2466,2467,2469,2471,2473,2475,2477],{"class":211,"line":996},[209,2468,906],{"class":493},[209,2470,497],{"class":230},[209,2472,500],{"class":230},[209,2474,913],{"class":258},[209,2476,500],{"class":230},[209,2478,850],{"class":230},[209,2480,2481,2483,2485,2487,2489],{"class":211,"line":1005},[209,2482,2322],{"class":493},[209,2484,497],{"class":230},[209,2486,500],{"class":230},[209,2488,2329],{"class":258},[209,2490,900],{"class":230},[209,2492,2493],{"class":211,"line":1012},[209,2494,929],{"class":230},[209,2496,2497,2499,2501,2503,2505,2507,2509,2511,2513,2515,2517,2519],{"class":211,"line":1025},[209,2498,527],{"class":230},[209,2500,712],{"class":237},[209,2502,2344],{"class":493},[209,2504,497],{"class":230},[209,2506,500],{"class":230},[209,2508,2329],{"class":258},[209,2510,500],{"class":230},[209,2512,545],{"class":230},[209,2514,2357],{"class":226},[209,2516,551],{"class":230},[209,2518,712],{"class":237},[209,2520,482],{"class":230},[209,2522,2523,2525,2527,2529,2531,2533,2536,2538,2540,2542,2544,2547,2549,2551,2554,2556,2558],{"class":211,"line":1053},[209,2524,527],{"class":230},[209,2526,712],{"class":237},[209,2528,2344],{"class":493},[209,2530,497],{"class":230},[209,2532,500],{"class":230},[209,2534,2535],{"class":258},"resendSMS",[209,2537,500],{"class":230},[209,2539,791],{"class":493},[209,2541,497],{"class":230},[209,2543,500],{"class":230},[209,2545,2546],{"class":258},"resend-btn",[209,2548,500],{"class":230},[209,2550,545],{"class":230},[209,2552,2553],{"class":226},"Resend Code",[209,2555,551],{"class":230},[209,2557,712],{"class":237},[209,2559,482],{"class":230},[209,2561,2562,2564,2566],{"class":211,"line":1058},[209,2563,607],{"class":230},[209,2565,520],{"class":237},[209,2567,482],{"class":230},[209,2569,2570,2572,2574],{"class":211,"line":1075},[209,2571,755],{"class":230},[209,2573,520],{"class":237},[209,2575,482],{"class":230},[209,2577,2578,2580,2582],{"class":211,"line":1088},[209,2579,551],{"class":230},[209,2581,479],{"class":237},[209,2583,482],{"class":230},[209,2585,2586],{"class":211,"line":1099},[209,2587,1009],{"emptyLinePlaceholder":1008},[209,2589,2590,2592,2594,2596],{"class":211,"line":1106},[209,2591,476],{"class":230},[209,2593,1017],{"class":237},[209,2595,1020],{"class":493},[209,2597,482],{"class":230},[209,2599,2600,2602,2605,2607,2609,2611,2614],{"class":211,"line":1111},[209,2601,1028],{"class":493},[209,2603,2604],{"class":226}," selectedMethod ",[209,2606,497],{"class":230},[209,2608,1068],{"class":222},[209,2610,227],{"class":226},[209,2612,2613],{"class":230},"null",[209,2615,455],{"class":226},[209,2617,2618,2620,2623,2625,2627,2629,2631],{"class":211,"line":1131},[209,2619,1028],{"class":493},[209,2621,2622],{"class":226}," totpCode ",[209,2624,497],{"class":230},[209,2626,1068],{"class":222},[209,2628,227],{"class":226},[209,2630,1145],{"class":230},[209,2632,455],{"class":226},[209,2634,2635,2637,2640,2642,2644,2646,2648],{"class":211,"line":1150},[209,2636,1028],{"class":493},[209,2638,2639],{"class":226}," smsCode ",[209,2641,497],{"class":230},[209,2643,1068],{"class":222},[209,2645,227],{"class":226},[209,2647,1145],{"class":230},[209,2649,455],{"class":226},[209,2651,2652],{"class":211,"line":1168},[209,2653,1009],{"emptyLinePlaceholder":1008},[209,2655,2656,2658,2661,2663,2665,2667,2669],{"class":211,"line":1186},[209,2657,1028],{"class":493},[209,2659,2660],{"class":226}," verify2FA ",[209,2662,497],{"class":230},[209,2664,1201],{"class":493},[209,2666,1204],{"class":230},[209,2668,1207],{"class":493},[209,2670,244],{"class":230},[209,2672,2673,2676,2678,2680,2683,2685,2687,2689,2691,2693,2695,2698,2701,2703,2705,2708,2711,2713],{"class":211,"line":1191},[209,2674,2675],{"class":493},"  const",[209,2677,1941],{"class":226},[209,2679,1044],{"class":230},[209,2681,2682],{"class":226}," selectedMethod",[209,2684,1226],{"class":230},[209,2686,1229],{"class":226},[209,2688,1306],{"class":230},[209,2690,255],{"class":230},[209,2692,1908],{"class":258},[209,2694,262],{"class":230},[209,2696,2697],{"class":230}," ?",[209,2699,2700],{"class":226}," totpCode",[209,2702,1226],{"class":230},[209,2704,1229],{"class":226},[209,2706,2707],{"class":230}," :",[209,2709,2710],{"class":226}," smsCode",[209,2712,1226],{"class":230},[209,2714,2715],{"class":226},"value\n",[209,2717,2718,2721,2724,2726,2728,2730,2732,2734,2736],{"class":211,"line":1212},[209,2719,2720],{"class":215},"  await",[209,2722,2723],{"class":222}," handle2FA",[209,2725,227],{"class":237},[209,2727,206],{"class":226},[209,2729,374],{"class":230},[209,2731,2682],{"class":226},[209,2733,1226],{"class":230},[209,2735,1229],{"class":226},[209,2737,455],{"class":237},[209,2739,2740],{"class":211,"line":1220},[209,2741,1411],{"class":230},[209,2743,2744],{"class":211,"line":1237},[209,2745,1009],{"emptyLinePlaceholder":1008},[209,2747,2748,2750,2753,2755,2757,2759,2761],{"class":211,"line":1265},[209,2749,1028],{"class":493},[209,2751,2752],{"class":226}," resendSMS ",[209,2754,497],{"class":230},[209,2756,1201],{"class":493},[209,2758,1204],{"class":230},[209,2760,1207],{"class":493},[209,2762,244],{"class":230},[209,2764,2765,2767],{"class":211,"line":1271},[209,2766,1215],{"class":215},[209,2768,244],{"class":230},[209,2770,2771,2773,2776,2778,2780,2783,2785,2787],{"class":211,"line":1291},[209,2772,1240],{"class":215},[209,2774,2775],{"class":222}," $fetch",[209,2777,227],{"class":237},[209,2779,262],{"class":230},[209,2781,2782],{"class":258},"\u002Fapi\u002Fresend-sms-2fa",[209,2784,262],{"class":230},[209,2786,374],{"class":230},[209,2788,244],{"class":230},[209,2790,2791,2794,2796,2798,2800,2802],{"class":211,"line":1317},[209,2792,2793],{"class":237},"      method",[209,2795,241],{"class":230},[209,2797,255],{"class":230},[209,2799,335],{"class":258},[209,2801,262],{"class":230},[209,2803,265],{"class":230},[209,2805,2806,2809,2811,2813,2816,2818,2820,2822,2824],{"class":211,"line":1323},[209,2807,2808],{"class":237},"      body",[209,2810,241],{"class":230},[209,2812,1031],{"class":230},[209,2814,2815],{"class":237}," strategy",[209,2817,241],{"class":230},[209,2819,255],{"class":230},[209,2821,1249],{"class":258},[209,2823,262],{"class":230},[209,2825,2826],{"class":230}," }\n",[209,2828,2829,2831],{"class":211,"line":1337},[209,2830,1340],{"class":230},[209,2832,455],{"class":237},[209,2834,2835,2837,2839,2842,2844,2846,2849,2851],{"class":211,"line":1348},[209,2836,1537],{"class":226},[209,2838,1226],{"class":230},[209,2840,2841],{"class":222},"log",[209,2843,227],{"class":237},[209,2845,262],{"class":230},[209,2847,2848],{"class":258},"SMS code resent",[209,2850,262],{"class":230},[209,2852,455],{"class":237},[209,2854,2855,2857,2859,2861,2863,2865],{"class":211,"line":1374},[209,2856,1274],{"class":230},[209,2858,1277],{"class":215},[209,2860,1280],{"class":237},[209,2862,1283],{"class":226},[209,2864,1286],{"class":237},[209,2866,231],{"class":230},[209,2868,2869,2871,2873,2875,2877,2879,2882,2884,2886,2888],{"class":211,"line":1379},[209,2870,1537],{"class":226},[209,2872,1226],{"class":230},[209,2874,1283],{"class":222},[209,2876,227],{"class":237},[209,2878,262],{"class":230},[209,2880,2881],{"class":258},"Failed to resend SMS:",[209,2883,262],{"class":230},[209,2885,374],{"class":230},[209,2887,1369],{"class":226},[209,2889,455],{"class":237},[209,2891,2892],{"class":211,"line":1389},[209,2893,446],{"class":230},[209,2895,2896],{"class":211,"line":1403},[209,2897,1411],{"class":230},[209,2899,2900,2902,2904],{"class":211,"line":1408},[209,2901,551],{"class":230},[209,2903,1017],{"class":237},[209,2905,482],{"class":230},[183,2907,2909],{"id":2908},"_2fa-token-management","2FA Token Management",[461,2911,2913],{"id":2912},"_2fa-token-storage","2FA Token Storage",[198,2915,2917],{"className":467,"code":2916,"language":469,"meta":204,"style":204},"\u003Cscript setup>\n\u002F\u002F 2FA tokens are automatically managed by Nuxt Umbu\nconst { headers } = useAuth()\n\n\u002F\u002F Check if 2FA token is present\nconst has2FAToken = computed(() => {\n  const headerName = '2fa' \u002F\u002F Configured header name\n  return headers.value.has(headerName)\n})\n\n\u002F\u002F Manual 2FA token inspection\n\u002F\u002F Note: 2FA tokens are stored in httpOnly cookies and cannot be accessed directly from JavaScript.\n\u002F\u002F Cookies are set with the configured prefix: \u003Cconfigured-prefix>_2fa.\u003Cstrategy>\n\u002F\u002F and \u003Cconfigured-prefix>_2fa_expiration.\u003Cstrategy>\n\u002F\u002F Use the headers composable to check if 2FA token is present\nconst inspect2FAToken = () => {\n  const { headers } = useAuth()\n  const headerName = '2fa' \u002F\u002F Configured header name\n  console.log('2FA Token Present:', headers.value.has(headerName))\n  \u002F\u002F Direct JavaScript access to httpOnly cookies is unavailable for security\n}\n\u003C\u002Fscript>\n",[206,2918,2919,2929,2934,2951,2955,2960,2981,2999,3023,3029,3033,3038,3043,3048,3053,3058,3073,3090,3106,3143,3148,3152],{"__ignoreMap":204},[209,2920,2921,2923,2925,2927],{"class":211,"line":212},[209,2922,476],{"class":230},[209,2924,1017],{"class":237},[209,2926,1020],{"class":493},[209,2928,482],{"class":230},[209,2930,2931],{"class":211,"line":234},[209,2932,2933],{"class":377},"\u002F\u002F 2FA tokens are automatically managed by Nuxt Umbu\n",[209,2935,2936,2938,2940,2943,2945,2947,2949],{"class":211,"line":247},[209,2937,1028],{"class":493},[209,2939,1031],{"class":230},[209,2941,2942],{"class":226}," headers ",[209,2944,452],{"class":230},[209,2946,1044],{"class":230},[209,2948,1047],{"class":222},[209,2950,1050],{"class":226},[209,2952,2953],{"class":211,"line":268},[209,2954,1009],{"emptyLinePlaceholder":1008},[209,2956,2957],{"class":211,"line":278},[209,2958,2959],{"class":377},"\u002F\u002F Check if 2FA token is present\n",[209,2961,2962,2964,2967,2969,2972,2974,2977,2979],{"class":211,"line":288},[209,2963,1028],{"class":493},[209,2965,2966],{"class":226}," has2FAToken ",[209,2968,497],{"class":230},[209,2970,2971],{"class":222}," computed",[209,2973,227],{"class":226},[209,2975,2976],{"class":230},"()",[209,2978,1207],{"class":493},[209,2980,244],{"class":230},[209,2982,2983,2985,2988,2990,2992,2994,2996],{"class":211,"line":298},[209,2984,2675],{"class":493},[209,2986,2987],{"class":226}," headerName",[209,2989,1044],{"class":230},[209,2991,255],{"class":230},[209,2993,411],{"class":258},[209,2995,262],{"class":230},[209,2997,2998],{"class":377}," \u002F\u002F Configured header name\n",[209,3000,3001,3004,3007,3009,3011,3013,3016,3018,3021],{"class":211,"line":308},[209,3002,3003],{"class":215},"  return",[209,3005,3006],{"class":226}," headers",[209,3008,1226],{"class":230},[209,3010,1229],{"class":226},[209,3012,1226],{"class":230},[209,3014,3015],{"class":222},"has",[209,3017,227],{"class":237},[209,3019,3020],{"class":226},"headerName",[209,3022,455],{"class":237},[209,3024,3025,3027],{"class":211,"line":325},[209,3026,452],{"class":230},[209,3028,455],{"class":226},[209,3030,3031],{"class":211,"line":342},[209,3032,1009],{"emptyLinePlaceholder":1008},[209,3034,3035],{"class":211,"line":359},[209,3036,3037],{"class":377},"\u002F\u002F Manual 2FA token inspection\n",[209,3039,3040],{"class":211,"line":381},[209,3041,3042],{"class":377},"\u002F\u002F Note: 2FA tokens are stored in httpOnly cookies and cannot be accessed directly from JavaScript.\n",[209,3044,3045],{"class":211,"line":401},[209,3046,3047],{"class":377},"\u002F\u002F Cookies are set with the configured prefix: \u003Cconfigured-prefix>_2fa.\u003Cstrategy>\n",[209,3049,3050],{"class":211,"line":419},[209,3051,3052],{"class":377},"\u002F\u002F and \u003Cconfigured-prefix>_2fa_expiration.\u003Cstrategy>\n",[209,3054,3055],{"class":211,"line":425},[209,3056,3057],{"class":377},"\u002F\u002F Use the headers composable to check if 2FA token is present\n",[209,3059,3060,3062,3065,3067,3069,3071],{"class":211,"line":431},[209,3061,1028],{"class":493},[209,3063,3064],{"class":226}," inspect2FAToken ",[209,3066,497],{"class":230},[209,3068,1204],{"class":230},[209,3070,1207],{"class":493},[209,3072,244],{"class":230},[209,3074,3075,3077,3079,3081,3084,3086,3088],{"class":211,"line":437},[209,3076,2675],{"class":493},[209,3078,1031],{"class":230},[209,3080,3006],{"class":226},[209,3082,3083],{"class":230}," }",[209,3085,1044],{"class":230},[209,3087,1047],{"class":222},[209,3089,1050],{"class":237},[209,3091,3092,3094,3096,3098,3100,3102,3104],{"class":211,"line":443},[209,3093,2675],{"class":493},[209,3095,2987],{"class":226},[209,3097,1044],{"class":230},[209,3099,255],{"class":230},[209,3101,411],{"class":258},[209,3103,262],{"class":230},[209,3105,2998],{"class":377},[209,3107,3108,3111,3113,3115,3117,3119,3122,3124,3126,3128,3130,3132,3134,3136,3138,3140],{"class":211,"line":449},[209,3109,3110],{"class":226},"  console",[209,3112,1226],{"class":230},[209,3114,2841],{"class":222},[209,3116,227],{"class":237},[209,3118,262],{"class":230},[209,3120,3121],{"class":258},"2FA Token Present:",[209,3123,262],{"class":230},[209,3125,374],{"class":230},[209,3127,3006],{"class":226},[209,3129,1226],{"class":230},[209,3131,1229],{"class":226},[209,3133,1226],{"class":230},[209,3135,3015],{"class":222},[209,3137,227],{"class":237},[209,3139,3020],{"class":226},[209,3141,3142],{"class":237},"))\n",[209,3144,3145],{"class":211,"line":772},[209,3146,3147],{"class":377},"  \u002F\u002F Direct JavaScript access to httpOnly cookies is unavailable for security\n",[209,3149,3150],{"class":211,"line":805},[209,3151,1411],{"class":230},[209,3153,3154,3156,3158],{"class":211,"line":823},[209,3155,551],{"class":230},[209,3157,1017],{"class":237},[209,3159,482],{"class":230},[461,3161,3163],{"id":3162},"_2fa-token-expiration","2FA Token Expiration",[198,3165,3167],{"className":467,"code":3166,"language":469,"meta":204,"style":204},"\u003Cscript setup>\nconst { $auth } = useAuth()\n\n\u002F\u002F 2FA expiration check - follows middleware pattern\n\u002F\u002F Server-side: cookie extraction via httpOnly cookies\n\u002F\u002F Client-side: localStorage access only in browser context\nconst is2FAExpired = computed(() => {\n  if (!import.meta.client) {\n    return false \u002F\u002F Server handles validation via httpOnly cookies\n  }\n\n  \u002F\u002F Client-side: check localStorage for expiration (if mirrored)\n  const strategy = localStorage.getItem($auth.prefix + 'strategy')\n  const expiration = strategy \n    ? localStorage.getItem($auth.prefix + '_2fa_expiration.' + strategy)\n    : null\n\n  return expiration ? Date.now() > parseInt(expiration) : true\n})\n\n\u002F\u002F Handle 2FA expiration\nwatch(is2FAExpired, (expired) => {\n  if (expired && loggedIn.value) {\n    console.log('2FA token expired, user may need to re-authenticate')\n    \u002F\u002F Optionally redirect to re-authentication\n  }\n})\n\u003C\u002Fscript>\n",[206,3168,3169,3179,3196,3200,3205,3210,3215,3234,3260,3271,3275,3279,3284,3322,3335,3369,3377,3381,3416,3422,3426,3431,3452,3473,3492,3497,3501,3507],{"__ignoreMap":204},[209,3170,3171,3173,3175,3177],{"class":211,"line":212},[209,3172,476],{"class":230},[209,3174,1017],{"class":237},[209,3176,1020],{"class":493},[209,3178,482],{"class":230},[209,3180,3181,3183,3185,3188,3190,3192,3194],{"class":211,"line":234},[209,3182,1028],{"class":493},[209,3184,1031],{"class":230},[209,3186,3187],{"class":226}," $auth ",[209,3189,452],{"class":230},[209,3191,1044],{"class":230},[209,3193,1047],{"class":222},[209,3195,1050],{"class":226},[209,3197,3198],{"class":211,"line":247},[209,3199,1009],{"emptyLinePlaceholder":1008},[209,3201,3202],{"class":211,"line":268},[209,3203,3204],{"class":377},"\u002F\u002F 2FA expiration check - follows middleware pattern\n",[209,3206,3207],{"class":211,"line":278},[209,3208,3209],{"class":377},"\u002F\u002F Server-side: cookie extraction via httpOnly cookies\n",[209,3211,3212],{"class":211,"line":288},[209,3213,3214],{"class":377},"\u002F\u002F Client-side: localStorage access only in browser context\n",[209,3216,3217,3219,3222,3224,3226,3228,3230,3232],{"class":211,"line":298},[209,3218,1028],{"class":493},[209,3220,3221],{"class":226}," is2FAExpired ",[209,3223,497],{"class":230},[209,3225,2971],{"class":222},[209,3227,227],{"class":226},[209,3229,2976],{"class":230},[209,3231,1207],{"class":493},[209,3233,244],{"class":230},[209,3235,3236,3239,3241,3244,3247,3249,3252,3254,3256,3258],{"class":211,"line":308},[209,3237,3238],{"class":215},"  if",[209,3240,1280],{"class":237},[209,3242,3243],{"class":230},"!",[209,3245,3246],{"class":215},"import",[209,3248,1226],{"class":230},[209,3250,3251],{"class":226},"meta",[209,3253,1226],{"class":230},[209,3255,1249],{"class":226},[209,3257,1286],{"class":237},[209,3259,231],{"class":230},[209,3261,3262,3265,3268],{"class":211,"line":325},[209,3263,3264],{"class":215},"    return",[209,3266,3267],{"class":1125}," false",[209,3269,3270],{"class":377}," \u002F\u002F Server handles validation via httpOnly cookies\n",[209,3272,3273],{"class":211,"line":342},[209,3274,446],{"class":230},[209,3276,3277],{"class":211,"line":359},[209,3278,1009],{"emptyLinePlaceholder":1008},[209,3280,3281],{"class":211,"line":381},[209,3282,3283],{"class":377},"  \u002F\u002F Client-side: check localStorage for expiration (if mirrored)\n",[209,3285,3286,3288,3290,3292,3295,3297,3300,3302,3305,3307,3310,3313,3315,3318,3320],{"class":211,"line":401},[209,3287,2675],{"class":493},[209,3289,2815],{"class":226},[209,3291,1044],{"class":230},[209,3293,3294],{"class":226}," localStorage",[209,3296,1226],{"class":230},[209,3298,3299],{"class":222},"getItem",[209,3301,227],{"class":237},[209,3303,3304],{"class":226},"$auth",[209,3306,1226],{"class":230},[209,3308,3309],{"class":226},"prefix",[209,3311,3312],{"class":230}," +",[209,3314,255],{"class":230},[209,3316,3317],{"class":258},"strategy",[209,3319,262],{"class":230},[209,3321,455],{"class":237},[209,3323,3324,3326,3329,3331,3333],{"class":211,"line":419},[209,3325,2675],{"class":493},[209,3327,3328],{"class":226}," expiration",[209,3330,1044],{"class":230},[209,3332,2815],{"class":226},[209,3334,850],{"class":237},[209,3336,3337,3340,3342,3344,3346,3348,3350,3352,3354,3356,3358,3361,3363,3365,3367],{"class":211,"line":425},[209,3338,3339],{"class":230},"    ?",[209,3341,3294],{"class":226},[209,3343,1226],{"class":230},[209,3345,3299],{"class":222},[209,3347,227],{"class":237},[209,3349,3304],{"class":226},[209,3351,1226],{"class":230},[209,3353,3309],{"class":226},[209,3355,3312],{"class":230},[209,3357,255],{"class":230},[209,3359,3360],{"class":258},"_2fa_expiration.",[209,3362,262],{"class":230},[209,3364,3312],{"class":230},[209,3366,2815],{"class":226},[209,3368,455],{"class":237},[209,3370,3371,3374],{"class":211,"line":431},[209,3372,3373],{"class":230},"    :",[209,3375,3376],{"class":230}," null\n",[209,3378,3379],{"class":211,"line":437},[209,3380,1009],{"emptyLinePlaceholder":1008},[209,3382,3383,3385,3387,3389,3392,3394,3397,3400,3402,3405,3407,3410,3412,3414],{"class":211,"line":443},[209,3384,3003],{"class":215},[209,3386,3328],{"class":226},[209,3388,2697],{"class":230},[209,3390,3391],{"class":226}," Date",[209,3393,1226],{"class":230},[209,3395,3396],{"class":222},"now",[209,3398,3399],{"class":237},"() ",[209,3401,545],{"class":230},[209,3403,3404],{"class":222}," parseInt",[209,3406,227],{"class":237},[209,3408,3409],{"class":226},"expiration",[209,3411,1286],{"class":237},[209,3413,241],{"class":230},[209,3415,1234],{"class":1125},[209,3417,3418,3420],{"class":211,"line":449},[209,3419,452],{"class":230},[209,3421,455],{"class":226},[209,3423,3424],{"class":211,"line":772},[209,3425,1009],{"emptyLinePlaceholder":1008},[209,3427,3428],{"class":211,"line":805},[209,3429,3430],{"class":377},"\u002F\u002F Handle 2FA expiration\n",[209,3432,3433,3436,3439,3441,3443,3446,3448,3450],{"class":211,"line":823},[209,3434,3435],{"class":222},"watch",[209,3437,3438],{"class":226},"(is2FAExpired",[209,3440,374],{"class":230},[209,3442,1280],{"class":230},[209,3444,3445],{"class":1716},"expired",[209,3447,1720],{"class":230},[209,3449,1207],{"class":493},[209,3451,244],{"class":230},[209,3453,3454,3456,3458,3460,3463,3465,3467,3469,3471],{"class":211,"line":843},[209,3455,3238],{"class":215},[209,3457,1280],{"class":237},[209,3459,3445],{"class":226},[209,3461,3462],{"class":230}," &&",[209,3464,1629],{"class":226},[209,3466,1226],{"class":230},[209,3468,1229],{"class":226},[209,3470,1286],{"class":237},[209,3472,231],{"class":230},[209,3474,3475,3477,3479,3481,3483,3485,3488,3490],{"class":211,"line":853},[209,3476,1537],{"class":226},[209,3478,1226],{"class":230},[209,3480,2841],{"class":222},[209,3482,227],{"class":237},[209,3484,262],{"class":230},[209,3486,3487],{"class":258},"2FA token expired, user may need to re-authenticate",[209,3489,262],{"class":230},[209,3491,455],{"class":237},[209,3493,3494],{"class":211,"line":870},[209,3495,3496],{"class":377},"    \u002F\u002F Optionally redirect to re-authentication\n",[209,3498,3499],{"class":211,"line":887},[209,3500,446],{"class":230},[209,3502,3503,3505],{"class":211,"line":903},[209,3504,452],{"class":230},[209,3506,455],{"class":226},[209,3508,3509,3511,3513],{"class":211,"line":918},[209,3510,551],{"class":230},[209,3512,1017],{"class":237},[209,3514,482],{"class":230},[183,3516,3518],{"id":3517},"server-side-2fa","Server-Side 2FA",[461,3520,3522],{"id":3521},"_2fa-api-endpoint","2FA API Endpoint",[176,3524,3525,3526,3529],{},"The built-in ",[206,3527,3528],{},"\u002Fapi\u002F{twoFactorAlias}"," handler is automatically registered when 2FA is configured. It uses the configured prefix and cookie options from your auth configuration.",[198,3531,3534],{"className":200,"code":3532,"filename":3533,"language":203,"meta":204,"style":204},"\u002F\u002F Custom 2FA endpoint example - matches built-in behavior\nexport default defineEventHandler(async (event) => {\n  const { strategyName, code } = await readBody(event)\n  \n  try {\n    const { $auth } = useNuxtApp()\n    const authConfig = $auth.config\n    \n    \u002F\u002F Validate strategy\n    if (!authConfig.strategies?.[strategyName]?.endpoints?.twoFactor) {\n      throw createError({\n        statusCode: 400,\n        statusMessage: '2FA endpoint not configured for strategy ' + strategyName\n      })\n    }\n    \n    \u002F\u002F Get existing auth token\n    const token = getCookie(event, authConfig.prefix + '_token.' + strategyName)\n    if (!token) {\n      throw createError({\n        statusCode: 401,\n        statusMessage: 'Authentication token missing'\n      })\n    }\n    \n    const strategy = authConfig.strategies[strategyName]\n    const twoFactorEndpoint = strategy.endpoints.twoFactor\n    \n    \u002F\u002F Call the configured 2FA endpoint\n    const response = await $fetch(twoFactorEndpoint.url, {\n      method: twoFactorEndpoint.method || 'POST',\n      body: { code },\n      headers: { Authorization: token }\n    })\n    \n    \u002F\u002F Extract token and expiration using configured properties\n    const tokenProperty = twoFactorEndpoint.property || 'access_token'\n    const expiresProperty = twoFactorEndpoint.expires || 'expires_in'\n    const twoFactorToken = response[tokenProperty]\n    const expiresIn = response[expiresProperty]\n    \n    if (twoFactorToken) {\n      \u002F\u002F Use setTwoFactorCookies with configured prefix and options\n      \u002F\u002F Ensure cookie options include path: '\u002F' for proper cookie scope\n      const cookieOptions = { ...authConfig.cookieOptions, path: '\u002F' }\n      setTwoFactorCookies(\n        event,\n        strategyName,\n        twoFactorToken,\n        expiresIn ? Date.now() + expiresIn * 1000 : 0,\n        { ...authConfig, cookieOptions }\n      )\n    }\n    \n    return { success: true, token: twoFactorToken }\n  } catch (error) {\n    throw createError({\n      statusCode: 401,\n      statusMessage: 'Invalid 2FA code'\n    })\n  }\n})\n","server\u002Fapi\u002F2fa.post.ts",[206,3535,3536,3541,3566,3595,3599,3605,3624,3640,3644,3649,3690,3701,3713,3732,3739,3743,3747,3752,3791,3806,3816,3827,3840,3846,3850,3854,3875,3895,3899,3904,3931,3954,3967,3985,3991,3995,4000,4024,4048,4066,4084,4088,4101,4106,4111,4149,4157,4164,4171,4178,4211,4226,4231,4235,4239,4263,4277,4288,4299,4313,4319,4323],{"__ignoreMap":204},[209,3537,3538],{"class":211,"line":212},[209,3539,3540],{"class":377},"\u002F\u002F Custom 2FA endpoint example - matches built-in behavior\n",[209,3542,3543,3545,3547,3550,3552,3555,3557,3560,3562,3564],{"class":211,"line":234},[209,3544,216],{"class":215},[209,3546,219],{"class":215},[209,3548,3549],{"class":222}," defineEventHandler",[209,3551,227],{"class":226},[209,3553,3554],{"class":493},"async",[209,3556,1280],{"class":230},[209,3558,3559],{"class":1716},"event",[209,3561,1720],{"class":230},[209,3563,1207],{"class":493},[209,3565,244],{"class":230},[209,3567,3568,3570,3572,3575,3577,3579,3581,3583,3586,3589,3591,3593],{"class":211,"line":247},[209,3569,2675],{"class":493},[209,3571,1031],{"class":230},[209,3573,3574],{"class":226}," strategyName",[209,3576,374],{"class":230},[209,3578,1941],{"class":226},[209,3580,3083],{"class":230},[209,3582,1044],{"class":230},[209,3584,3585],{"class":215}," await",[209,3587,3588],{"class":222}," readBody",[209,3590,227],{"class":237},[209,3592,3559],{"class":226},[209,3594,455],{"class":237},[209,3596,3597],{"class":211,"line":268},[209,3598,764],{"class":237},[209,3600,3601,3603],{"class":211,"line":278},[209,3602,1215],{"class":215},[209,3604,244],{"class":230},[209,3606,3607,3610,3612,3615,3617,3619,3622],{"class":211,"line":288},[209,3608,3609],{"class":493},"    const",[209,3611,1031],{"class":230},[209,3613,3614],{"class":226}," $auth",[209,3616,3083],{"class":230},[209,3618,1044],{"class":230},[209,3620,3621],{"class":222}," useNuxtApp",[209,3623,1050],{"class":237},[209,3625,3626,3628,3631,3633,3635,3637],{"class":211,"line":298},[209,3627,3609],{"class":493},[209,3629,3630],{"class":226}," authConfig",[209,3632,1044],{"class":230},[209,3634,3614],{"class":226},[209,3636,1226],{"class":230},[209,3638,3639],{"class":226},"config\n",[209,3641,3642],{"class":211,"line":308},[209,3643,616],{"class":237},[209,3645,3646],{"class":211,"line":325},[209,3647,3648],{"class":377},"    \u002F\u002F Validate strategy\n",[209,3650,3651,3653,3655,3657,3660,3662,3665,3667,3670,3673,3676,3678,3681,3683,3686,3688],{"class":211,"line":342},[209,3652,1294],{"class":215},[209,3654,1280],{"class":237},[209,3656,3243],{"class":230},[209,3658,3659],{"class":226},"authConfig",[209,3661,1226],{"class":230},[209,3663,3664],{"class":226},"strategies",[209,3666,1841],{"class":230},[209,3668,3669],{"class":237},"[",[209,3671,3672],{"class":226},"strategyName",[209,3674,3675],{"class":237},"]",[209,3677,1841],{"class":230},[209,3679,3680],{"class":226},"endpoints",[209,3682,1841],{"class":230},[209,3684,3685],{"class":226},"twoFactor",[209,3687,1286],{"class":237},[209,3689,231],{"class":230},[209,3691,3692,3694,3697,3699],{"class":211,"line":359},[209,3693,1863],{"class":215},[209,3695,3696],{"class":222}," createError",[209,3698,227],{"class":237},[209,3700,231],{"class":230},[209,3702,3703,3706,3708,3711],{"class":211,"line":381},[209,3704,3705],{"class":237},"        statusCode",[209,3707,241],{"class":230},[209,3709,3710],{"class":1309}," 400",[209,3712,265],{"class":230},[209,3714,3715,3718,3720,3722,3725,3727,3729],{"class":211,"line":401},[209,3716,3717],{"class":237},"        statusMessage",[209,3719,241],{"class":230},[209,3721,255],{"class":230},[209,3723,3724],{"class":258},"2FA endpoint not configured for strategy ",[209,3726,262],{"class":230},[209,3728,3312],{"class":230},[209,3730,3731],{"class":226}," strategyName\n",[209,3733,3734,3737],{"class":211,"line":419},[209,3735,3736],{"class":230},"      }",[209,3738,455],{"class":237},[209,3740,3741],{"class":211,"line":425},[209,3742,440],{"class":230},[209,3744,3745],{"class":211,"line":431},[209,3746,616],{"class":237},[209,3748,3749],{"class":211,"line":437},[209,3750,3751],{"class":377},"    \u002F\u002F Get existing auth token\n",[209,3753,3754,3756,3759,3761,3764,3766,3768,3770,3772,3774,3776,3778,3780,3783,3785,3787,3789],{"class":211,"line":443},[209,3755,3609],{"class":493},[209,3757,3758],{"class":226}," token",[209,3760,1044],{"class":230},[209,3762,3763],{"class":222}," getCookie",[209,3765,227],{"class":237},[209,3767,3559],{"class":226},[209,3769,374],{"class":230},[209,3771,3630],{"class":226},[209,3773,1226],{"class":230},[209,3775,3309],{"class":226},[209,3777,3312],{"class":230},[209,3779,255],{"class":230},[209,3781,3782],{"class":258},"_token.",[209,3784,262],{"class":230},[209,3786,3312],{"class":230},[209,3788,3574],{"class":226},[209,3790,455],{"class":237},[209,3792,3793,3795,3797,3799,3802,3804],{"class":211,"line":449},[209,3794,1294],{"class":215},[209,3796,1280],{"class":237},[209,3798,3243],{"class":230},[209,3800,3801],{"class":226},"token",[209,3803,1286],{"class":237},[209,3805,231],{"class":230},[209,3807,3808,3810,3812,3814],{"class":211,"line":772},[209,3809,1863],{"class":215},[209,3811,3696],{"class":222},[209,3813,227],{"class":237},[209,3815,231],{"class":230},[209,3817,3818,3820,3822,3825],{"class":211,"line":805},[209,3819,3705],{"class":237},[209,3821,241],{"class":230},[209,3823,3824],{"class":1309}," 401",[209,3826,265],{"class":230},[209,3828,3829,3831,3833,3835,3838],{"class":211,"line":823},[209,3830,3717],{"class":237},[209,3832,241],{"class":230},[209,3834,255],{"class":230},[209,3836,3837],{"class":258},"Authentication token missing",[209,3839,1769],{"class":230},[209,3841,3842,3844],{"class":211,"line":843},[209,3843,3736],{"class":230},[209,3845,455],{"class":237},[209,3847,3848],{"class":211,"line":853},[209,3849,440],{"class":230},[209,3851,3852],{"class":211,"line":870},[209,3853,616],{"class":237},[209,3855,3856,3858,3860,3862,3864,3866,3868,3870,3872],{"class":211,"line":887},[209,3857,3609],{"class":493},[209,3859,2815],{"class":226},[209,3861,1044],{"class":230},[209,3863,3630],{"class":226},[209,3865,1226],{"class":230},[209,3867,3664],{"class":226},[209,3869,3669],{"class":237},[209,3871,3672],{"class":226},[209,3873,3874],{"class":237},"]\n",[209,3876,3877,3879,3882,3884,3886,3888,3890,3892],{"class":211,"line":903},[209,3878,3609],{"class":493},[209,3880,3881],{"class":226}," twoFactorEndpoint",[209,3883,1044],{"class":230},[209,3885,2815],{"class":226},[209,3887,1226],{"class":230},[209,3889,3680],{"class":226},[209,3891,1226],{"class":230},[209,3893,3894],{"class":226},"twoFactor\n",[209,3896,3897],{"class":211,"line":918},[209,3898,616],{"class":237},[209,3900,3901],{"class":211,"line":926},[209,3902,3903],{"class":377},"    \u002F\u002F Call the configured 2FA endpoint\n",[209,3905,3906,3908,3911,3913,3915,3917,3919,3922,3924,3927,3929],{"class":211,"line":932},[209,3907,3609],{"class":493},[209,3909,3910],{"class":226}," response",[209,3912,1044],{"class":230},[209,3914,3585],{"class":215},[209,3916,2775],{"class":222},[209,3918,227],{"class":237},[209,3920,3921],{"class":226},"twoFactorEndpoint",[209,3923,1226],{"class":230},[209,3925,3926],{"class":226},"url",[209,3928,374],{"class":230},[209,3930,244],{"class":230},[209,3932,3933,3935,3937,3939,3941,3944,3946,3948,3950,3952],{"class":211,"line":962},[209,3934,2793],{"class":237},[209,3936,241],{"class":230},[209,3938,3881],{"class":226},[209,3940,1226],{"class":230},[209,3942,3943],{"class":226},"method",[209,3945,1847],{"class":230},[209,3947,255],{"class":230},[209,3949,335],{"class":258},[209,3951,262],{"class":230},[209,3953,265],{"class":230},[209,3955,3956,3958,3960,3962,3964],{"class":211,"line":968},[209,3957,2808],{"class":237},[209,3959,241],{"class":230},[209,3961,1031],{"class":230},[209,3963,1941],{"class":226},[209,3965,3966],{"class":230}," },\n",[209,3968,3969,3972,3974,3976,3979,3981,3983],{"class":211,"line":978},[209,3970,3971],{"class":237},"      headers",[209,3973,241],{"class":230},[209,3975,1031],{"class":230},[209,3977,3978],{"class":237}," Authorization",[209,3980,241],{"class":230},[209,3982,3758],{"class":226},[209,3984,2826],{"class":230},[209,3986,3987,3989],{"class":211,"line":987},[209,3988,1340],{"class":230},[209,3990,455],{"class":237},[209,3992,3993],{"class":211,"line":996},[209,3994,616],{"class":237},[209,3996,3997],{"class":211,"line":1005},[209,3998,3999],{"class":377},"    \u002F\u002F Extract token and expiration using configured properties\n",[209,4001,4002,4004,4007,4009,4011,4013,4016,4018,4020,4022],{"class":211,"line":1012},[209,4003,3609],{"class":493},[209,4005,4006],{"class":226}," tokenProperty",[209,4008,1044],{"class":230},[209,4010,3881],{"class":226},[209,4012,1226],{"class":230},[209,4014,4015],{"class":226},"property",[209,4017,1847],{"class":230},[209,4019,255],{"class":230},[209,4021,369],{"class":258},[209,4023,1769],{"class":230},[209,4025,4026,4028,4031,4033,4035,4037,4040,4042,4044,4046],{"class":211,"line":1025},[209,4027,3609],{"class":493},[209,4029,4030],{"class":226}," expiresProperty",[209,4032,1044],{"class":230},[209,4034,3881],{"class":226},[209,4036,1226],{"class":230},[209,4038,4039],{"class":226},"expires",[209,4041,1847],{"class":230},[209,4043,255],{"class":230},[209,4045,391],{"class":258},[209,4047,1769],{"class":230},[209,4049,4050,4052,4055,4057,4059,4061,4064],{"class":211,"line":1053},[209,4051,3609],{"class":493},[209,4053,4054],{"class":226}," twoFactorToken",[209,4056,1044],{"class":230},[209,4058,3910],{"class":226},[209,4060,3669],{"class":237},[209,4062,4063],{"class":226},"tokenProperty",[209,4065,3874],{"class":237},[209,4067,4068,4070,4073,4075,4077,4079,4082],{"class":211,"line":1058},[209,4069,3609],{"class":493},[209,4071,4072],{"class":226}," expiresIn",[209,4074,1044],{"class":230},[209,4076,3910],{"class":226},[209,4078,3669],{"class":237},[209,4080,4081],{"class":226},"expiresProperty",[209,4083,3874],{"class":237},[209,4085,4086],{"class":211,"line":1075},[209,4087,616],{"class":237},[209,4089,4090,4092,4094,4097,4099],{"class":211,"line":1088},[209,4091,1294],{"class":215},[209,4093,1280],{"class":237},[209,4095,4096],{"class":226},"twoFactorToken",[209,4098,1286],{"class":237},[209,4100,231],{"class":230},[209,4102,4103],{"class":211,"line":1099},[209,4104,4105],{"class":377},"      \u002F\u002F Use setTwoFactorCookies with configured prefix and options\n",[209,4107,4108],{"class":211,"line":1106},[209,4109,4110],{"class":377},"      \u002F\u002F Ensure cookie options include path: '\u002F' for proper cookie scope\n",[209,4112,4113,4116,4119,4121,4123,4126,4128,4130,4133,4135,4138,4140,4142,4145,4147],{"class":211,"line":1111},[209,4114,4115],{"class":493},"      const",[209,4117,4118],{"class":226}," cookieOptions",[209,4120,1044],{"class":230},[209,4122,1031],{"class":230},[209,4124,4125],{"class":230}," ...",[209,4127,3659],{"class":226},[209,4129,1226],{"class":230},[209,4131,4132],{"class":226},"cookieOptions",[209,4134,374],{"class":230},[209,4136,4137],{"class":237}," path",[209,4139,241],{"class":230},[209,4141,255],{"class":230},[209,4143,4144],{"class":258},"\u002F",[209,4146,262],{"class":230},[209,4148,2826],{"class":230},[209,4150,4151,4154],{"class":211,"line":1131},[209,4152,4153],{"class":222},"      setTwoFactorCookies",[209,4155,4156],{"class":237},"(\n",[209,4158,4159,4162],{"class":211,"line":1150},[209,4160,4161],{"class":226},"        event",[209,4163,265],{"class":230},[209,4165,4166,4169],{"class":211,"line":1168},[209,4167,4168],{"class":226},"        strategyName",[209,4170,265],{"class":230},[209,4172,4173,4176],{"class":211,"line":1186},[209,4174,4175],{"class":226},"        twoFactorToken",[209,4177,265],{"class":230},[209,4179,4180,4183,4185,4187,4189,4191,4193,4196,4198,4201,4204,4206,4209],{"class":211,"line":1191},[209,4181,4182],{"class":226},"        expiresIn",[209,4184,2697],{"class":230},[209,4186,3391],{"class":226},[209,4188,1226],{"class":230},[209,4190,3396],{"class":222},[209,4192,3399],{"class":237},[209,4194,4195],{"class":230},"+",[209,4197,4072],{"class":226},[209,4199,4200],{"class":230}," *",[209,4202,4203],{"class":1309}," 1000",[209,4205,2707],{"class":230},[209,4207,4208],{"class":1309}," 0",[209,4210,265],{"class":230},[209,4212,4213,4216,4218,4220,4222,4224],{"class":211,"line":1212},[209,4214,4215],{"class":230},"        {",[209,4217,4125],{"class":230},[209,4219,3659],{"class":226},[209,4221,374],{"class":230},[209,4223,4118],{"class":226},[209,4225,2826],{"class":230},[209,4227,4228],{"class":211,"line":1220},[209,4229,4230],{"class":237},"      )\n",[209,4232,4233],{"class":211,"line":1237},[209,4234,440],{"class":230},[209,4236,4237],{"class":211,"line":1265},[209,4238,616],{"class":237},[209,4240,4241,4243,4245,4248,4250,4253,4255,4257,4259,4261],{"class":211,"line":1271},[209,4242,3264],{"class":215},[209,4244,1031],{"class":230},[209,4246,4247],{"class":237}," success",[209,4249,241],{"class":230},[209,4251,4252],{"class":1125}," true",[209,4254,374],{"class":230},[209,4256,3758],{"class":237},[209,4258,241],{"class":230},[209,4260,4054],{"class":226},[209,4262,2826],{"class":230},[209,4264,4265,4267,4269,4271,4273,4275],{"class":211,"line":1291},[209,4266,1274],{"class":230},[209,4268,1277],{"class":215},[209,4270,1280],{"class":237},[209,4272,1283],{"class":226},[209,4274,1286],{"class":237},[209,4276,231],{"class":230},[209,4278,4279,4282,4284,4286],{"class":211,"line":1317},[209,4280,4281],{"class":215},"    throw",[209,4283,3696],{"class":222},[209,4285,227],{"class":237},[209,4287,231],{"class":230},[209,4289,4290,4293,4295,4297],{"class":211,"line":1323},[209,4291,4292],{"class":237},"      statusCode",[209,4294,241],{"class":230},[209,4296,3824],{"class":1309},[209,4298,265],{"class":230},[209,4300,4301,4304,4306,4308,4311],{"class":211,"line":1337},[209,4302,4303],{"class":237},"      statusMessage",[209,4305,241],{"class":230},[209,4307,255],{"class":230},[209,4309,4310],{"class":258},"Invalid 2FA code",[209,4312,1769],{"class":230},[209,4314,4315,4317],{"class":211,"line":1348},[209,4316,1340],{"class":230},[209,4318,455],{"class":237},[209,4320,4321],{"class":211,"line":1374},[209,4322,446],{"class":230},[209,4324,4325,4327],{"class":211,"line":1379},[209,4326,452],{"class":230},[209,4328,455],{"class":226},[176,4330,4331,4335,4336,4338,4339,4342],{},[4332,4333,4334],"strong",{},"Note:"," The built-in handler is automatically registered at ",[206,4337,3528],{}," where the alias comes from your endpoint configuration. Use the ",[206,4340,4341],{},"twoFactor()"," composable instead of creating custom endpoints.",[461,4344,4346],{"id":4345},"_2fa-middleware","2FA Middleware",[198,4348,4351],{"className":200,"code":4349,"filename":4350,"language":203,"meta":204,"style":204},"export default defineNuxtRouteMiddleware(async (to) => {\n  const { loggedIn, user } = useAuth()\n  \n  if (!loggedIn.value) {\n    return navigateTo('\u002Flogin')\n  }\n  \n  \u002F\u002F Check if user has 2FA enabled but not verified\n  if (user.value?.two_factor_enabled && !user.value?.two_factor_verified) {\n    return navigateTo('\u002F2fa\u002Fverify')\n  }\n  \n  \u002F\u002F Check 2FA token expiration\n  \u002F\u002F Note: 2FA expiration is stored in httpOnly cookies and validated server-side\n  \u002F\u002F Client-side expiration check is not available\n  \n  if (is2FAExpired.value && user.value?.two_factor_enabled) {\n    return navigateTo('\u002F2fa\u002Fverify')\n  }\n})\n","middleware\u002F2fa.ts",[206,4352,4353,4377,4397,4401,4420,4438,4442,4446,4451,4489,4506,4510,4514,4519,4524,4529,4533,4562,4578,4582],{"__ignoreMap":204},[209,4354,4355,4357,4359,4362,4364,4366,4368,4371,4373,4375],{"class":211,"line":212},[209,4356,216],{"class":215},[209,4358,219],{"class":215},[209,4360,4361],{"class":222}," defineNuxtRouteMiddleware",[209,4363,227],{"class":226},[209,4365,3554],{"class":493},[209,4367,1280],{"class":230},[209,4369,4370],{"class":1716},"to",[209,4372,1720],{"class":230},[209,4374,1207],{"class":493},[209,4376,244],{"class":230},[209,4378,4379,4381,4383,4385,4387,4389,4391,4393,4395],{"class":211,"line":234},[209,4380,2675],{"class":493},[209,4382,1031],{"class":230},[209,4384,1629],{"class":226},[209,4386,374],{"class":230},[209,4388,1634],{"class":226},[209,4390,3083],{"class":230},[209,4392,1044],{"class":230},[209,4394,1047],{"class":222},[209,4396,1050],{"class":237},[209,4398,4399],{"class":211,"line":247},[209,4400,764],{"class":237},[209,4402,4403,4405,4407,4409,4412,4414,4416,4418],{"class":211,"line":268},[209,4404,3238],{"class":215},[209,4406,1280],{"class":237},[209,4408,3243],{"class":230},[209,4410,4411],{"class":226},"loggedIn",[209,4413,1226],{"class":230},[209,4415,1229],{"class":226},[209,4417,1286],{"class":237},[209,4419,231],{"class":230},[209,4421,4422,4424,4427,4429,4431,4434,4436],{"class":211,"line":278},[209,4423,3264],{"class":215},[209,4425,4426],{"class":222}," navigateTo",[209,4428,227],{"class":237},[209,4430,262],{"class":230},[209,4432,4433],{"class":258},"\u002Flogin",[209,4435,262],{"class":230},[209,4437,455],{"class":237},[209,4439,4440],{"class":211,"line":288},[209,4441,446],{"class":230},[209,4443,4444],{"class":211,"line":298},[209,4445,764],{"class":237},[209,4447,4448],{"class":211,"line":308},[209,4449,4450],{"class":377},"  \u002F\u002F Check if user has 2FA enabled but not verified\n",[209,4452,4453,4455,4457,4460,4462,4464,4466,4469,4471,4474,4476,4478,4480,4482,4485,4487],{"class":211,"line":325},[209,4454,3238],{"class":215},[209,4456,1280],{"class":237},[209,4458,4459],{"class":226},"user",[209,4461,1226],{"class":230},[209,4463,1229],{"class":226},[209,4465,1841],{"class":230},[209,4467,4468],{"class":226},"two_factor_enabled",[209,4470,3462],{"class":230},[209,4472,4473],{"class":230}," !",[209,4475,4459],{"class":226},[209,4477,1226],{"class":230},[209,4479,1229],{"class":226},[209,4481,1841],{"class":230},[209,4483,4484],{"class":226},"two_factor_verified",[209,4486,1286],{"class":237},[209,4488,231],{"class":230},[209,4490,4491,4493,4495,4497,4499,4502,4504],{"class":211,"line":342},[209,4492,3264],{"class":215},[209,4494,4426],{"class":222},[209,4496,227],{"class":237},[209,4498,262],{"class":230},[209,4500,4501],{"class":258},"\u002F2fa\u002Fverify",[209,4503,262],{"class":230},[209,4505,455],{"class":237},[209,4507,4508],{"class":211,"line":359},[209,4509,446],{"class":230},[209,4511,4512],{"class":211,"line":381},[209,4513,764],{"class":237},[209,4515,4516],{"class":211,"line":401},[209,4517,4518],{"class":377},"  \u002F\u002F Check 2FA token expiration\n",[209,4520,4521],{"class":211,"line":419},[209,4522,4523],{"class":377},"  \u002F\u002F Note: 2FA expiration is stored in httpOnly cookies and validated server-side\n",[209,4525,4526],{"class":211,"line":425},[209,4527,4528],{"class":377},"  \u002F\u002F Client-side expiration check is not available\n",[209,4530,4531],{"class":211,"line":431},[209,4532,764],{"class":237},[209,4534,4535,4537,4539,4542,4544,4546,4548,4550,4552,4554,4556,4558,4560],{"class":211,"line":437},[209,4536,3238],{"class":215},[209,4538,1280],{"class":237},[209,4540,4541],{"class":226},"is2FAExpired",[209,4543,1226],{"class":230},[209,4545,1229],{"class":226},[209,4547,3462],{"class":230},[209,4549,1634],{"class":226},[209,4551,1226],{"class":230},[209,4553,1229],{"class":226},[209,4555,1841],{"class":230},[209,4557,4468],{"class":226},[209,4559,1286],{"class":237},[209,4561,231],{"class":230},[209,4563,4564,4566,4568,4570,4572,4574,4576],{"class":211,"line":443},[209,4565,3264],{"class":215},[209,4567,4426],{"class":222},[209,4569,227],{"class":237},[209,4571,262],{"class":230},[209,4573,4501],{"class":258},[209,4575,262],{"class":230},[209,4577,455],{"class":237},[209,4579,4580],{"class":211,"line":449},[209,4581,446],{"class":230},[209,4583,4584,4586],{"class":211,"line":772},[209,4585,452],{"class":230},[209,4587,455],{"class":226},[183,4589,4591],{"id":4590},"_2fa-best-practices","2FA Best Practices",[461,4593,4595],{"id":4594},"security-considerations","Security Considerations",[198,4597,4599],{"className":467,"code":4598,"language":469,"meta":204,"style":204},"\u003Cscript setup>\n\u002F\u002F UX feedback for 2FA attempts\nconst twoFactorAttempts = ref(0)\n\nconst handle2FA = async (code) => {\n  try {\n    await twoFactor('client', code)\n    twoFactorAttempts.value = 0 \u002F\u002F Reset on success\n  } catch (error) {\n    twoFactorAttempts.value++ \u002F\u002F Increment for UX display\n    \u002F\u002F Server enforces rate limiting and account lockout\n    \u002F\u002F Handle server response for lockout scenarios\n  }\n}\n\u003C\u002Fscript>\n",[206,4600,4601,4611,4616,4634,4638,4658,4664,4684,4700,4714,4728,4733,4738,4742,4746],{"__ignoreMap":204},[209,4602,4603,4605,4607,4609],{"class":211,"line":212},[209,4604,476],{"class":230},[209,4606,1017],{"class":237},[209,4608,1020],{"class":493},[209,4610,482],{"class":230},[209,4612,4613],{"class":211,"line":234},[209,4614,4615],{"class":377},"\u002F\u002F UX feedback for 2FA attempts\n",[209,4617,4618,4620,4623,4625,4627,4629,4632],{"class":211,"line":247},[209,4619,1028],{"class":493},[209,4621,4622],{"class":226}," twoFactorAttempts ",[209,4624,497],{"class":230},[209,4626,1068],{"class":222},[209,4628,227],{"class":226},[209,4630,4631],{"class":1309},"0",[209,4633,455],{"class":226},[209,4635,4636],{"class":211,"line":268},[209,4637,1009],{"emptyLinePlaceholder":1008},[209,4639,4640,4642,4644,4646,4648,4650,4652,4654,4656],{"class":211,"line":278},[209,4641,1028],{"class":493},[209,4643,1424],{"class":226},[209,4645,497],{"class":230},[209,4647,1201],{"class":493},[209,4649,1280],{"class":230},[209,4651,206],{"class":1716},[209,4653,1720],{"class":230},[209,4655,1207],{"class":493},[209,4657,244],{"class":230},[209,4659,4660,4662],{"class":211,"line":288},[209,4661,1215],{"class":215},[209,4663,244],{"class":230},[209,4665,4666,4668,4670,4672,4674,4676,4678,4680,4682],{"class":211,"line":298},[209,4667,1240],{"class":215},[209,4669,1463],{"class":222},[209,4671,227],{"class":237},[209,4673,262],{"class":230},[209,4675,1249],{"class":258},[209,4677,262],{"class":230},[209,4679,374],{"class":230},[209,4681,1941],{"class":226},[209,4683,455],{"class":237},[209,4685,4686,4689,4691,4693,4695,4697],{"class":211,"line":308},[209,4687,4688],{"class":226},"    twoFactorAttempts",[209,4690,1226],{"class":230},[209,4692,1229],{"class":226},[209,4694,1044],{"class":230},[209,4696,4208],{"class":1309},[209,4698,4699],{"class":377}," \u002F\u002F Reset on success\n",[209,4701,4702,4704,4706,4708,4710,4712],{"class":211,"line":325},[209,4703,1274],{"class":230},[209,4705,1277],{"class":215},[209,4707,1280],{"class":237},[209,4709,1283],{"class":226},[209,4711,1286],{"class":237},[209,4713,231],{"class":230},[209,4715,4716,4718,4720,4722,4725],{"class":211,"line":342},[209,4717,4688],{"class":226},[209,4719,1226],{"class":230},[209,4721,1229],{"class":226},[209,4723,4724],{"class":230},"++",[209,4726,4727],{"class":377}," \u002F\u002F Increment for UX display\n",[209,4729,4730],{"class":211,"line":359},[209,4731,4732],{"class":377},"    \u002F\u002F Server enforces rate limiting and account lockout\n",[209,4734,4735],{"class":211,"line":381},[209,4736,4737],{"class":377},"    \u002F\u002F Handle server response for lockout scenarios\n",[209,4739,4740],{"class":211,"line":401},[209,4741,446],{"class":230},[209,4743,4744],{"class":211,"line":419},[209,4745,1411],{"class":230},[209,4747,4748,4750,4752],{"class":211,"line":425},[209,4749,551],{"class":230},[209,4751,1017],{"class":237},[209,4753,482],{"class":230},[461,4755,4757],{"id":4756},"backup-codes","Backup Codes",[198,4759,4761],{"className":467,"code":4760,"language":469,"meta":204,"style":204},"\u003Cscript setup>\nconst backupCodes = ref([])\nconst showBackupCodes = ref(false)\n\nconst generateBackupCodes = async () => {\n  try {\n    const response = await $fetch('\u002Fapi\u002F2fa\u002Fbackup-codes', {\n      method: 'POST'\n    })\n    backupCodes.value = response.codes\n    showBackupCodes.value = true\n  } catch (error) {\n    console.error('Failed to generate backup codes:', error)\n  }\n}\n\nconst useBackupCode = async (code) => {\n  try {\n    await twoFactor('client', { code, method: 'backup' })\n    showBackupCodes.value = false\n  } catch (error) {\n    console.error('Invalid backup code:', error)\n  }\n}\n\u003C\u002Fscript>\n",[206,4762,4763,4773,4787,4804,4808,4825,4831,4856,4868,4874,4892,4905,4919,4942,4946,4950,4954,4975,4981,5018,5030,5044,5067,5071,5075],{"__ignoreMap":204},[209,4764,4765,4767,4769,4771],{"class":211,"line":212},[209,4766,476],{"class":230},[209,4768,1017],{"class":237},[209,4770,1020],{"class":493},[209,4772,482],{"class":230},[209,4774,4775,4777,4780,4782,4784],{"class":211,"line":234},[209,4776,1028],{"class":493},[209,4778,4779],{"class":226}," backupCodes ",[209,4781,497],{"class":230},[209,4783,1068],{"class":222},[209,4785,4786],{"class":226},"([])\n",[209,4788,4789,4791,4794,4796,4798,4800,4802],{"class":211,"line":247},[209,4790,1028],{"class":493},[209,4792,4793],{"class":226}," showBackupCodes ",[209,4795,497],{"class":230},[209,4797,1068],{"class":222},[209,4799,227],{"class":226},[209,4801,1126],{"class":1125},[209,4803,455],{"class":226},[209,4805,4806],{"class":211,"line":268},[209,4807,1009],{"emptyLinePlaceholder":1008},[209,4809,4810,4812,4815,4817,4819,4821,4823],{"class":211,"line":278},[209,4811,1028],{"class":493},[209,4813,4814],{"class":226}," generateBackupCodes ",[209,4816,497],{"class":230},[209,4818,1201],{"class":493},[209,4820,1204],{"class":230},[209,4822,1207],{"class":493},[209,4824,244],{"class":230},[209,4826,4827,4829],{"class":211,"line":288},[209,4828,1215],{"class":215},[209,4830,244],{"class":230},[209,4832,4833,4835,4837,4839,4841,4843,4845,4847,4850,4852,4854],{"class":211,"line":298},[209,4834,3609],{"class":493},[209,4836,3910],{"class":226},[209,4838,1044],{"class":230},[209,4840,3585],{"class":215},[209,4842,2775],{"class":222},[209,4844,227],{"class":237},[209,4846,262],{"class":230},[209,4848,4849],{"class":258},"\u002Fapi\u002F2fa\u002Fbackup-codes",[209,4851,262],{"class":230},[209,4853,374],{"class":230},[209,4855,244],{"class":230},[209,4857,4858,4860,4862,4864,4866],{"class":211,"line":308},[209,4859,2793],{"class":237},[209,4861,241],{"class":230},[209,4863,255],{"class":230},[209,4865,335],{"class":258},[209,4867,1769],{"class":230},[209,4869,4870,4872],{"class":211,"line":325},[209,4871,1340],{"class":230},[209,4873,455],{"class":237},[209,4875,4876,4879,4881,4883,4885,4887,4889],{"class":211,"line":342},[209,4877,4878],{"class":226},"    backupCodes",[209,4880,1226],{"class":230},[209,4882,1229],{"class":226},[209,4884,1044],{"class":230},[209,4886,3910],{"class":226},[209,4888,1226],{"class":230},[209,4890,4891],{"class":226},"codes\n",[209,4893,4894,4897,4899,4901,4903],{"class":211,"line":359},[209,4895,4896],{"class":226},"    showBackupCodes",[209,4898,1226],{"class":230},[209,4900,1229],{"class":226},[209,4902,1044],{"class":230},[209,4904,1234],{"class":1125},[209,4906,4907,4909,4911,4913,4915,4917],{"class":211,"line":381},[209,4908,1274],{"class":230},[209,4910,1277],{"class":215},[209,4912,1280],{"class":237},[209,4914,1283],{"class":226},[209,4916,1286],{"class":237},[209,4918,231],{"class":230},[209,4920,4921,4923,4925,4927,4929,4931,4934,4936,4938,4940],{"class":211,"line":401},[209,4922,1537],{"class":226},[209,4924,1226],{"class":230},[209,4926,1283],{"class":222},[209,4928,227],{"class":237},[209,4930,262],{"class":230},[209,4932,4933],{"class":258},"Failed to generate backup codes:",[209,4935,262],{"class":230},[209,4937,374],{"class":230},[209,4939,1369],{"class":226},[209,4941,455],{"class":237},[209,4943,4944],{"class":211,"line":419},[209,4945,446],{"class":230},[209,4947,4948],{"class":211,"line":425},[209,4949,1411],{"class":230},[209,4951,4952],{"class":211,"line":431},[209,4953,1009],{"emptyLinePlaceholder":1008},[209,4955,4956,4958,4961,4963,4965,4967,4969,4971,4973],{"class":211,"line":437},[209,4957,1028],{"class":493},[209,4959,4960],{"class":226}," useBackupCode ",[209,4962,497],{"class":230},[209,4964,1201],{"class":493},[209,4966,1280],{"class":230},[209,4968,206],{"class":1716},[209,4970,1720],{"class":230},[209,4972,1207],{"class":493},[209,4974,244],{"class":230},[209,4976,4977,4979],{"class":211,"line":443},[209,4978,1215],{"class":215},[209,4980,244],{"class":230},[209,4982,4983,4985,4987,4989,4991,4993,4995,4997,4999,5001,5003,5005,5007,5009,5012,5014,5016],{"class":211,"line":449},[209,4984,1240],{"class":215},[209,4986,1463],{"class":222},[209,4988,227],{"class":237},[209,4990,262],{"class":230},[209,4992,1249],{"class":258},[209,4994,262],{"class":230},[209,4996,374],{"class":230},[209,4998,1031],{"class":230},[209,5000,1941],{"class":226},[209,5002,374],{"class":230},[209,5004,1901],{"class":237},[209,5006,241],{"class":230},[209,5008,255],{"class":230},[209,5010,5011],{"class":258},"backup",[209,5013,262],{"class":230},[209,5015,3083],{"class":230},[209,5017,455],{"class":237},[209,5019,5020,5022,5024,5026,5028],{"class":211,"line":772},[209,5021,4896],{"class":226},[209,5023,1226],{"class":230},[209,5025,1229],{"class":226},[209,5027,1044],{"class":230},[209,5029,1400],{"class":1125},[209,5031,5032,5034,5036,5038,5040,5042],{"class":211,"line":805},[209,5033,1274],{"class":230},[209,5035,1277],{"class":215},[209,5037,1280],{"class":237},[209,5039,1283],{"class":226},[209,5041,1286],{"class":237},[209,5043,231],{"class":230},[209,5045,5046,5048,5050,5052,5054,5056,5059,5061,5063,5065],{"class":211,"line":823},[209,5047,1537],{"class":226},[209,5049,1226],{"class":230},[209,5051,1283],{"class":222},[209,5053,227],{"class":237},[209,5055,262],{"class":230},[209,5057,5058],{"class":258},"Invalid backup code:",[209,5060,262],{"class":230},[209,5062,374],{"class":230},[209,5064,1369],{"class":226},[209,5066,455],{"class":237},[209,5068,5069],{"class":211,"line":843},[209,5070,446],{"class":230},[209,5072,5073],{"class":211,"line":853},[209,5074,1411],{"class":230},[209,5076,5077,5079,5081],{"class":211,"line":870},[209,5078,551],{"class":230},[209,5080,1017],{"class":237},[209,5082,482],{"class":230},[461,5084,5086],{"id":5085},"_2fa-recovery","2FA Recovery",[198,5088,5090],{"className":467,"code":5089,"language":469,"meta":204,"style":204},"\u003Cscript setup>\nconst recoveryEmail = ref('')\nconst showRecovery = ref(false)\n\nconst initiateRecovery = async () => {\n  try {\n    await $fetch('\u002Fapi\u002F2fa\u002Frecovery', {\n      method: 'POST',\n      body: { email: recoveryEmail.value }\n    })\n    console.log('Recovery email sent')\n  } catch (error) {\n    console.error('Recovery failed:', error)\n  }\n}\n\u003C\u002Fscript>\n",[206,5091,5092,5102,5119,5136,5140,5157,5163,5182,5196,5218,5224,5243,5257,5280,5284,5288],{"__ignoreMap":204},[209,5093,5094,5096,5098,5100],{"class":211,"line":212},[209,5095,476],{"class":230},[209,5097,1017],{"class":237},[209,5099,1020],{"class":493},[209,5101,482],{"class":230},[209,5103,5104,5106,5109,5111,5113,5115,5117],{"class":211,"line":234},[209,5105,1028],{"class":493},[209,5107,5108],{"class":226}," recoveryEmail ",[209,5110,497],{"class":230},[209,5112,1068],{"class":222},[209,5114,227],{"class":226},[209,5116,1145],{"class":230},[209,5118,455],{"class":226},[209,5120,5121,5123,5126,5128,5130,5132,5134],{"class":211,"line":247},[209,5122,1028],{"class":493},[209,5124,5125],{"class":226}," showRecovery ",[209,5127,497],{"class":230},[209,5129,1068],{"class":222},[209,5131,227],{"class":226},[209,5133,1126],{"class":1125},[209,5135,455],{"class":226},[209,5137,5138],{"class":211,"line":268},[209,5139,1009],{"emptyLinePlaceholder":1008},[209,5141,5142,5144,5147,5149,5151,5153,5155],{"class":211,"line":278},[209,5143,1028],{"class":493},[209,5145,5146],{"class":226}," initiateRecovery ",[209,5148,497],{"class":230},[209,5150,1201],{"class":493},[209,5152,1204],{"class":230},[209,5154,1207],{"class":493},[209,5156,244],{"class":230},[209,5158,5159,5161],{"class":211,"line":288},[209,5160,1215],{"class":215},[209,5162,244],{"class":230},[209,5164,5165,5167,5169,5171,5173,5176,5178,5180],{"class":211,"line":298},[209,5166,1240],{"class":215},[209,5168,2775],{"class":222},[209,5170,227],{"class":237},[209,5172,262],{"class":230},[209,5174,5175],{"class":258},"\u002Fapi\u002F2fa\u002Frecovery",[209,5177,262],{"class":230},[209,5179,374],{"class":230},[209,5181,244],{"class":230},[209,5183,5184,5186,5188,5190,5192,5194],{"class":211,"line":308},[209,5185,2793],{"class":237},[209,5187,241],{"class":230},[209,5189,255],{"class":230},[209,5191,335],{"class":258},[209,5193,262],{"class":230},[209,5195,265],{"class":230},[209,5197,5198,5200,5202,5204,5207,5209,5212,5214,5216],{"class":211,"line":325},[209,5199,2808],{"class":237},[209,5201,241],{"class":230},[209,5203,1031],{"class":230},[209,5205,5206],{"class":237}," email",[209,5208,241],{"class":230},[209,5210,5211],{"class":226}," recoveryEmail",[209,5213,1226],{"class":230},[209,5215,1229],{"class":226},[209,5217,2826],{"class":230},[209,5219,5220,5222],{"class":211,"line":342},[209,5221,1340],{"class":230},[209,5223,455],{"class":237},[209,5225,5226,5228,5230,5232,5234,5236,5239,5241],{"class":211,"line":359},[209,5227,1537],{"class":226},[209,5229,1226],{"class":230},[209,5231,2841],{"class":222},[209,5233,227],{"class":237},[209,5235,262],{"class":230},[209,5237,5238],{"class":258},"Recovery email sent",[209,5240,262],{"class":230},[209,5242,455],{"class":237},[209,5244,5245,5247,5249,5251,5253,5255],{"class":211,"line":381},[209,5246,1274],{"class":230},[209,5248,1277],{"class":215},[209,5250,1280],{"class":237},[209,5252,1283],{"class":226},[209,5254,1286],{"class":237},[209,5256,231],{"class":230},[209,5258,5259,5261,5263,5265,5267,5269,5272,5274,5276,5278],{"class":211,"line":401},[209,5260,1537],{"class":226},[209,5262,1226],{"class":230},[209,5264,1283],{"class":222},[209,5266,227],{"class":237},[209,5268,262],{"class":230},[209,5270,5271],{"class":258},"Recovery failed:",[209,5273,262],{"class":230},[209,5275,374],{"class":230},[209,5277,1369],{"class":226},[209,5279,455],{"class":237},[209,5281,5282],{"class":211,"line":419},[209,5283,446],{"class":230},[209,5285,5286],{"class":211,"line":425},[209,5287,1411],{"class":230},[209,5289,5290,5292,5294],{"class":211,"line":431},[209,5291,551],{"class":230},[209,5293,1017],{"class":237},[209,5295,482],{"class":230},[183,5297,5299],{"id":5298},"troubleshooting-2fa","Troubleshooting 2FA",[461,5301,5303],{"id":5302},"common-issues","Common Issues",[5305,5306,5307,5323],"table",{},[5308,5309,5310],"thead",{},[5311,5312,5313,5317,5320],"tr",{},[5314,5315,5316],"th",{},"Issue",[5314,5318,5319],{},"Cause",[5314,5321,5322],{},"Solution",[5324,5325,5326,5337,5348,5359],"tbody",{},[5311,5327,5328,5331,5334],{},[5329,5330,4310],"td",{},[5329,5332,5333],{},"Incorrect code or expired",[5329,5335,5336],{},"Check code and time sync",[5311,5338,5339,5342,5345],{},[5329,5340,5341],{},"2FA token expired",[5329,5343,5344],{},"Token reached expiration",[5329,5346,5347],{},"Re-authenticate",[5311,5349,5350,5353,5356],{},[5329,5351,5352],{},"Missing 2FA endpoint",[5329,5354,5355],{},"Configuration error",[5329,5357,5358],{},"Verify endpoint configuration",[5311,5360,5361,5364,5367],{},[5329,5362,5363],{},"2FA not working",[5329,5365,5366],{},"Server-side issue",[5329,5368,5369],{},"Check Laravel Passport 2FA setup",[461,5371,5373],{"id":5372},"debug-2fa","Debug 2FA",[198,5375,5377],{"className":467,"code":5376,"language":469,"meta":204,"style":204},"\u003Ctemplate>\n  \u003Cdiv class=\"debug-2fa\">\n    \u003Ch3>2FA Debug Info\u003C\u002Fh3>\n    \u003Cp>Logged In: {{ loggedIn }}\u003C\u002Fp>\n    \u003Cp>2FA Enabled: {{ user?.two_factor_enabled }}\u003C\u002Fp>\n    \u003Cp>2FA Verified: {{ user?.two_factor_verified }}\u003C\u002Fp>\n    \u003Cp>2FA Token Present: {{ has2FAToken }}\u003C\u002Fp>\n    \u003Cp>2FA Expired: {{ is2FAExpired }}\u003C\u002Fp>\n    \u003Cbutton @click=\"inspectTokens\">Inspect Tokens\u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nconst { loggedIn, user, headers } = useAuth()\n\nconst has2FAToken = computed(() => {\n  return headers.value.has('2fa')\n})\n\nconst is2FAExpired = computed(() => {\n  \u002F\u002F Follows middleware pattern: server-side cookie extraction, client-side state handling\n  if (!import.meta.client) {\n    return false \u002F\u002F Server handles validation via httpOnly cookies\n  }\n\n  \u002F\u002F Client-side: check localStorage for expiration (if stored)\n  \u002F\u002F Note: 2FA cookies are httpOnly, but expiration may be mirrored in localStorage\n  const { $auth } = useAuth()\n  const strategy = localStorage.getItem($auth.prefix + 'strategy')\n  const expiration = strategy \n    ? localStorage.getItem($auth.prefix + '_2fa_expiration.' + strategy)\n    : null\n\n  return expiration ? Date.now() > parseInt(expiration) : true\n})\n\nconst inspectTokens = () => {\n  const { headers, $auth } = useAuth()\n  \n  \u002F\u002F Check token presence via headers (non-sensitive)\n  console.log('Auth Token Present:', headers.value.has('authorization'))\n  console.log('2FA Token Present:', headers.value.has('2fa'))\n  \n  \u002F\u002F Check strategy and expiration status (non-sensitive metadata)\n  if (import.meta.client) {\n    const strategy = localStorage.getItem($auth.prefix + 'strategy')\n    console.log('Strategy:', strategy || 'Not set')\n    \n    if (strategy) {\n      const expiration = localStorage.getItem($auth.prefix + '_token_expiration.' + strategy)\n      const twoFactorExpiration = localStorage.getItem($auth.prefix + '_2fa_expiration.' + strategy)\n      \n      console.log('Auth Token Status:', expiration \n        ? (Date.now() > parseInt(expiration) ? 'Expired' : 'Active') \n        : 'Unknown')\n      console.log('2FA Token Status:', twoFactorExpiration \n        ? (Date.now() > parseInt(twoFactorExpiration) ? 'Expired' : 'Active') \n        : 'Not set')\n    }\n  }\n  \n  \u002F\u002F Note: Raw token values are never logged for security\n}\n\u003C\u002Fscript>\n",[206,5378,5379,5387,5405,5422,5439,5456,5473,5490,5507,5535,5543,5551,5555,5565,5589,5593,5611,5635,5641,5645,5663,5668,5690,5698,5702,5706,5711,5716,5732,5764,5776,5808,5814,5818,5848,5854,5858,5873,5893,5897,5902,5942,5980,5984,5989,6009,6041,6073,6077,6089,6126,6163,6168,6191,6239,6253,6276,6319,6331,6335,6339,6343,6348,6352],{"__ignoreMap":204},[209,5380,5381,5383,5385],{"class":211,"line":212},[209,5382,476],{"class":230},[209,5384,479],{"class":237},[209,5386,482],{"class":230},[209,5388,5389,5391,5393,5395,5397,5399,5401,5403],{"class":211,"line":234},[209,5390,487],{"class":230},[209,5392,520],{"class":237},[209,5394,791],{"class":493},[209,5396,497],{"class":230},[209,5398,500],{"class":230},[209,5400,5372],{"class":258},[209,5402,500],{"class":230},[209,5404,482],{"class":230},[209,5406,5407,5409,5411,5413,5416,5418,5420],{"class":211,"line":247},[209,5408,517],{"class":230},[209,5410,461],{"class":237},[209,5412,545],{"class":230},[209,5414,5415],{"class":226},"2FA Debug Info",[209,5417,551],{"class":230},[209,5419,461],{"class":237},[209,5421,482],{"class":230},[209,5423,5424,5426,5428,5430,5433,5435,5437],{"class":211,"line":268},[209,5425,517],{"class":230},[209,5427,176],{"class":237},[209,5429,545],{"class":230},[209,5431,5432],{"class":226},"Logged In: {{ loggedIn }}",[209,5434,551],{"class":230},[209,5436,176],{"class":237},[209,5438,482],{"class":230},[209,5440,5441,5443,5445,5447,5450,5452,5454],{"class":211,"line":278},[209,5442,517],{"class":230},[209,5444,176],{"class":237},[209,5446,545],{"class":230},[209,5448,5449],{"class":226},"2FA Enabled: {{ user?.two_factor_enabled }}",[209,5451,551],{"class":230},[209,5453,176],{"class":237},[209,5455,482],{"class":230},[209,5457,5458,5460,5462,5464,5467,5469,5471],{"class":211,"line":288},[209,5459,517],{"class":230},[209,5461,176],{"class":237},[209,5463,545],{"class":230},[209,5465,5466],{"class":226},"2FA Verified: {{ user?.two_factor_verified }}",[209,5468,551],{"class":230},[209,5470,176],{"class":237},[209,5472,482],{"class":230},[209,5474,5475,5477,5479,5481,5484,5486,5488],{"class":211,"line":298},[209,5476,517],{"class":230},[209,5478,176],{"class":237},[209,5480,545],{"class":230},[209,5482,5483],{"class":226},"2FA Token Present: {{ has2FAToken }}",[209,5485,551],{"class":230},[209,5487,176],{"class":237},[209,5489,482],{"class":230},[209,5491,5492,5494,5496,5498,5501,5503,5505],{"class":211,"line":308},[209,5493,517],{"class":230},[209,5495,176],{"class":237},[209,5497,545],{"class":230},[209,5499,5500],{"class":226},"2FA Expired: {{ is2FAExpired }}",[209,5502,551],{"class":230},[209,5504,176],{"class":237},[209,5506,482],{"class":230},[209,5508,5509,5511,5513,5515,5517,5519,5522,5524,5526,5529,5531,5533],{"class":211,"line":325},[209,5510,517],{"class":230},[209,5512,712],{"class":237},[209,5514,2344],{"class":493},[209,5516,497],{"class":230},[209,5518,500],{"class":230},[209,5520,5521],{"class":258},"inspectTokens",[209,5523,500],{"class":230},[209,5525,545],{"class":230},[209,5527,5528],{"class":226},"Inspect Tokens",[209,5530,551],{"class":230},[209,5532,712],{"class":237},[209,5534,482],{"class":230},[209,5536,5537,5539,5541],{"class":211,"line":342},[209,5538,755],{"class":230},[209,5540,520],{"class":237},[209,5542,482],{"class":230},[209,5544,5545,5547,5549],{"class":211,"line":359},[209,5546,551],{"class":230},[209,5548,479],{"class":237},[209,5550,482],{"class":230},[209,5552,5553],{"class":211,"line":381},[209,5554,1009],{"emptyLinePlaceholder":1008},[209,5556,5557,5559,5561,5563],{"class":211,"line":401},[209,5558,476],{"class":230},[209,5560,1017],{"class":237},[209,5562,1020],{"class":493},[209,5564,482],{"class":230},[209,5566,5567,5569,5571,5573,5575,5577,5579,5581,5583,5585,5587],{"class":211,"line":419},[209,5568,1028],{"class":493},[209,5570,1031],{"class":230},[209,5572,1629],{"class":226},[209,5574,374],{"class":230},[209,5576,1634],{"class":226},[209,5578,374],{"class":230},[209,5580,2942],{"class":226},[209,5582,452],{"class":230},[209,5584,1044],{"class":230},[209,5586,1047],{"class":222},[209,5588,1050],{"class":226},[209,5590,5591],{"class":211,"line":425},[209,5592,1009],{"emptyLinePlaceholder":1008},[209,5594,5595,5597,5599,5601,5603,5605,5607,5609],{"class":211,"line":431},[209,5596,1028],{"class":493},[209,5598,2966],{"class":226},[209,5600,497],{"class":230},[209,5602,2971],{"class":222},[209,5604,227],{"class":226},[209,5606,2976],{"class":230},[209,5608,1207],{"class":493},[209,5610,244],{"class":230},[209,5612,5613,5615,5617,5619,5621,5623,5625,5627,5629,5631,5633],{"class":211,"line":437},[209,5614,3003],{"class":215},[209,5616,3006],{"class":226},[209,5618,1226],{"class":230},[209,5620,1229],{"class":226},[209,5622,1226],{"class":230},[209,5624,3015],{"class":222},[209,5626,227],{"class":237},[209,5628,262],{"class":230},[209,5630,411],{"class":258},[209,5632,262],{"class":230},[209,5634,455],{"class":237},[209,5636,5637,5639],{"class":211,"line":443},[209,5638,452],{"class":230},[209,5640,455],{"class":226},[209,5642,5643],{"class":211,"line":449},[209,5644,1009],{"emptyLinePlaceholder":1008},[209,5646,5647,5649,5651,5653,5655,5657,5659,5661],{"class":211,"line":772},[209,5648,1028],{"class":493},[209,5650,3221],{"class":226},[209,5652,497],{"class":230},[209,5654,2971],{"class":222},[209,5656,227],{"class":226},[209,5658,2976],{"class":230},[209,5660,1207],{"class":493},[209,5662,244],{"class":230},[209,5664,5665],{"class":211,"line":805},[209,5666,5667],{"class":377},"  \u002F\u002F Follows middleware pattern: server-side cookie extraction, client-side state handling\n",[209,5669,5670,5672,5674,5676,5678,5680,5682,5684,5686,5688],{"class":211,"line":823},[209,5671,3238],{"class":215},[209,5673,1280],{"class":237},[209,5675,3243],{"class":230},[209,5677,3246],{"class":215},[209,5679,1226],{"class":230},[209,5681,3251],{"class":226},[209,5683,1226],{"class":230},[209,5685,1249],{"class":226},[209,5687,1286],{"class":237},[209,5689,231],{"class":230},[209,5691,5692,5694,5696],{"class":211,"line":843},[209,5693,3264],{"class":215},[209,5695,3267],{"class":1125},[209,5697,3270],{"class":377},[209,5699,5700],{"class":211,"line":853},[209,5701,446],{"class":230},[209,5703,5704],{"class":211,"line":870},[209,5705,1009],{"emptyLinePlaceholder":1008},[209,5707,5708],{"class":211,"line":887},[209,5709,5710],{"class":377},"  \u002F\u002F Client-side: check localStorage for expiration (if stored)\n",[209,5712,5713],{"class":211,"line":903},[209,5714,5715],{"class":377},"  \u002F\u002F Note: 2FA cookies are httpOnly, but expiration may be mirrored in localStorage\n",[209,5717,5718,5720,5722,5724,5726,5728,5730],{"class":211,"line":918},[209,5719,2675],{"class":493},[209,5721,1031],{"class":230},[209,5723,3614],{"class":226},[209,5725,3083],{"class":230},[209,5727,1044],{"class":230},[209,5729,1047],{"class":222},[209,5731,1050],{"class":237},[209,5733,5734,5736,5738,5740,5742,5744,5746,5748,5750,5752,5754,5756,5758,5760,5762],{"class":211,"line":926},[209,5735,2675],{"class":493},[209,5737,2815],{"class":226},[209,5739,1044],{"class":230},[209,5741,3294],{"class":226},[209,5743,1226],{"class":230},[209,5745,3299],{"class":222},[209,5747,227],{"class":237},[209,5749,3304],{"class":226},[209,5751,1226],{"class":230},[209,5753,3309],{"class":226},[209,5755,3312],{"class":230},[209,5757,255],{"class":230},[209,5759,3317],{"class":258},[209,5761,262],{"class":230},[209,5763,455],{"class":237},[209,5765,5766,5768,5770,5772,5774],{"class":211,"line":932},[209,5767,2675],{"class":493},[209,5769,3328],{"class":226},[209,5771,1044],{"class":230},[209,5773,2815],{"class":226},[209,5775,850],{"class":237},[209,5777,5778,5780,5782,5784,5786,5788,5790,5792,5794,5796,5798,5800,5802,5804,5806],{"class":211,"line":962},[209,5779,3339],{"class":230},[209,5781,3294],{"class":226},[209,5783,1226],{"class":230},[209,5785,3299],{"class":222},[209,5787,227],{"class":237},[209,5789,3304],{"class":226},[209,5791,1226],{"class":230},[209,5793,3309],{"class":226},[209,5795,3312],{"class":230},[209,5797,255],{"class":230},[209,5799,3360],{"class":258},[209,5801,262],{"class":230},[209,5803,3312],{"class":230},[209,5805,2815],{"class":226},[209,5807,455],{"class":237},[209,5809,5810,5812],{"class":211,"line":968},[209,5811,3373],{"class":230},[209,5813,3376],{"class":230},[209,5815,5816],{"class":211,"line":978},[209,5817,1009],{"emptyLinePlaceholder":1008},[209,5819,5820,5822,5824,5826,5828,5830,5832,5834,5836,5838,5840,5842,5844,5846],{"class":211,"line":987},[209,5821,3003],{"class":215},[209,5823,3328],{"class":226},[209,5825,2697],{"class":230},[209,5827,3391],{"class":226},[209,5829,1226],{"class":230},[209,5831,3396],{"class":222},[209,5833,3399],{"class":237},[209,5835,545],{"class":230},[209,5837,3404],{"class":222},[209,5839,227],{"class":237},[209,5841,3409],{"class":226},[209,5843,1286],{"class":237},[209,5845,241],{"class":230},[209,5847,1234],{"class":1125},[209,5849,5850,5852],{"class":211,"line":996},[209,5851,452],{"class":230},[209,5853,455],{"class":226},[209,5855,5856],{"class":211,"line":1005},[209,5857,1009],{"emptyLinePlaceholder":1008},[209,5859,5860,5862,5865,5867,5869,5871],{"class":211,"line":1012},[209,5861,1028],{"class":493},[209,5863,5864],{"class":226}," inspectTokens ",[209,5866,497],{"class":230},[209,5868,1204],{"class":230},[209,5870,1207],{"class":493},[209,5872,244],{"class":230},[209,5874,5875,5877,5879,5881,5883,5885,5887,5889,5891],{"class":211,"line":1025},[209,5876,2675],{"class":493},[209,5878,1031],{"class":230},[209,5880,3006],{"class":226},[209,5882,374],{"class":230},[209,5884,3614],{"class":226},[209,5886,3083],{"class":230},[209,5888,1044],{"class":230},[209,5890,1047],{"class":222},[209,5892,1050],{"class":237},[209,5894,5895],{"class":211,"line":1053},[209,5896,764],{"class":237},[209,5898,5899],{"class":211,"line":1058},[209,5900,5901],{"class":377},"  \u002F\u002F Check token presence via headers (non-sensitive)\n",[209,5903,5904,5906,5908,5910,5912,5914,5917,5919,5921,5923,5925,5927,5929,5931,5933,5935,5938,5940],{"class":211,"line":1075},[209,5905,3110],{"class":226},[209,5907,1226],{"class":230},[209,5909,2841],{"class":222},[209,5911,227],{"class":237},[209,5913,262],{"class":230},[209,5915,5916],{"class":258},"Auth Token Present:",[209,5918,262],{"class":230},[209,5920,374],{"class":230},[209,5922,3006],{"class":226},[209,5924,1226],{"class":230},[209,5926,1229],{"class":226},[209,5928,1226],{"class":230},[209,5930,3015],{"class":222},[209,5932,227],{"class":237},[209,5934,262],{"class":230},[209,5936,5937],{"class":258},"authorization",[209,5939,262],{"class":230},[209,5941,3142],{"class":237},[209,5943,5944,5946,5948,5950,5952,5954,5956,5958,5960,5962,5964,5966,5968,5970,5972,5974,5976,5978],{"class":211,"line":1088},[209,5945,3110],{"class":226},[209,5947,1226],{"class":230},[209,5949,2841],{"class":222},[209,5951,227],{"class":237},[209,5953,262],{"class":230},[209,5955,3121],{"class":258},[209,5957,262],{"class":230},[209,5959,374],{"class":230},[209,5961,3006],{"class":226},[209,5963,1226],{"class":230},[209,5965,1229],{"class":226},[209,5967,1226],{"class":230},[209,5969,3015],{"class":222},[209,5971,227],{"class":237},[209,5973,262],{"class":230},[209,5975,411],{"class":258},[209,5977,262],{"class":230},[209,5979,3142],{"class":237},[209,5981,5982],{"class":211,"line":1099},[209,5983,764],{"class":237},[209,5985,5986],{"class":211,"line":1106},[209,5987,5988],{"class":377},"  \u002F\u002F Check strategy and expiration status (non-sensitive metadata)\n",[209,5990,5991,5993,5995,5997,5999,6001,6003,6005,6007],{"class":211,"line":1111},[209,5992,3238],{"class":215},[209,5994,1280],{"class":237},[209,5996,3246],{"class":215},[209,5998,1226],{"class":230},[209,6000,3251],{"class":226},[209,6002,1226],{"class":230},[209,6004,1249],{"class":226},[209,6006,1286],{"class":237},[209,6008,231],{"class":230},[209,6010,6011,6013,6015,6017,6019,6021,6023,6025,6027,6029,6031,6033,6035,6037,6039],{"class":211,"line":1131},[209,6012,3609],{"class":493},[209,6014,2815],{"class":226},[209,6016,1044],{"class":230},[209,6018,3294],{"class":226},[209,6020,1226],{"class":230},[209,6022,3299],{"class":222},[209,6024,227],{"class":237},[209,6026,3304],{"class":226},[209,6028,1226],{"class":230},[209,6030,3309],{"class":226},[209,6032,3312],{"class":230},[209,6034,255],{"class":230},[209,6036,3317],{"class":258},[209,6038,262],{"class":230},[209,6040,455],{"class":237},[209,6042,6043,6045,6047,6049,6051,6053,6056,6058,6060,6062,6064,6066,6069,6071],{"class":211,"line":1150},[209,6044,1537],{"class":226},[209,6046,1226],{"class":230},[209,6048,2841],{"class":222},[209,6050,227],{"class":237},[209,6052,262],{"class":230},[209,6054,6055],{"class":258},"Strategy:",[209,6057,262],{"class":230},[209,6059,374],{"class":230},[209,6061,2815],{"class":226},[209,6063,1847],{"class":230},[209,6065,255],{"class":230},[209,6067,6068],{"class":258},"Not set",[209,6070,262],{"class":230},[209,6072,455],{"class":237},[209,6074,6075],{"class":211,"line":1168},[209,6076,616],{"class":237},[209,6078,6079,6081,6083,6085,6087],{"class":211,"line":1186},[209,6080,1294],{"class":215},[209,6082,1280],{"class":237},[209,6084,3317],{"class":226},[209,6086,1286],{"class":237},[209,6088,231],{"class":230},[209,6090,6091,6093,6095,6097,6099,6101,6103,6105,6107,6109,6111,6113,6115,6118,6120,6122,6124],{"class":211,"line":1191},[209,6092,4115],{"class":493},[209,6094,3328],{"class":226},[209,6096,1044],{"class":230},[209,6098,3294],{"class":226},[209,6100,1226],{"class":230},[209,6102,3299],{"class":222},[209,6104,227],{"class":237},[209,6106,3304],{"class":226},[209,6108,1226],{"class":230},[209,6110,3309],{"class":226},[209,6112,3312],{"class":230},[209,6114,255],{"class":230},[209,6116,6117],{"class":258},"_token_expiration.",[209,6119,262],{"class":230},[209,6121,3312],{"class":230},[209,6123,2815],{"class":226},[209,6125,455],{"class":237},[209,6127,6128,6130,6133,6135,6137,6139,6141,6143,6145,6147,6149,6151,6153,6155,6157,6159,6161],{"class":211,"line":1212},[209,6129,4115],{"class":493},[209,6131,6132],{"class":226}," twoFactorExpiration",[209,6134,1044],{"class":230},[209,6136,3294],{"class":226},[209,6138,1226],{"class":230},[209,6140,3299],{"class":222},[209,6142,227],{"class":237},[209,6144,3304],{"class":226},[209,6146,1226],{"class":230},[209,6148,3309],{"class":226},[209,6150,3312],{"class":230},[209,6152,255],{"class":230},[209,6154,3360],{"class":258},[209,6156,262],{"class":230},[209,6158,3312],{"class":230},[209,6160,2815],{"class":226},[209,6162,455],{"class":237},[209,6164,6165],{"class":211,"line":1220},[209,6166,6167],{"class":237},"      \n",[209,6169,6170,6172,6174,6176,6178,6180,6183,6185,6187,6189],{"class":211,"line":1237},[209,6171,1351],{"class":226},[209,6173,1226],{"class":230},[209,6175,2841],{"class":222},[209,6177,227],{"class":237},[209,6179,262],{"class":230},[209,6181,6182],{"class":258},"Auth Token Status:",[209,6184,262],{"class":230},[209,6186,374],{"class":230},[209,6188,3328],{"class":226},[209,6190,850],{"class":237},[209,6192,6193,6196,6198,6201,6203,6205,6207,6209,6211,6213,6215,6217,6220,6222,6225,6227,6229,6231,6234,6236],{"class":211,"line":1265},[209,6194,6195],{"class":230},"        ?",[209,6197,1280],{"class":237},[209,6199,6200],{"class":226},"Date",[209,6202,1226],{"class":230},[209,6204,3396],{"class":222},[209,6206,3399],{"class":237},[209,6208,545],{"class":230},[209,6210,3404],{"class":222},[209,6212,227],{"class":237},[209,6214,3409],{"class":226},[209,6216,1286],{"class":237},[209,6218,6219],{"class":230},"?",[209,6221,255],{"class":230},[209,6223,6224],{"class":258},"Expired",[209,6226,262],{"class":230},[209,6228,2707],{"class":230},[209,6230,255],{"class":230},[209,6232,6233],{"class":258},"Active",[209,6235,262],{"class":230},[209,6237,6238],{"class":237},") \n",[209,6240,6241,6244,6246,6249,6251],{"class":211,"line":1271},[209,6242,6243],{"class":230},"        :",[209,6245,255],{"class":230},[209,6247,6248],{"class":258},"Unknown",[209,6250,262],{"class":230},[209,6252,455],{"class":237},[209,6254,6255,6257,6259,6261,6263,6265,6268,6270,6272,6274],{"class":211,"line":1291},[209,6256,1351],{"class":226},[209,6258,1226],{"class":230},[209,6260,2841],{"class":222},[209,6262,227],{"class":237},[209,6264,262],{"class":230},[209,6266,6267],{"class":258},"2FA Token Status:",[209,6269,262],{"class":230},[209,6271,374],{"class":230},[209,6273,6132],{"class":226},[209,6275,850],{"class":237},[209,6277,6278,6280,6282,6284,6286,6288,6290,6292,6294,6296,6299,6301,6303,6305,6307,6309,6311,6313,6315,6317],{"class":211,"line":1317},[209,6279,6195],{"class":230},[209,6281,1280],{"class":237},[209,6283,6200],{"class":226},[209,6285,1226],{"class":230},[209,6287,3396],{"class":222},[209,6289,3399],{"class":237},[209,6291,545],{"class":230},[209,6293,3404],{"class":222},[209,6295,227],{"class":237},[209,6297,6298],{"class":226},"twoFactorExpiration",[209,6300,1286],{"class":237},[209,6302,6219],{"class":230},[209,6304,255],{"class":230},[209,6306,6224],{"class":258},[209,6308,262],{"class":230},[209,6310,2707],{"class":230},[209,6312,255],{"class":230},[209,6314,6233],{"class":258},[209,6316,262],{"class":230},[209,6318,6238],{"class":237},[209,6320,6321,6323,6325,6327,6329],{"class":211,"line":1323},[209,6322,6243],{"class":230},[209,6324,255],{"class":230},[209,6326,6068],{"class":258},[209,6328,262],{"class":230},[209,6330,455],{"class":237},[209,6332,6333],{"class":211,"line":1337},[209,6334,440],{"class":230},[209,6336,6337],{"class":211,"line":1348},[209,6338,446],{"class":230},[209,6340,6341],{"class":211,"line":1374},[209,6342,764],{"class":237},[209,6344,6345],{"class":211,"line":1379},[209,6346,6347],{"class":377},"  \u002F\u002F Note: Raw token values are never logged for security\n",[209,6349,6350],{"class":211,"line":1389},[209,6351,1411],{"class":230},[209,6353,6354,6356,6358],{"class":211,"line":1403},[209,6355,551],{"class":230},[209,6357,1017],{"class":237},[209,6359,482],{"class":230},[180,6361],{},[176,6363,6364,6367,6368,6372],{},[4332,6365,6366],{},"Next:"," Learn about ",[6369,6370,104],"a",{"href":6371},"\u002F3.passport\u002F5.middleware"," for protecting routes and managing authentication flows.",[6374,6375,6376],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":204,"searchDepth":212,"depth":234,"links":6378},[6379,6380,6381,6384,6388,6392,6396,6401],{"id":185,"depth":234,"text":186},{"id":192,"depth":234,"text":193},{"id":458,"depth":234,"text":459,"children":6382},[6383],{"id":463,"depth":247,"text":464},{"id":1600,"depth":234,"text":1601,"children":6385},[6386,6387],{"id":1604,"depth":247,"text":1605},{"id":2015,"depth":247,"text":2016},{"id":2908,"depth":234,"text":2909,"children":6389},[6390,6391],{"id":2912,"depth":247,"text":2913},{"id":3162,"depth":247,"text":3163},{"id":3517,"depth":234,"text":3518,"children":6393},[6394,6395],{"id":3521,"depth":247,"text":3522},{"id":4345,"depth":247,"text":4346},{"id":4590,"depth":234,"text":4591,"children":6397},[6398,6399,6400],{"id":4594,"depth":247,"text":4595},{"id":4756,"depth":247,"text":4757},{"id":5085,"depth":247,"text":5086},{"id":5298,"depth":234,"text":5299,"children":6402},[6403,6404],{"id":5302,"depth":247,"text":5303},{"id":5372,"depth":247,"text":5373},"Implementing two-factor authentication (2FA) with Laravel Passport","md",null,{},{"icon":65},{"title":62,"description":6405},"mLyKsMtI9JETVcIUqRTJHPpeY3xALvx0RV8bVAAwpq8",[6413,6415],{"title":57,"path":58,"stem":59,"description":6414,"icon":60,"children":-1},"Managing OAuth2 tokens, refresh, and expiration with Laravel Passport",{"title":67,"path":68,"stem":69,"description":6416,"icon":37,"children":-1},"Protecting routes and managing authentication flows with middleware",1785126612932]