[{"data":1,"prerenderedAt":1413},["ShallowReactive",2],{"navigation":3,"\u002Fdocumentation\u002Fauthentication":90,"\u002Fdocumentation\u002Fauthentication-surround":1408},[4,73],{"title":5,"path":6,"stem":7,"children":8,"icon":72},"Documentation","\u002Fdocumentation","1.documentation\u002F01.index",[9,12,17,22,27,32,37,42,47,52,57,62,67],{"title":10,"path":6,"stem":7,"icon":11},"Welcome","i-lucide-info",{"title":13,"path":14,"stem":15,"icon":16},"Requirements","\u002Fdocumentation\u002Frequirements","1.documentation\u002F02.requirements","i-lucide-alert-triangle",{"title":18,"path":19,"stem":20,"icon":21},"Getting Started","\u002Fdocumentation\u002Fgetting-started","1.documentation\u002F03.getting-started","i-lucide-package",{"title":23,"path":24,"stem":25,"icon":26},"Folder Structure","\u002Fdocumentation\u002Ffolder-structure","1.documentation\u002F04.folder-structure","i-lucide-folder-tree",{"title":28,"path":29,"stem":30,"icon":31},"Customization","\u002Fdocumentation\u002Fcustomization","1.documentation\u002F05.customization","i-lucide-palette",{"title":33,"path":34,"stem":35,"icon":36},"Deployment","\u002Fdocumentation\u002Fdeployment","1.documentation\u002F06.deployment","i-lucide-cloud-upload",{"title":38,"path":39,"stem":40,"icon":41},"API Usage","\u002Fdocumentation\u002Fapi-usage","1.documentation\u002F07.api-usage","i-lucide-plug",{"title":43,"path":44,"stem":45,"icon":46},"Backend Integration","\u002Fdocumentation\u002Fbackend-integration","1.documentation\u002F08.backend-integration","i-lucide-server",{"title":48,"path":49,"stem":50,"icon":51},"Install PWA","\u002Fdocumentation\u002Finstall-pwa","1.documentation\u002F09.install-pwa","i-lucide-smartphone",{"title":53,"path":54,"stem":55,"icon":56},"Configuration","\u002Fdocumentation\u002Fconfiguration","1.documentation\u002F10.configuration","i-lucide-settings",{"title":58,"path":59,"stem":60,"icon":61},"Screens Overview","\u002Fdocumentation\u002Fscreens-overview","1.documentation\u002F11.screens-overview","i-lucide-layout-dashboard",{"title":63,"path":64,"stem":65,"icon":66},"FAQ & Troubleshooting","\u002Fdocumentation\u002Ffaq","1.documentation\u002F12.faq","i-lucide-circle-help",{"title":68,"path":69,"stem":70,"icon":71},"Authentication","\u002Fdocumentation\u002Fauthentication","1.documentation\u002F13.authentication","i-lucide-lock",false,{"title":74,"path":75,"stem":76,"children":77,"icon":72},"Support","\u002Fsupport","2.support\u002F1.index",[78,80,85],{"title":74,"path":75,"stem":76,"icon":79},"i-lucide-life-buoy",{"title":81,"path":82,"stem":83,"icon":84},"Changelog","\u002Fsupport\u002Fchangelog","2.support\u002F2.changelog","i-lucide-scroll-text",{"title":86,"path":87,"stem":88,"icon":89},"Source & Credits","\u002Fsupport\u002Fsource-and-credits","2.support\u002F3.source-&-credits","i-lucide-award",{"id":91,"title":68,"body":92,"description":1401,"extension":1402,"links":1403,"meta":1404,"navigation":1405,"path":69,"seo":1406,"stem":70,"__hash__":1407},"docs\u002F1.documentation\u002F13.authentication.md",{"type":93,"value":94,"toc":1392},"minimark",[95,109,114,119,126,421,435,439,556,560,566,686,695,699,708,856,860,863,1366,1388],[96,97,98,99,103,104,108],"p",{},"The template ships with ",[100,101,102],"strong",{},"mock authentication"," — all user data is stored locally in a Pinia store and persisted to ",[105,106,107],"code",{},"localStorage",". There is no real server, no JWT, and no session. This section explains how it works and how to replace it with a real backend.",[110,111,113],"h2",{"id":112},"how-it-works-now","How It Works Now",[115,116,118],"h3",{"id":117},"user-store","User Store",[96,120,121,122,125],{},"User data lives in ",[105,123,124],{},"app\u002Fstores\u002FuseUserStore.ts",":",[127,128,133],"pre",{"className":129,"code":130,"filename":124,"language":131,"meta":132,"style":132},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export const useUserStore = defineStore(\n  'user',\n  () => {\n    const name = ref('Cristina Watson');\n    const email = ref('cristinawatson@mail.com');\n    const phone = ref('+1 123 456 7890');\n    const location = ref('New York, USA');\n    const birthday = ref('01\u002F01\u002F2000');\n    const photo = ref('https:\u002F\u002Fgeorge-fx.github.io\u002Fteofin-data\u002Fphotos\u002F01.jpg');\n\n    return { name, email, phone, location, birthday, photo };\n  },\n  { persist: true },\n);\n","ts","",[105,134,135,163,179,191,223,248,273,298,323,348,355,390,396,414],{"__ignoreMap":132},[136,137,140,144,148,152,156,160],"span",{"class":138,"line":139},"line",1,[136,141,143],{"class":142},"s7zQu","export",[136,145,147],{"class":146},"spNyl"," const",[136,149,151],{"class":150},"sTEyZ"," useUserStore ",[136,153,155],{"class":154},"sMK4o","=",[136,157,159],{"class":158},"s2Zo4"," defineStore",[136,161,162],{"class":150},"(\n",[136,164,166,169,173,176],{"class":138,"line":165},2,[136,167,168],{"class":154},"  '",[136,170,172],{"class":171},"sfazB","user",[136,174,175],{"class":154},"'",[136,177,178],{"class":154},",\n",[136,180,182,185,188],{"class":138,"line":181},3,[136,183,184],{"class":154},"  ()",[136,186,187],{"class":146}," =>",[136,189,190],{"class":154}," {\n",[136,192,194,197,200,203,206,210,212,215,217,220],{"class":138,"line":193},4,[136,195,196],{"class":146},"    const",[136,198,199],{"class":150}," name",[136,201,202],{"class":154}," =",[136,204,205],{"class":158}," ref",[136,207,209],{"class":208},"swJcz","(",[136,211,175],{"class":154},[136,213,214],{"class":171},"Cristina Watson",[136,216,175],{"class":154},[136,218,219],{"class":208},")",[136,221,222],{"class":154},";\n",[136,224,226,228,231,233,235,237,239,242,244,246],{"class":138,"line":225},5,[136,227,196],{"class":146},[136,229,230],{"class":150}," email",[136,232,202],{"class":154},[136,234,205],{"class":158},[136,236,209],{"class":208},[136,238,175],{"class":154},[136,240,241],{"class":171},"cristinawatson@mail.com",[136,243,175],{"class":154},[136,245,219],{"class":208},[136,247,222],{"class":154},[136,249,251,253,256,258,260,262,264,267,269,271],{"class":138,"line":250},6,[136,252,196],{"class":146},[136,254,255],{"class":150}," phone",[136,257,202],{"class":154},[136,259,205],{"class":158},[136,261,209],{"class":208},[136,263,175],{"class":154},[136,265,266],{"class":171},"+1 123 456 7890",[136,268,175],{"class":154},[136,270,219],{"class":208},[136,272,222],{"class":154},[136,274,276,278,281,283,285,287,289,292,294,296],{"class":138,"line":275},7,[136,277,196],{"class":146},[136,279,280],{"class":150}," location",[136,282,202],{"class":154},[136,284,205],{"class":158},[136,286,209],{"class":208},[136,288,175],{"class":154},[136,290,291],{"class":171},"New York, USA",[136,293,175],{"class":154},[136,295,219],{"class":208},[136,297,222],{"class":154},[136,299,301,303,306,308,310,312,314,317,319,321],{"class":138,"line":300},8,[136,302,196],{"class":146},[136,304,305],{"class":150}," birthday",[136,307,202],{"class":154},[136,309,205],{"class":158},[136,311,209],{"class":208},[136,313,175],{"class":154},[136,315,316],{"class":171},"01\u002F01\u002F2000",[136,318,175],{"class":154},[136,320,219],{"class":208},[136,322,222],{"class":154},[136,324,326,328,331,333,335,337,339,342,344,346],{"class":138,"line":325},9,[136,327,196],{"class":146},[136,329,330],{"class":150}," photo",[136,332,202],{"class":154},[136,334,205],{"class":158},[136,336,209],{"class":208},[136,338,175],{"class":154},[136,340,341],{"class":171},"https:\u002F\u002Fgeorge-fx.github.io\u002Fteofin-data\u002Fphotos\u002F01.jpg",[136,343,175],{"class":154},[136,345,219],{"class":208},[136,347,222],{"class":154},[136,349,351],{"class":138,"line":350},10,[136,352,354],{"emptyLinePlaceholder":353},true,"\n",[136,356,358,361,364,366,369,371,373,375,377,379,381,383,385,387],{"class":138,"line":357},11,[136,359,360],{"class":142},"    return",[136,362,363],{"class":154}," {",[136,365,199],{"class":150},[136,367,368],{"class":154},",",[136,370,230],{"class":150},[136,372,368],{"class":154},[136,374,255],{"class":150},[136,376,368],{"class":154},[136,378,280],{"class":150},[136,380,368],{"class":154},[136,382,305],{"class":150},[136,384,368],{"class":154},[136,386,330],{"class":150},[136,388,389],{"class":154}," };\n",[136,391,393],{"class":138,"line":392},12,[136,394,395],{"class":154},"  },\n",[136,397,399,402,405,407,411],{"class":138,"line":398},13,[136,400,401],{"class":154},"  {",[136,403,404],{"class":208}," persist",[136,406,125],{"class":154},[136,408,410],{"class":409},"sfNiH"," true",[136,412,413],{"class":154}," },\n",[136,415,417,419],{"class":138,"line":416},14,[136,418,219],{"class":150},[136,420,222],{"class":154},[96,422,423,424,427,428,431,432,434],{},"The ",[105,425,426],{},"persist: true"," option tells ",[105,429,430],{},"pinia-plugin-persistedstate"," to automatically save the store to ",[100,433,107],{}," and restore it on next visit.",[115,436,438],{"id":437},"where-data-changes","Where Data Changes",[440,441,442,455],"table",{},[443,444,445],"thead",{},[446,447,448,452],"tr",{},[449,450,451],"th",{},"Page",[449,453,454],{},"What happens",[456,457,458,473,494,508,539],"tbody",{},[446,459,460,466],{},[461,462,463],"td",{},[105,464,465],{},"sign-in.vue",[461,467,468,469,472],{},"Validates email + password format, saves email to ",[105,470,471],{},"useUserStore"," only if \"Remember me\" is checked, navigates to Home",[446,474,475,480],{},[461,476,477],{},[105,478,479],{},"sign-up.vue",[461,481,482,483,486,487,490,491,493],{},"Validates all fields, saves ",[105,484,485],{},"name"," and ",[105,488,489],{},"email"," to ",[105,492,471],{},", navigates to the phone verification screen",[446,495,496,505],{},[461,497,498,501,502],{},[105,499,500],{},"verify-your-phone-number.vue"," → ",[105,503,504],{},"confirmation-code.vue",[461,506,507],{},"Phone OTP step, then navigates to the account created screen",[446,509,510,515],{},[461,511,512],{},[105,513,514],{},"edit-profile.vue",[461,516,517,518,520,521,520,523,520,526,520,529,532,533,536,537],{},"Updates ",[105,519,485],{},", ",[105,522,489],{},[105,524,525],{},"phone",[105,527,528],{},"location",[105,530,531],{},"birthday",", and ",[105,534,535],{},"photo"," directly in ",[105,538,471],{},[446,540,541,547],{},[461,542,543,546],{},[105,544,545],{},"profile.vue"," \"Sign Out\" menu item",[461,548,549,550,552,553],{},"Links straight to ",[105,551,465],{}," — ",[100,554,555],{},"does not clear the store",[115,557,559],{"id":558},"persistence-plugin","Persistence Plugin",[96,561,562,563,125],{},"The plugin is registered in ",[105,564,565],{},"app\u002Fplugins\u002Fpinia-persistedstate.client.ts",[127,567,569],{"className":129,"code":568,"filename":565,"language":131,"meta":132,"style":132},"import { createPersistedState } from 'pinia-plugin-persistedstate'\nimport type { Pinia } from 'pinia'\n\nexport default defineNuxtPlugin(({ $pinia }) => {\n  ($pinia as Pinia).use(createPersistedState())\n})\n",[105,570,571,595,618,622,648,678],{"__ignoreMap":132},[136,572,573,576,578,581,584,587,590,592],{"class":138,"line":139},[136,574,575],{"class":142},"import",[136,577,363],{"class":154},[136,579,580],{"class":150}," createPersistedState",[136,582,583],{"class":154}," }",[136,585,586],{"class":142}," from",[136,588,589],{"class":154}," '",[136,591,430],{"class":171},[136,593,594],{"class":154},"'\n",[136,596,597,599,602,604,607,609,611,613,616],{"class":138,"line":165},[136,598,575],{"class":142},[136,600,601],{"class":142}," type",[136,603,363],{"class":154},[136,605,606],{"class":150}," Pinia",[136,608,583],{"class":154},[136,610,586],{"class":142},[136,612,589],{"class":154},[136,614,615],{"class":171},"pinia",[136,617,594],{"class":154},[136,619,620],{"class":138,"line":181},[136,621,354],{"emptyLinePlaceholder":353},[136,623,624,626,629,632,634,637,641,644,646],{"class":138,"line":193},[136,625,143],{"class":142},[136,627,628],{"class":142}," default",[136,630,631],{"class":158}," defineNuxtPlugin",[136,633,209],{"class":150},[136,635,636],{"class":154},"({",[136,638,640],{"class":639},"sHdIc"," $pinia",[136,642,643],{"class":154}," })",[136,645,187],{"class":146},[136,647,190],{"class":154},[136,649,650,653,656,659,662,664,667,670,672,675],{"class":138,"line":225},[136,651,652],{"class":208},"  (",[136,654,655],{"class":150},"$pinia",[136,657,658],{"class":142}," as",[136,660,606],{"class":661},"sBMFI",[136,663,219],{"class":208},[136,665,666],{"class":154},".",[136,668,669],{"class":158},"use",[136,671,209],{"class":208},[136,673,674],{"class":158},"createPersistedState",[136,676,677],{"class":208},"())\n",[136,679,680,683],{"class":138,"line":250},[136,681,682],{"class":154},"}",[136,684,685],{"class":150},")\n",[96,687,423,688,691,692,694],{},[105,689,690],{},".client.ts"," suffix means the plugin only runs in the browser — store data is never read from ",[105,693,107],{}," during SSR.",[110,696,698],{"id":697},"how-to-update-default-user-data","How to Update Default User Data",[96,700,701,702,705,706,125],{},"To change the initial values shown in the app, edit the ",[105,703,704],{},"ref()"," defaults in ",[105,707,471],{},[127,709,711],{"className":129,"code":710,"filename":124,"language":131,"meta":132,"style":132},"const name = ref('Your App Name');\nconst email = ref('user@example.com');\nconst phone = ref('+10000000000');\nconst location = ref('New York, USA');\nconst birthday = ref('01\u002F01\u002F2000');\nconst photo = ref('\u002Fimages\u002Fdefault-avatar.png');\n",[105,712,713,738,762,786,809,832],{"__ignoreMap":132},[136,714,715,718,721,723,725,727,729,732,734,736],{"class":138,"line":139},[136,716,717],{"class":146},"const",[136,719,720],{"class":150}," name ",[136,722,155],{"class":154},[136,724,205],{"class":158},[136,726,209],{"class":150},[136,728,175],{"class":154},[136,730,731],{"class":171},"Your App Name",[136,733,175],{"class":154},[136,735,219],{"class":150},[136,737,222],{"class":154},[136,739,740,742,745,747,749,751,753,756,758,760],{"class":138,"line":165},[136,741,717],{"class":146},[136,743,744],{"class":150}," email ",[136,746,155],{"class":154},[136,748,205],{"class":158},[136,750,209],{"class":150},[136,752,175],{"class":154},[136,754,755],{"class":171},"user@example.com",[136,757,175],{"class":154},[136,759,219],{"class":150},[136,761,222],{"class":154},[136,763,764,766,769,771,773,775,777,780,782,784],{"class":138,"line":181},[136,765,717],{"class":146},[136,767,768],{"class":150}," phone ",[136,770,155],{"class":154},[136,772,205],{"class":158},[136,774,209],{"class":150},[136,776,175],{"class":154},[136,778,779],{"class":171},"+10000000000",[136,781,175],{"class":154},[136,783,219],{"class":150},[136,785,222],{"class":154},[136,787,788,790,793,795,797,799,801,803,805,807],{"class":138,"line":193},[136,789,717],{"class":146},[136,791,792],{"class":150}," location ",[136,794,155],{"class":154},[136,796,205],{"class":158},[136,798,209],{"class":150},[136,800,175],{"class":154},[136,802,291],{"class":171},[136,804,175],{"class":154},[136,806,219],{"class":150},[136,808,222],{"class":154},[136,810,811,813,816,818,820,822,824,826,828,830],{"class":138,"line":225},[136,812,717],{"class":146},[136,814,815],{"class":150}," birthday ",[136,817,155],{"class":154},[136,819,205],{"class":158},[136,821,209],{"class":150},[136,823,175],{"class":154},[136,825,316],{"class":171},[136,827,175],{"class":154},[136,829,219],{"class":150},[136,831,222],{"class":154},[136,833,834,836,839,841,843,845,847,850,852,854],{"class":138,"line":250},[136,835,717],{"class":146},[136,837,838],{"class":150}," photo ",[136,840,155],{"class":154},[136,842,205],{"class":158},[136,844,209],{"class":150},[136,846,175],{"class":154},[136,848,849],{"class":171},"\u002Fimages\u002Fdefault-avatar.png",[136,851,175],{"class":154},[136,853,219],{"class":150},[136,855,222],{"class":154},[110,857,859],{"id":858},"connecting-a-real-backend","Connecting a Real Backend",[96,861,862],{},"To replace mock auth with a real API:",[864,865,866,870,873,1119,1123,1133,1226,1230,1237,1332,1335],"steps",{},[115,867,869],{"id":868},"replace-sign-in-logic","Replace sign-in logic",[96,871,872],{},"Instead of saving directly to the store, call your auth endpoint and store the returned token in a cookie:",[127,874,877],{"className":129,"code":875,"filename":876,"language":131,"meta":132,"style":132},"const handleSignIn = async () => {\n  const { data } = await useFetch('\u002Fapi\u002Fauth\u002Flogin', {\n    method: 'POST',\n    body: { email: email.value, password: password.value },\n  })\n\n  const token = useCookie('auth_token')\n  token.value = data.value.token\n\n  userStore.name = data.value.user.name\n  userStore.email = data.value.user.email\n\n  navigateTo(ROUTES.HOME)\n}\n","app\u002Fpages\u002Fsign-in.vue",[105,878,879,898,931,947,982,989,993,1016,1038,1042,1068,1093,1097,1114],{"__ignoreMap":132},[136,880,881,883,886,888,891,894,896],{"class":138,"line":139},[136,882,717],{"class":146},[136,884,885],{"class":150}," handleSignIn ",[136,887,155],{"class":154},[136,889,890],{"class":146}," async",[136,892,893],{"class":154}," ()",[136,895,187],{"class":146},[136,897,190],{"class":154},[136,899,900,903,905,908,910,912,915,918,920,922,925,927,929],{"class":138,"line":165},[136,901,902],{"class":146},"  const",[136,904,363],{"class":154},[136,906,907],{"class":150}," data",[136,909,583],{"class":154},[136,911,202],{"class":154},[136,913,914],{"class":142}," await",[136,916,917],{"class":158}," useFetch",[136,919,209],{"class":208},[136,921,175],{"class":154},[136,923,924],{"class":171},"\u002Fapi\u002Fauth\u002Flogin",[136,926,175],{"class":154},[136,928,368],{"class":154},[136,930,190],{"class":154},[136,932,933,936,938,940,943,945],{"class":138,"line":181},[136,934,935],{"class":208},"    method",[136,937,125],{"class":154},[136,939,589],{"class":154},[136,941,942],{"class":171},"POST",[136,944,175],{"class":154},[136,946,178],{"class":154},[136,948,949,952,954,956,958,960,962,964,967,969,972,974,976,978,980],{"class":138,"line":193},[136,950,951],{"class":208},"    body",[136,953,125],{"class":154},[136,955,363],{"class":154},[136,957,230],{"class":208},[136,959,125],{"class":154},[136,961,230],{"class":150},[136,963,666],{"class":154},[136,965,966],{"class":150},"value",[136,968,368],{"class":154},[136,970,971],{"class":208}," password",[136,973,125],{"class":154},[136,975,971],{"class":150},[136,977,666],{"class":154},[136,979,966],{"class":150},[136,981,413],{"class":154},[136,983,984,987],{"class":138,"line":225},[136,985,986],{"class":154},"  }",[136,988,685],{"class":208},[136,990,991],{"class":138,"line":250},[136,992,354],{"emptyLinePlaceholder":353},[136,994,995,997,1000,1002,1005,1007,1009,1012,1014],{"class":138,"line":275},[136,996,902],{"class":146},[136,998,999],{"class":150}," token",[136,1001,202],{"class":154},[136,1003,1004],{"class":158}," useCookie",[136,1006,209],{"class":208},[136,1008,175],{"class":154},[136,1010,1011],{"class":171},"auth_token",[136,1013,175],{"class":154},[136,1015,685],{"class":208},[136,1017,1018,1021,1023,1025,1027,1029,1031,1033,1035],{"class":138,"line":300},[136,1019,1020],{"class":150},"  token",[136,1022,666],{"class":154},[136,1024,966],{"class":150},[136,1026,202],{"class":154},[136,1028,907],{"class":150},[136,1030,666],{"class":154},[136,1032,966],{"class":150},[136,1034,666],{"class":154},[136,1036,1037],{"class":150},"token\n",[136,1039,1040],{"class":138,"line":325},[136,1041,354],{"emptyLinePlaceholder":353},[136,1043,1044,1047,1049,1051,1053,1055,1057,1059,1061,1063,1065],{"class":138,"line":350},[136,1045,1046],{"class":150},"  userStore",[136,1048,666],{"class":154},[136,1050,485],{"class":150},[136,1052,202],{"class":154},[136,1054,907],{"class":150},[136,1056,666],{"class":154},[136,1058,966],{"class":150},[136,1060,666],{"class":154},[136,1062,172],{"class":150},[136,1064,666],{"class":154},[136,1066,1067],{"class":150},"name\n",[136,1069,1070,1072,1074,1076,1078,1080,1082,1084,1086,1088,1090],{"class":138,"line":357},[136,1071,1046],{"class":150},[136,1073,666],{"class":154},[136,1075,489],{"class":150},[136,1077,202],{"class":154},[136,1079,907],{"class":150},[136,1081,666],{"class":154},[136,1083,966],{"class":150},[136,1085,666],{"class":154},[136,1087,172],{"class":150},[136,1089,666],{"class":154},[136,1091,1092],{"class":150},"email\n",[136,1094,1095],{"class":138,"line":392},[136,1096,354],{"emptyLinePlaceholder":353},[136,1098,1099,1102,1104,1107,1109,1112],{"class":138,"line":398},[136,1100,1101],{"class":158},"  navigateTo",[136,1103,209],{"class":208},[136,1105,1106],{"class":150},"ROUTES",[136,1108,666],{"class":154},[136,1110,1111],{"class":150},"HOME",[136,1113,685],{"class":208},[136,1115,1116],{"class":138,"line":416},[136,1117,1118],{"class":154},"}\n",[115,1120,1122],{"id":1121},"add-a-real-logout","Add a real logout",[96,1124,1125,1126,1128,1129,1132],{},"The \"Sign Out\" menu item in ",[105,1127,545],{}," currently just links to ",[105,1130,1131],{},"ROUTES.SIGN_IN",". Replace it with a handler that clears the store and removes the token:",[127,1134,1137],{"className":129,"code":1135,"filename":1136,"language":131,"meta":132,"style":132},"const handleSignOut = () => {\n  const token = useCookie('auth_token')\n  token.value = null\n\n  userStore.$reset()\n\n  navigateTo(ROUTES.SIGN_IN)\n}\n","app\u002Fpages\u002Fprofile.vue",[105,1138,1139,1154,1174,1187,1191,1203,1207,1222],{"__ignoreMap":132},[136,1140,1141,1143,1146,1148,1150,1152],{"class":138,"line":139},[136,1142,717],{"class":146},[136,1144,1145],{"class":150}," handleSignOut ",[136,1147,155],{"class":154},[136,1149,893],{"class":154},[136,1151,187],{"class":146},[136,1153,190],{"class":154},[136,1155,1156,1158,1160,1162,1164,1166,1168,1170,1172],{"class":138,"line":165},[136,1157,902],{"class":146},[136,1159,999],{"class":150},[136,1161,202],{"class":154},[136,1163,1004],{"class":158},[136,1165,209],{"class":208},[136,1167,175],{"class":154},[136,1169,1011],{"class":171},[136,1171,175],{"class":154},[136,1173,685],{"class":208},[136,1175,1176,1178,1180,1182,1184],{"class":138,"line":181},[136,1177,1020],{"class":150},[136,1179,666],{"class":154},[136,1181,966],{"class":150},[136,1183,202],{"class":154},[136,1185,1186],{"class":154}," null\n",[136,1188,1189],{"class":138,"line":193},[136,1190,354],{"emptyLinePlaceholder":353},[136,1192,1193,1195,1197,1200],{"class":138,"line":225},[136,1194,1046],{"class":150},[136,1196,666],{"class":154},[136,1198,1199],{"class":158},"$reset",[136,1201,1202],{"class":208},"()\n",[136,1204,1205],{"class":138,"line":250},[136,1206,354],{"emptyLinePlaceholder":353},[136,1208,1209,1211,1213,1215,1217,1220],{"class":138,"line":275},[136,1210,1101],{"class":158},[136,1212,209],{"class":208},[136,1214,1106],{"class":150},[136,1216,666],{"class":154},[136,1218,1219],{"class":150},"SIGN_IN",[136,1221,685],{"class":208},[136,1223,1224],{"class":138,"line":300},[136,1225,1118],{"class":154},[115,1227,1229],{"id":1228},"protect-routes-with-middleware","Protect routes with middleware",[96,1231,1232,1233,1236],{},"Create ",[105,1234,1235],{},"app\u002Fmiddleware\u002Fauth.ts"," to redirect unauthenticated users:",[127,1238,1240],{"className":129,"code":1239,"filename":1235,"language":131,"meta":132,"style":132},"export default defineNuxtRouteMiddleware(() => {\n  const token = useCookie('auth_token')\n  if (!token.value) {\n    return navigateTo(ROUTES.SIGN_IN)\n  }\n})\n",[105,1241,1242,1260,1280,1304,1321,1326],{"__ignoreMap":132},[136,1243,1244,1246,1248,1251,1253,1256,1258],{"class":138,"line":139},[136,1245,143],{"class":142},[136,1247,628],{"class":142},[136,1249,1250],{"class":158}," defineNuxtRouteMiddleware",[136,1252,209],{"class":150},[136,1254,1255],{"class":154},"()",[136,1257,187],{"class":146},[136,1259,190],{"class":154},[136,1261,1262,1264,1266,1268,1270,1272,1274,1276,1278],{"class":138,"line":165},[136,1263,902],{"class":146},[136,1265,999],{"class":150},[136,1267,202],{"class":154},[136,1269,1004],{"class":158},[136,1271,209],{"class":208},[136,1273,175],{"class":154},[136,1275,1011],{"class":171},[136,1277,175],{"class":154},[136,1279,685],{"class":208},[136,1281,1282,1285,1288,1291,1294,1296,1298,1301],{"class":138,"line":181},[136,1283,1284],{"class":142},"  if",[136,1286,1287],{"class":208}," (",[136,1289,1290],{"class":154},"!",[136,1292,1293],{"class":150},"token",[136,1295,666],{"class":154},[136,1297,966],{"class":150},[136,1299,1300],{"class":208},") ",[136,1302,1303],{"class":154},"{\n",[136,1305,1306,1308,1311,1313,1315,1317,1319],{"class":138,"line":193},[136,1307,360],{"class":142},[136,1309,1310],{"class":158}," navigateTo",[136,1312,209],{"class":208},[136,1314,1106],{"class":150},[136,1316,666],{"class":154},[136,1318,1219],{"class":150},[136,1320,685],{"class":208},[136,1322,1323],{"class":138,"line":225},[136,1324,1325],{"class":154},"  }\n",[136,1327,1328,1330],{"class":138,"line":250},[136,1329,682],{"class":154},[136,1331,685],{"class":150},[96,1333,1334],{},"Then apply it to any protected page:",[127,1336,1338],{"className":129,"code":1337,"language":131,"meta":132,"style":132},"definePageMeta({ middleware: 'auth' })\n",[105,1339,1340],{"__ignoreMap":132},[136,1341,1342,1345,1347,1350,1353,1355,1357,1360,1362,1364],{"class":138,"line":139},[136,1343,1344],{"class":158},"definePageMeta",[136,1346,209],{"class":150},[136,1348,1349],{"class":154},"{",[136,1351,1352],{"class":208}," middleware",[136,1354,125],{"class":154},[136,1356,589],{"class":154},[136,1358,1359],{"class":171},"auth",[136,1361,175],{"class":154},[136,1363,583],{"class":154},[136,1365,685],{"class":150},[1367,1368,1370],"callout",{"color":1369,"icon":11},"warning",[96,1371,1372,1373,1376,1377,1380,1381,1383,1384,1387],{},"Once you set up the ",[105,1374,1375],{},"useApi"," composable from the ",[1378,1379,38],"a",{"href":39}," section, read the same ",[105,1382,1011],{}," cookie there so it's automatically attached as a ",[105,1385,1386],{},"Bearer"," token to every API request.",[1389,1390,1391],"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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .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}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":132,"searchDepth":139,"depth":165,"links":1393},[1394,1399,1400],{"id":112,"depth":165,"text":113,"children":1395},[1396,1397,1398],{"id":117,"depth":181,"text":118},{"id":437,"depth":181,"text":438},{"id":558,"depth":181,"text":559},{"id":697,"depth":165,"text":698},{"id":858,"depth":165,"text":859},"How user data and auth state are managed with Pinia — and how to connect a real backend.","md",null,{},{"icon":71},{"title":68,"description":1401},"uHtNmdzdDk42KLazi3GJzQCUtW2mX3Q5dPmcLiwijO4",[1409,1411],{"title":63,"path":64,"stem":65,"description":1410,"icon":66,"children":-1},"Answers to common questions and solutions to frequent issues.",{"title":74,"path":75,"stem":76,"description":1412,"icon":79,"children":-1},"Get in touch for questions, issues, or feedback.",1784271369853]