[{"data":1,"prerenderedAt":3574},["ShallowReactive",2],{"navigation":3,"\u002Fpassport\u002Flogin-logout":170,"\u002Fpassport\u002Flogin-logout-surround":3569},[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":52,"body":172,"description":3562,"extension":3563,"links":3564,"meta":3565,"navigation":3566,"path":53,"seo":3567,"stem":54,"__hash__":3568},"docs\u002F3.passport\u002F2.login-logout.md",{"type":173,"value":174,"toc":3542},"minimark",[175,179,182,187,195,200,891,895,898,957,961,964,1124,1128,1134,1138,1385,1389,1759,1763,1766,1887,1904,1908,1911,2244,2533,2537,2540,2840,2844,2946,2950,2953,3105,3109,3113,3186,3190,3525,3527,3538],[176,177,178],"p",{},"Learn how to implement secure login and logout functionality using Laravel Passport with Nuxt Umbu.",[180,181],"hr",{},[183,184,186],"h2",{"id":185},"basic-login","Basic Login",[176,188,189,190,194],{},"The ",[191,192,193],"code",{},"loginWith"," method provides a simple way to authenticate users with Laravel Passport.",[196,197,199],"h3",{"id":198},"using-the-composable","Using the Composable",[201,202,207],"pre",{"className":203,"code":204,"language":205,"meta":206,"style":206},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Ctemplate>\n  \u003Cform @submit.prevent=\"handleLogin\">\n    \u003Cdiv>\n      \u003Clabel for=\"email\">Email\u003C\u002Flabel>\n      \u003Cinput \n        id=\"email\" \n        v-model=\"credentials.email\" \n        type=\"email\" \n        required \n      \u002F>\n    \u003C\u002Fdiv>\n    \n    \u003Cdiv>\n      \u003Clabel for=\"password\">Password\u003C\u002Flabel>\n      \u003Cinput \n        id=\"password\" \n        v-model=\"credentials.password\" \n        type=\"password\" \n        required \n      \u002F>\n    \u003C\u002Fdiv>\n    \n    \u003Cbutton type=\"submit\" :disabled=\"loading\">\n      {{ loading ? 'Signing in...' : 'Sign In' }}\n    \u003C\u002Fbutton>\n  \u003C\u002Fform>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nconst { loginWith } = useAuth()\n\nconst credentials = ref({\n  email: '',\n  password: ''\n})\n\nconst loading = ref(false)\n\nconst handleLogin = async () => {\n  try {\n    loading.value = true\n    await loginWith('client', credentials.value)\n    \u002F\u002F User is now logged in and redirected\n  } catch (error) {\n    console.error('Login failed:', error)\n    \u002F\u002F Handle login error\n  } finally {\n    loading.value = false\n  }\n}\n\u003C\u002Fscript>\n","vue","",[191,208,209,225,252,263,298,309,325,342,358,366,372,382,388,397,426,435,450,466,481,488,493,502,507,541,547,556,566,575,582,595,620,625,644,659,670,678,683,703,708,730,739,756,787,794,814,840,846,856,870,876,882],{"__ignoreMap":206},[210,211,214,218,222],"span",{"class":212,"line":213},"line",1,[210,215,217],{"class":216},"sMK4o","\u003C",[210,219,221],{"class":220},"swJcz","template",[210,223,224],{"class":216},">\n",[210,226,228,231,234,238,241,244,248,250],{"class":212,"line":227},2,[210,229,230],{"class":216},"  \u003C",[210,232,233],{"class":220},"form",[210,235,237],{"class":236},"spNyl"," @submit.prevent",[210,239,240],{"class":216},"=",[210,242,243],{"class":216},"\"",[210,245,247],{"class":246},"sfazB","handleLogin",[210,249,243],{"class":216},[210,251,224],{"class":216},[210,253,255,258,261],{"class":212,"line":254},3,[210,256,257],{"class":216},"    \u003C",[210,259,260],{"class":220},"div",[210,262,224],{"class":216},[210,264,266,269,272,275,277,279,282,284,287,291,294,296],{"class":212,"line":265},4,[210,267,268],{"class":216},"      \u003C",[210,270,271],{"class":220},"label",[210,273,274],{"class":236}," for",[210,276,240],{"class":216},[210,278,243],{"class":216},[210,280,281],{"class":246},"email",[210,283,243],{"class":216},[210,285,286],{"class":216},">",[210,288,290],{"class":289},"sTEyZ","Email",[210,292,293],{"class":216},"\u003C\u002F",[210,295,271],{"class":220},[210,297,224],{"class":216},[210,299,301,303,306],{"class":212,"line":300},5,[210,302,268],{"class":216},[210,304,305],{"class":220},"input",[210,307,308],{"class":216}," \n",[210,310,312,315,317,319,321,323],{"class":212,"line":311},6,[210,313,314],{"class":236},"        id",[210,316,240],{"class":216},[210,318,243],{"class":216},[210,320,281],{"class":246},[210,322,243],{"class":216},[210,324,308],{"class":216},[210,326,328,331,333,335,338,340],{"class":212,"line":327},7,[210,329,330],{"class":236},"        v-model",[210,332,240],{"class":216},[210,334,243],{"class":216},[210,336,337],{"class":246},"credentials.email",[210,339,243],{"class":216},[210,341,308],{"class":216},[210,343,345,348,350,352,354,356],{"class":212,"line":344},8,[210,346,347],{"class":236},"        type",[210,349,240],{"class":216},[210,351,243],{"class":216},[210,353,281],{"class":246},[210,355,243],{"class":216},[210,357,308],{"class":216},[210,359,361,364],{"class":212,"line":360},9,[210,362,363],{"class":236},"        required",[210,365,308],{"class":216},[210,367,369],{"class":212,"line":368},10,[210,370,371],{"class":216},"      \u002F>\n",[210,373,375,378,380],{"class":212,"line":374},11,[210,376,377],{"class":216},"    \u003C\u002F",[210,379,260],{"class":220},[210,381,224],{"class":216},[210,383,385],{"class":212,"line":384},12,[210,386,387],{"class":289},"    \n",[210,389,391,393,395],{"class":212,"line":390},13,[210,392,257],{"class":216},[210,394,260],{"class":220},[210,396,224],{"class":216},[210,398,400,402,404,406,408,410,413,415,417,420,422,424],{"class":212,"line":399},14,[210,401,268],{"class":216},[210,403,271],{"class":220},[210,405,274],{"class":236},[210,407,240],{"class":216},[210,409,243],{"class":216},[210,411,412],{"class":246},"password",[210,414,243],{"class":216},[210,416,286],{"class":216},[210,418,419],{"class":289},"Password",[210,421,293],{"class":216},[210,423,271],{"class":220},[210,425,224],{"class":216},[210,427,429,431,433],{"class":212,"line":428},15,[210,430,268],{"class":216},[210,432,305],{"class":220},[210,434,308],{"class":216},[210,436,438,440,442,444,446,448],{"class":212,"line":437},16,[210,439,314],{"class":236},[210,441,240],{"class":216},[210,443,243],{"class":216},[210,445,412],{"class":246},[210,447,243],{"class":216},[210,449,308],{"class":216},[210,451,453,455,457,459,462,464],{"class":212,"line":452},17,[210,454,330],{"class":236},[210,456,240],{"class":216},[210,458,243],{"class":216},[210,460,461],{"class":246},"credentials.password",[210,463,243],{"class":216},[210,465,308],{"class":216},[210,467,469,471,473,475,477,479],{"class":212,"line":468},18,[210,470,347],{"class":236},[210,472,240],{"class":216},[210,474,243],{"class":216},[210,476,412],{"class":246},[210,478,243],{"class":216},[210,480,308],{"class":216},[210,482,484,486],{"class":212,"line":483},19,[210,485,363],{"class":236},[210,487,308],{"class":216},[210,489,491],{"class":212,"line":490},20,[210,492,371],{"class":216},[210,494,496,498,500],{"class":212,"line":495},21,[210,497,377],{"class":216},[210,499,260],{"class":220},[210,501,224],{"class":216},[210,503,505],{"class":212,"line":504},22,[210,506,387],{"class":289},[210,508,510,512,515,518,520,522,525,527,530,532,534,537,539],{"class":212,"line":509},23,[210,511,257],{"class":216},[210,513,514],{"class":220},"button",[210,516,517],{"class":236}," type",[210,519,240],{"class":216},[210,521,243],{"class":216},[210,523,524],{"class":246},"submit",[210,526,243],{"class":216},[210,528,529],{"class":236}," :disabled",[210,531,240],{"class":216},[210,533,243],{"class":216},[210,535,536],{"class":246},"loading",[210,538,243],{"class":216},[210,540,224],{"class":216},[210,542,544],{"class":212,"line":543},24,[210,545,546],{"class":289},"      {{ loading ? 'Signing in...' : 'Sign In' }}\n",[210,548,550,552,554],{"class":212,"line":549},25,[210,551,377],{"class":216},[210,553,514],{"class":220},[210,555,224],{"class":216},[210,557,559,562,564],{"class":212,"line":558},26,[210,560,561],{"class":216},"  \u003C\u002F",[210,563,233],{"class":220},[210,565,224],{"class":216},[210,567,569,571,573],{"class":212,"line":568},27,[210,570,293],{"class":216},[210,572,221],{"class":220},[210,574,224],{"class":216},[210,576,578],{"class":212,"line":577},28,[210,579,581],{"emptyLinePlaceholder":580},true,"\n",[210,583,585,587,590,593],{"class":212,"line":584},29,[210,586,217],{"class":216},[210,588,589],{"class":220},"script",[210,591,592],{"class":236}," setup",[210,594,224],{"class":216},[210,596,598,601,604,607,610,613,617],{"class":212,"line":597},30,[210,599,600],{"class":236},"const",[210,602,603],{"class":216}," {",[210,605,606],{"class":289}," loginWith ",[210,608,609],{"class":216},"}",[210,611,612],{"class":216}," =",[210,614,616],{"class":615},"s2Zo4"," useAuth",[210,618,619],{"class":289},"()\n",[210,621,623],{"class":212,"line":622},31,[210,624,581],{"emptyLinePlaceholder":580},[210,626,628,630,633,635,638,641],{"class":212,"line":627},32,[210,629,600],{"class":236},[210,631,632],{"class":289}," credentials ",[210,634,240],{"class":216},[210,636,637],{"class":615}," ref",[210,639,640],{"class":289},"(",[210,642,643],{"class":216},"{\n",[210,645,647,650,653,656],{"class":212,"line":646},33,[210,648,649],{"class":220},"  email",[210,651,652],{"class":216},":",[210,654,655],{"class":216}," ''",[210,657,658],{"class":216},",\n",[210,660,662,665,667],{"class":212,"line":661},34,[210,663,664],{"class":220},"  password",[210,666,652],{"class":216},[210,668,669],{"class":216}," ''\n",[210,671,673,675],{"class":212,"line":672},35,[210,674,609],{"class":216},[210,676,677],{"class":289},")\n",[210,679,681],{"class":212,"line":680},36,[210,682,581],{"emptyLinePlaceholder":580},[210,684,686,688,691,693,695,697,701],{"class":212,"line":685},37,[210,687,600],{"class":236},[210,689,690],{"class":289}," loading ",[210,692,240],{"class":216},[210,694,637],{"class":615},[210,696,640],{"class":289},[210,698,700],{"class":699},"sfNiH","false",[210,702,677],{"class":289},[210,704,706],{"class":212,"line":705},38,[210,707,581],{"emptyLinePlaceholder":580},[210,709,711,713,716,718,721,724,727],{"class":212,"line":710},39,[210,712,600],{"class":236},[210,714,715],{"class":289}," handleLogin ",[210,717,240],{"class":216},[210,719,720],{"class":236}," async",[210,722,723],{"class":216}," ()",[210,725,726],{"class":236}," =>",[210,728,729],{"class":216}," {\n",[210,731,733,737],{"class":212,"line":732},40,[210,734,736],{"class":735},"s7zQu","  try",[210,738,729],{"class":216},[210,740,742,745,748,751,753],{"class":212,"line":741},41,[210,743,744],{"class":289},"    loading",[210,746,747],{"class":216},".",[210,749,750],{"class":289},"value",[210,752,612],{"class":216},[210,754,755],{"class":699}," true\n",[210,757,759,762,765,767,770,773,775,778,781,783,785],{"class":212,"line":758},42,[210,760,761],{"class":735},"    await",[210,763,764],{"class":615}," loginWith",[210,766,640],{"class":220},[210,768,769],{"class":216},"'",[210,771,772],{"class":246},"client",[210,774,769],{"class":216},[210,776,777],{"class":216},",",[210,779,780],{"class":289}," credentials",[210,782,747],{"class":216},[210,784,750],{"class":289},[210,786,677],{"class":220},[210,788,790],{"class":212,"line":789},43,[210,791,793],{"class":792},"sHwdD","    \u002F\u002F User is now logged in and redirected\n",[210,795,797,800,803,806,809,812],{"class":212,"line":796},44,[210,798,799],{"class":216},"  }",[210,801,802],{"class":735}," catch",[210,804,805],{"class":220}," (",[210,807,808],{"class":289},"error",[210,810,811],{"class":220},") ",[210,813,643],{"class":216},[210,815,817,820,822,824,826,828,831,833,835,838],{"class":212,"line":816},45,[210,818,819],{"class":289},"    console",[210,821,747],{"class":216},[210,823,808],{"class":615},[210,825,640],{"class":220},[210,827,769],{"class":216},[210,829,830],{"class":246},"Login failed:",[210,832,769],{"class":216},[210,834,777],{"class":216},[210,836,837],{"class":289}," error",[210,839,677],{"class":220},[210,841,843],{"class":212,"line":842},46,[210,844,845],{"class":792},"    \u002F\u002F Handle login error\n",[210,847,849,851,854],{"class":212,"line":848},47,[210,850,799],{"class":216},[210,852,853],{"class":735}," finally",[210,855,729],{"class":216},[210,857,859,861,863,865,867],{"class":212,"line":858},48,[210,860,744],{"class":289},[210,862,747],{"class":216},[210,864,750],{"class":289},[210,866,612],{"class":216},[210,868,869],{"class":699}," false\n",[210,871,873],{"class":212,"line":872},49,[210,874,875],{"class":216},"  }\n",[210,877,879],{"class":212,"line":878},50,[210,880,881],{"class":216},"}\n",[210,883,885,887,889],{"class":212,"line":884},51,[210,886,293],{"class":216},[210,888,589],{"class":220},[210,890,224],{"class":216},[196,892,894],{"id":893},"login-response","Login Response",[176,896,897],{},"When login succeeds, the response contains:",[201,899,903],{"className":900,"code":901,"language":902,"meta":206,"style":206},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","interface AuthResponse {\n  token: string        \u002F\u002F OAuth2 access token\n  expires: string      \u002F\u002F Token expiration timestamp\n  refresh_token: string \u002F\u002F Token for refreshing access\n}\n","typescript",[191,904,905,916,929,941,953],{"__ignoreMap":206},[210,906,907,910,914],{"class":212,"line":213},[210,908,909],{"class":236},"interface",[210,911,913],{"class":912},"sBMFI"," AuthResponse",[210,915,729],{"class":216},[210,917,918,921,923,926],{"class":212,"line":227},[210,919,920],{"class":220},"  token",[210,922,652],{"class":216},[210,924,925],{"class":912}," string",[210,927,928],{"class":792},"        \u002F\u002F OAuth2 access token\n",[210,930,931,934,936,938],{"class":212,"line":254},[210,932,933],{"class":220},"  expires",[210,935,652],{"class":216},[210,937,925],{"class":912},[210,939,940],{"class":792},"      \u002F\u002F Token expiration timestamp\n",[210,942,943,946,948,950],{"class":212,"line":265},[210,944,945],{"class":220},"  refresh_token",[210,947,652],{"class":216},[210,949,925],{"class":912},[210,951,952],{"class":792}," \u002F\u002F Token for refreshing access\n",[210,954,955],{"class":212,"line":300},[210,956,881],{"class":216},[183,958,960],{"id":959},"custom-login-endpoint","Custom Login Endpoint",[176,962,963],{},"You can customize the login endpoint in your configuration:",[201,965,968],{"className":900,"code":966,"filename":967,"language":902,"meta":206,"style":206},"export default defineNuxtConfig({\n  auth: {\n    provider: 'passport',\n    strategies: {\n      client: {\n        endpoints: {\n          login: {\n            url: '\u002Foauth\u002Ftoken',\n            method: 'POST',\n            alias: 'oauth-token'\n          }\n        }\n      }\n    }\n  }\n})\n","nuxt.config.ts",[191,969,970,985,994,1011,1020,1029,1038,1047,1063,1079,1094,1099,1104,1109,1114,1118],{"__ignoreMap":206},[210,971,972,975,978,981,983],{"class":212,"line":213},[210,973,974],{"class":735},"export",[210,976,977],{"class":735}," default",[210,979,980],{"class":615}," defineNuxtConfig",[210,982,640],{"class":289},[210,984,643],{"class":216},[210,986,987,990,992],{"class":212,"line":227},[210,988,989],{"class":220},"  auth",[210,991,652],{"class":216},[210,993,729],{"class":216},[210,995,996,999,1001,1004,1007,1009],{"class":212,"line":254},[210,997,998],{"class":220},"    provider",[210,1000,652],{"class":216},[210,1002,1003],{"class":216}," '",[210,1005,1006],{"class":246},"passport",[210,1008,769],{"class":216},[210,1010,658],{"class":216},[210,1012,1013,1016,1018],{"class":212,"line":265},[210,1014,1015],{"class":220},"    strategies",[210,1017,652],{"class":216},[210,1019,729],{"class":216},[210,1021,1022,1025,1027],{"class":212,"line":300},[210,1023,1024],{"class":220},"      client",[210,1026,652],{"class":216},[210,1028,729],{"class":216},[210,1030,1031,1034,1036],{"class":212,"line":311},[210,1032,1033],{"class":220},"        endpoints",[210,1035,652],{"class":216},[210,1037,729],{"class":216},[210,1039,1040,1043,1045],{"class":212,"line":327},[210,1041,1042],{"class":220},"          login",[210,1044,652],{"class":216},[210,1046,729],{"class":216},[210,1048,1049,1052,1054,1056,1059,1061],{"class":212,"line":344},[210,1050,1051],{"class":220},"            url",[210,1053,652],{"class":216},[210,1055,1003],{"class":216},[210,1057,1058],{"class":246},"\u002Foauth\u002Ftoken",[210,1060,769],{"class":216},[210,1062,658],{"class":216},[210,1064,1065,1068,1070,1072,1075,1077],{"class":212,"line":360},[210,1066,1067],{"class":220},"            method",[210,1069,652],{"class":216},[210,1071,1003],{"class":216},[210,1073,1074],{"class":246},"POST",[210,1076,769],{"class":216},[210,1078,658],{"class":216},[210,1080,1081,1084,1086,1088,1091],{"class":212,"line":368},[210,1082,1083],{"class":220},"            alias",[210,1085,652],{"class":216},[210,1087,1003],{"class":216},[210,1089,1090],{"class":246},"oauth-token",[210,1092,1093],{"class":216},"'\n",[210,1095,1096],{"class":212,"line":374},[210,1097,1098],{"class":216},"          }\n",[210,1100,1101],{"class":212,"line":384},[210,1102,1103],{"class":216},"        }\n",[210,1105,1106],{"class":212,"line":390},[210,1107,1108],{"class":216},"      }\n",[210,1110,1111],{"class":212,"line":399},[210,1112,1113],{"class":216},"    }\n",[210,1115,1116],{"class":212,"line":428},[210,1117,875],{"class":216},[210,1119,1120,1122],{"class":212,"line":437},[210,1121,609],{"class":216},[210,1123,677],{"class":289},[183,1125,1127],{"id":1126},"basic-logout","Basic Logout",[176,1129,189,1130,1133],{},[191,1131,1132],{},"logout"," method handles session termination and cleanup.",[196,1135,1137],{"id":1136},"simple-logout-implementation","Simple Logout Implementation",[201,1139,1141],{"className":203,"code":1140,"language":205,"meta":206,"style":206},"\u003Ctemplate>\n  \u003Cdiv v-if=\"loggedIn\">\n    \u003Cp>Welcome, {{ user?.name }}!\u003C\u002Fp>\n    \u003Cbutton @click=\"handleLogout\">\n      Sign Out\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nconst { loggedIn, user, logout } = useAuth()\n\nconst handleLogout = async () => {\n  try {\n    await logout('client')\n    \u002F\u002F User is now logged out and redirected\n  } catch (error) {\n    console.error('Logout failed:', error)\n    \u002F\u002F Handle logout error\n  }\n}\n\u003C\u002Fscript>\n",[191,1142,1143,1151,1171,1188,1208,1213,1221,1229,1237,1241,1251,1278,1282,1299,1305,1322,1327,1341,1364,1369,1373,1377],{"__ignoreMap":206},[210,1144,1145,1147,1149],{"class":212,"line":213},[210,1146,217],{"class":216},[210,1148,221],{"class":220},[210,1150,224],{"class":216},[210,1152,1153,1155,1157,1160,1162,1164,1167,1169],{"class":212,"line":227},[210,1154,230],{"class":216},[210,1156,260],{"class":220},[210,1158,1159],{"class":236}," v-if",[210,1161,240],{"class":216},[210,1163,243],{"class":216},[210,1165,1166],{"class":246},"loggedIn",[210,1168,243],{"class":216},[210,1170,224],{"class":216},[210,1172,1173,1175,1177,1179,1182,1184,1186],{"class":212,"line":254},[210,1174,257],{"class":216},[210,1176,176],{"class":220},[210,1178,286],{"class":216},[210,1180,1181],{"class":289},"Welcome, {{ user?.name }}!",[210,1183,293],{"class":216},[210,1185,176],{"class":220},[210,1187,224],{"class":216},[210,1189,1190,1192,1194,1197,1199,1201,1204,1206],{"class":212,"line":265},[210,1191,257],{"class":216},[210,1193,514],{"class":220},[210,1195,1196],{"class":236}," @click",[210,1198,240],{"class":216},[210,1200,243],{"class":216},[210,1202,1203],{"class":246},"handleLogout",[210,1205,243],{"class":216},[210,1207,224],{"class":216},[210,1209,1210],{"class":212,"line":300},[210,1211,1212],{"class":289},"      Sign Out\n",[210,1214,1215,1217,1219],{"class":212,"line":311},[210,1216,377],{"class":216},[210,1218,514],{"class":220},[210,1220,224],{"class":216},[210,1222,1223,1225,1227],{"class":212,"line":327},[210,1224,561],{"class":216},[210,1226,260],{"class":220},[210,1228,224],{"class":216},[210,1230,1231,1233,1235],{"class":212,"line":344},[210,1232,293],{"class":216},[210,1234,221],{"class":220},[210,1236,224],{"class":216},[210,1238,1239],{"class":212,"line":360},[210,1240,581],{"emptyLinePlaceholder":580},[210,1242,1243,1245,1247,1249],{"class":212,"line":368},[210,1244,217],{"class":216},[210,1246,589],{"class":220},[210,1248,592],{"class":236},[210,1250,224],{"class":216},[210,1252,1253,1255,1257,1260,1262,1265,1267,1270,1272,1274,1276],{"class":212,"line":374},[210,1254,600],{"class":236},[210,1256,603],{"class":216},[210,1258,1259],{"class":289}," loggedIn",[210,1261,777],{"class":216},[210,1263,1264],{"class":289}," user",[210,1266,777],{"class":216},[210,1268,1269],{"class":289}," logout ",[210,1271,609],{"class":216},[210,1273,612],{"class":216},[210,1275,616],{"class":615},[210,1277,619],{"class":289},[210,1279,1280],{"class":212,"line":384},[210,1281,581],{"emptyLinePlaceholder":580},[210,1283,1284,1286,1289,1291,1293,1295,1297],{"class":212,"line":390},[210,1285,600],{"class":236},[210,1287,1288],{"class":289}," handleLogout ",[210,1290,240],{"class":216},[210,1292,720],{"class":236},[210,1294,723],{"class":216},[210,1296,726],{"class":236},[210,1298,729],{"class":216},[210,1300,1301,1303],{"class":212,"line":399},[210,1302,736],{"class":735},[210,1304,729],{"class":216},[210,1306,1307,1309,1312,1314,1316,1318,1320],{"class":212,"line":428},[210,1308,761],{"class":735},[210,1310,1311],{"class":615}," logout",[210,1313,640],{"class":220},[210,1315,769],{"class":216},[210,1317,772],{"class":246},[210,1319,769],{"class":216},[210,1321,677],{"class":220},[210,1323,1324],{"class":212,"line":437},[210,1325,1326],{"class":792},"    \u002F\u002F User is now logged out and redirected\n",[210,1328,1329,1331,1333,1335,1337,1339],{"class":212,"line":452},[210,1330,799],{"class":216},[210,1332,802],{"class":735},[210,1334,805],{"class":220},[210,1336,808],{"class":289},[210,1338,811],{"class":220},[210,1340,643],{"class":216},[210,1342,1343,1345,1347,1349,1351,1353,1356,1358,1360,1362],{"class":212,"line":468},[210,1344,819],{"class":289},[210,1346,747],{"class":216},[210,1348,808],{"class":615},[210,1350,640],{"class":220},[210,1352,769],{"class":216},[210,1354,1355],{"class":246},"Logout failed:",[210,1357,769],{"class":216},[210,1359,777],{"class":216},[210,1361,837],{"class":289},[210,1363,677],{"class":220},[210,1365,1366],{"class":212,"line":483},[210,1367,1368],{"class":792},"    \u002F\u002F Handle logout error\n",[210,1370,1371],{"class":212,"line":490},[210,1372,875],{"class":216},[210,1374,1375],{"class":212,"line":495},[210,1376,881],{"class":216},[210,1378,1379,1381,1383],{"class":212,"line":504},[210,1380,293],{"class":216},[210,1382,589],{"class":220},[210,1384,224],{"class":216},[183,1386,1388],{"id":1387},"advanced-login-with-error-handling","Advanced Login with Error Handling",[201,1390,1392],{"className":203,"code":1391,"language":205,"meta":206,"style":206},"\u003Cscript setup>\nconst { loginWith } = useAuth()\n\nconst credentials = ref({\n  email: '',\n  password: ''\n})\n\nconst error = ref('')\nconst loading = ref(false)\n\nconst handleLogin = async () => {\n  error.value = ''\n  loading.value = true\n  \n  try {\n    await loginWith('client', credentials.value)\n    \u002F\u002F Success - user will be redirected automatically\n  } catch (err) {\n    \u002F\u002F Handle different error types\n    if (err.statusCode === 401) {\n      error.value = 'Invalid credentials'\n    } else if (err.statusCode === 422) {\n      error.value = 'Validation error'\n    } else {\n      error.value = 'Login failed. Please try again.'\n    }\n  } finally {\n    loading.value = false\n  }\n}\n\u003C\u002Fscript>\n",[191,1393,1394,1404,1420,1424,1438,1448,1456,1462,1466,1484,1500,1504,1520,1533,1546,1551,1557,1581,1586,1601,1606,1631,1649,1677,1694,1702,1719,1723,1731,1743,1747,1751],{"__ignoreMap":206},[210,1395,1396,1398,1400,1402],{"class":212,"line":213},[210,1397,217],{"class":216},[210,1399,589],{"class":220},[210,1401,592],{"class":236},[210,1403,224],{"class":216},[210,1405,1406,1408,1410,1412,1414,1416,1418],{"class":212,"line":227},[210,1407,600],{"class":236},[210,1409,603],{"class":216},[210,1411,606],{"class":289},[210,1413,609],{"class":216},[210,1415,612],{"class":216},[210,1417,616],{"class":615},[210,1419,619],{"class":289},[210,1421,1422],{"class":212,"line":254},[210,1423,581],{"emptyLinePlaceholder":580},[210,1425,1426,1428,1430,1432,1434,1436],{"class":212,"line":265},[210,1427,600],{"class":236},[210,1429,632],{"class":289},[210,1431,240],{"class":216},[210,1433,637],{"class":615},[210,1435,640],{"class":289},[210,1437,643],{"class":216},[210,1439,1440,1442,1444,1446],{"class":212,"line":300},[210,1441,649],{"class":220},[210,1443,652],{"class":216},[210,1445,655],{"class":216},[210,1447,658],{"class":216},[210,1449,1450,1452,1454],{"class":212,"line":311},[210,1451,664],{"class":220},[210,1453,652],{"class":216},[210,1455,669],{"class":216},[210,1457,1458,1460],{"class":212,"line":327},[210,1459,609],{"class":216},[210,1461,677],{"class":289},[210,1463,1464],{"class":212,"line":344},[210,1465,581],{"emptyLinePlaceholder":580},[210,1467,1468,1470,1473,1475,1477,1479,1482],{"class":212,"line":360},[210,1469,600],{"class":236},[210,1471,1472],{"class":289}," error ",[210,1474,240],{"class":216},[210,1476,637],{"class":615},[210,1478,640],{"class":289},[210,1480,1481],{"class":216},"''",[210,1483,677],{"class":289},[210,1485,1486,1488,1490,1492,1494,1496,1498],{"class":212,"line":368},[210,1487,600],{"class":236},[210,1489,690],{"class":289},[210,1491,240],{"class":216},[210,1493,637],{"class":615},[210,1495,640],{"class":289},[210,1497,700],{"class":699},[210,1499,677],{"class":289},[210,1501,1502],{"class":212,"line":374},[210,1503,581],{"emptyLinePlaceholder":580},[210,1505,1506,1508,1510,1512,1514,1516,1518],{"class":212,"line":384},[210,1507,600],{"class":236},[210,1509,715],{"class":289},[210,1511,240],{"class":216},[210,1513,720],{"class":236},[210,1515,723],{"class":216},[210,1517,726],{"class":236},[210,1519,729],{"class":216},[210,1521,1522,1525,1527,1529,1531],{"class":212,"line":390},[210,1523,1524],{"class":289},"  error",[210,1526,747],{"class":216},[210,1528,750],{"class":289},[210,1530,612],{"class":216},[210,1532,669],{"class":216},[210,1534,1535,1538,1540,1542,1544],{"class":212,"line":399},[210,1536,1537],{"class":289},"  loading",[210,1539,747],{"class":216},[210,1541,750],{"class":289},[210,1543,612],{"class":216},[210,1545,755],{"class":699},[210,1547,1548],{"class":212,"line":428},[210,1549,1550],{"class":220},"  \n",[210,1552,1553,1555],{"class":212,"line":437},[210,1554,736],{"class":735},[210,1556,729],{"class":216},[210,1558,1559,1561,1563,1565,1567,1569,1571,1573,1575,1577,1579],{"class":212,"line":452},[210,1560,761],{"class":735},[210,1562,764],{"class":615},[210,1564,640],{"class":220},[210,1566,769],{"class":216},[210,1568,772],{"class":246},[210,1570,769],{"class":216},[210,1572,777],{"class":216},[210,1574,780],{"class":289},[210,1576,747],{"class":216},[210,1578,750],{"class":289},[210,1580,677],{"class":220},[210,1582,1583],{"class":212,"line":468},[210,1584,1585],{"class":792},"    \u002F\u002F Success - user will be redirected automatically\n",[210,1587,1588,1590,1592,1594,1597,1599],{"class":212,"line":483},[210,1589,799],{"class":216},[210,1591,802],{"class":735},[210,1593,805],{"class":220},[210,1595,1596],{"class":289},"err",[210,1598,811],{"class":220},[210,1600,643],{"class":216},[210,1602,1603],{"class":212,"line":490},[210,1604,1605],{"class":792},"    \u002F\u002F Handle different error types\n",[210,1607,1608,1611,1613,1615,1617,1620,1623,1627,1629],{"class":212,"line":495},[210,1609,1610],{"class":735},"    if",[210,1612,805],{"class":220},[210,1614,1596],{"class":289},[210,1616,747],{"class":216},[210,1618,1619],{"class":289},"statusCode",[210,1621,1622],{"class":216}," ===",[210,1624,1626],{"class":1625},"sbssI"," 401",[210,1628,811],{"class":220},[210,1630,643],{"class":216},[210,1632,1633,1636,1638,1640,1642,1644,1647],{"class":212,"line":504},[210,1634,1635],{"class":289},"      error",[210,1637,747],{"class":216},[210,1639,750],{"class":289},[210,1641,612],{"class":216},[210,1643,1003],{"class":216},[210,1645,1646],{"class":246},"Invalid credentials",[210,1648,1093],{"class":216},[210,1650,1651,1654,1657,1660,1662,1664,1666,1668,1670,1673,1675],{"class":212,"line":509},[210,1652,1653],{"class":216},"    }",[210,1655,1656],{"class":735}," else",[210,1658,1659],{"class":735}," if",[210,1661,805],{"class":220},[210,1663,1596],{"class":289},[210,1665,747],{"class":216},[210,1667,1619],{"class":289},[210,1669,1622],{"class":216},[210,1671,1672],{"class":1625}," 422",[210,1674,811],{"class":220},[210,1676,643],{"class":216},[210,1678,1679,1681,1683,1685,1687,1689,1692],{"class":212,"line":543},[210,1680,1635],{"class":289},[210,1682,747],{"class":216},[210,1684,750],{"class":289},[210,1686,612],{"class":216},[210,1688,1003],{"class":216},[210,1690,1691],{"class":246},"Validation error",[210,1693,1093],{"class":216},[210,1695,1696,1698,1700],{"class":212,"line":549},[210,1697,1653],{"class":216},[210,1699,1656],{"class":735},[210,1701,729],{"class":216},[210,1703,1704,1706,1708,1710,1712,1714,1717],{"class":212,"line":558},[210,1705,1635],{"class":289},[210,1707,747],{"class":216},[210,1709,750],{"class":289},[210,1711,612],{"class":216},[210,1713,1003],{"class":216},[210,1715,1716],{"class":246},"Login failed. Please try again.",[210,1718,1093],{"class":216},[210,1720,1721],{"class":212,"line":568},[210,1722,1113],{"class":216},[210,1724,1725,1727,1729],{"class":212,"line":577},[210,1726,799],{"class":216},[210,1728,853],{"class":735},[210,1730,729],{"class":216},[210,1732,1733,1735,1737,1739,1741],{"class":212,"line":584},[210,1734,744],{"class":289},[210,1736,747],{"class":216},[210,1738,750],{"class":289},[210,1740,612],{"class":216},[210,1742,869],{"class":699},[210,1744,1745],{"class":212,"line":597},[210,1746,875],{"class":216},[210,1748,1749],{"class":212,"line":622},[210,1750,881],{"class":216},[210,1752,1753,1755,1757],{"class":212,"line":627},[210,1754,293],{"class":216},[210,1756,589],{"class":220},[210,1758,224],{"class":216},[183,1760,1762],{"id":1761},"login-with-remember-me","Login with Remember Me",[176,1764,1765],{},"Implement \"Remember Me\" functionality by extending the credentials:",[201,1767,1769],{"className":203,"code":1768,"language":205,"meta":206,"style":206},"\u003Cscript setup>\nconst credentials = ref({\n  email: '',\n  password: '',\n  remember: false\n})\n\nconst handleLogin = async () => {\n  await loginWith('client', credentials.value)\n}\n\u003C\u002Fscript>\n",[191,1770,1771,1781,1795,1805,1815,1824,1830,1834,1850,1875,1879],{"__ignoreMap":206},[210,1772,1773,1775,1777,1779],{"class":212,"line":213},[210,1774,217],{"class":216},[210,1776,589],{"class":220},[210,1778,592],{"class":236},[210,1780,224],{"class":216},[210,1782,1783,1785,1787,1789,1791,1793],{"class":212,"line":227},[210,1784,600],{"class":236},[210,1786,632],{"class":289},[210,1788,240],{"class":216},[210,1790,637],{"class":615},[210,1792,640],{"class":289},[210,1794,643],{"class":216},[210,1796,1797,1799,1801,1803],{"class":212,"line":254},[210,1798,649],{"class":220},[210,1800,652],{"class":216},[210,1802,655],{"class":216},[210,1804,658],{"class":216},[210,1806,1807,1809,1811,1813],{"class":212,"line":265},[210,1808,664],{"class":220},[210,1810,652],{"class":216},[210,1812,655],{"class":216},[210,1814,658],{"class":216},[210,1816,1817,1820,1822],{"class":212,"line":300},[210,1818,1819],{"class":220},"  remember",[210,1821,652],{"class":216},[210,1823,869],{"class":699},[210,1825,1826,1828],{"class":212,"line":311},[210,1827,609],{"class":216},[210,1829,677],{"class":289},[210,1831,1832],{"class":212,"line":327},[210,1833,581],{"emptyLinePlaceholder":580},[210,1835,1836,1838,1840,1842,1844,1846,1848],{"class":212,"line":344},[210,1837,600],{"class":236},[210,1839,715],{"class":289},[210,1841,240],{"class":216},[210,1843,720],{"class":236},[210,1845,723],{"class":216},[210,1847,726],{"class":236},[210,1849,729],{"class":216},[210,1851,1852,1855,1857,1859,1861,1863,1865,1867,1869,1871,1873],{"class":212,"line":360},[210,1853,1854],{"class":735},"  await",[210,1856,764],{"class":615},[210,1858,640],{"class":220},[210,1860,769],{"class":216},[210,1862,772],{"class":246},[210,1864,769],{"class":216},[210,1866,777],{"class":216},[210,1868,780],{"class":289},[210,1870,747],{"class":216},[210,1872,750],{"class":289},[210,1874,677],{"class":220},[210,1876,1877],{"class":212,"line":368},[210,1878,881],{"class":216},[210,1880,1881,1883,1885],{"class":212,"line":374},[210,1882,293],{"class":216},[210,1884,589],{"class":220},[210,1886,224],{"class":216},[1888,1889,1890],"blockquote",{},[176,1891,1892,1896,1897,1900,1901,1903],{},[1893,1894,1895],"strong",{},"Note:"," The ",[191,1898,1899],{},"remember"," value must be honored by your backend login endpoint and Laravel Passport\u002Fsession configuration to change token or session lifetime. This example depends on this existing backend contract - ensure your server is configured to handle the ",[191,1902,1899],{}," parameter appropriately.",[183,1905,1907],{"id":1906},"multiple-authentication-strategies","Multiple Authentication Strategies",[176,1909,1910],{},"Configure multiple strategies for different user types:",[201,1912,1914],{"className":900,"code":1913,"filename":967,"language":902,"meta":206,"style":206},"export default defineNuxtConfig({\n  auth: {\n    provider: 'passport',\n    strategies: {\n      admin: {\n        endpoints: {\n          login: { url: '\u002Fapi\u002Fadmin\u002Flogin', method: 'POST' },\n          user: { url: '\u002Fapi\u002Fadmin\u002Fuser', method: 'GET' }\n        },\n        redirect: {\n          login: '\u002Fadmin\u002Fdashboard',\n          logout: '\u002Fadmin\u002Flogin'\n        }\n      },\n      customer: {\n        endpoints: {\n          login: { url: '\u002Fapi\u002Fcustomer\u002Flogin', method: 'POST' },\n          user: { url: '\u002Fapi\u002Fcustomer\u002Fuser', method: 'GET' }\n        },\n        redirect: {\n          login: '\u002Fcustomer\u002Fdashboard',\n          logout: '\u002Fcustomer\u002Flogin'\n        }\n      }\n    }\n  }\n})\n",[191,1915,1916,1928,1936,1950,1958,1967,1975,2011,2047,2052,2061,2076,2090,2094,2099,2108,2116,2149,2182,2186,2194,2209,2222,2226,2230,2234,2238],{"__ignoreMap":206},[210,1917,1918,1920,1922,1924,1926],{"class":212,"line":213},[210,1919,974],{"class":735},[210,1921,977],{"class":735},[210,1923,980],{"class":615},[210,1925,640],{"class":289},[210,1927,643],{"class":216},[210,1929,1930,1932,1934],{"class":212,"line":227},[210,1931,989],{"class":220},[210,1933,652],{"class":216},[210,1935,729],{"class":216},[210,1937,1938,1940,1942,1944,1946,1948],{"class":212,"line":254},[210,1939,998],{"class":220},[210,1941,652],{"class":216},[210,1943,1003],{"class":216},[210,1945,1006],{"class":246},[210,1947,769],{"class":216},[210,1949,658],{"class":216},[210,1951,1952,1954,1956],{"class":212,"line":265},[210,1953,1015],{"class":220},[210,1955,652],{"class":216},[210,1957,729],{"class":216},[210,1959,1960,1963,1965],{"class":212,"line":300},[210,1961,1962],{"class":220},"      admin",[210,1964,652],{"class":216},[210,1966,729],{"class":216},[210,1968,1969,1971,1973],{"class":212,"line":311},[210,1970,1033],{"class":220},[210,1972,652],{"class":216},[210,1974,729],{"class":216},[210,1976,1977,1979,1981,1983,1986,1988,1990,1993,1995,1997,2000,2002,2004,2006,2008],{"class":212,"line":327},[210,1978,1042],{"class":220},[210,1980,652],{"class":216},[210,1982,603],{"class":216},[210,1984,1985],{"class":220}," url",[210,1987,652],{"class":216},[210,1989,1003],{"class":216},[210,1991,1992],{"class":246},"\u002Fapi\u002Fadmin\u002Flogin",[210,1994,769],{"class":216},[210,1996,777],{"class":216},[210,1998,1999],{"class":220}," method",[210,2001,652],{"class":216},[210,2003,1003],{"class":216},[210,2005,1074],{"class":246},[210,2007,769],{"class":216},[210,2009,2010],{"class":216}," },\n",[210,2012,2013,2016,2018,2020,2022,2024,2026,2029,2031,2033,2035,2037,2039,2042,2044],{"class":212,"line":344},[210,2014,2015],{"class":220},"          user",[210,2017,652],{"class":216},[210,2019,603],{"class":216},[210,2021,1985],{"class":220},[210,2023,652],{"class":216},[210,2025,1003],{"class":216},[210,2027,2028],{"class":246},"\u002Fapi\u002Fadmin\u002Fuser",[210,2030,769],{"class":216},[210,2032,777],{"class":216},[210,2034,1999],{"class":220},[210,2036,652],{"class":216},[210,2038,1003],{"class":216},[210,2040,2041],{"class":246},"GET",[210,2043,769],{"class":216},[210,2045,2046],{"class":216}," }\n",[210,2048,2049],{"class":212,"line":360},[210,2050,2051],{"class":216},"        },\n",[210,2053,2054,2057,2059],{"class":212,"line":368},[210,2055,2056],{"class":220},"        redirect",[210,2058,652],{"class":216},[210,2060,729],{"class":216},[210,2062,2063,2065,2067,2069,2072,2074],{"class":212,"line":374},[210,2064,1042],{"class":220},[210,2066,652],{"class":216},[210,2068,1003],{"class":216},[210,2070,2071],{"class":246},"\u002Fadmin\u002Fdashboard",[210,2073,769],{"class":216},[210,2075,658],{"class":216},[210,2077,2078,2081,2083,2085,2088],{"class":212,"line":384},[210,2079,2080],{"class":220},"          logout",[210,2082,652],{"class":216},[210,2084,1003],{"class":216},[210,2086,2087],{"class":246},"\u002Fadmin\u002Flogin",[210,2089,1093],{"class":216},[210,2091,2092],{"class":212,"line":390},[210,2093,1103],{"class":216},[210,2095,2096],{"class":212,"line":399},[210,2097,2098],{"class":216},"      },\n",[210,2100,2101,2104,2106],{"class":212,"line":428},[210,2102,2103],{"class":220},"      customer",[210,2105,652],{"class":216},[210,2107,729],{"class":216},[210,2109,2110,2112,2114],{"class":212,"line":437},[210,2111,1033],{"class":220},[210,2113,652],{"class":216},[210,2115,729],{"class":216},[210,2117,2118,2120,2122,2124,2126,2128,2130,2133,2135,2137,2139,2141,2143,2145,2147],{"class":212,"line":452},[210,2119,1042],{"class":220},[210,2121,652],{"class":216},[210,2123,603],{"class":216},[210,2125,1985],{"class":220},[210,2127,652],{"class":216},[210,2129,1003],{"class":216},[210,2131,2132],{"class":246},"\u002Fapi\u002Fcustomer\u002Flogin",[210,2134,769],{"class":216},[210,2136,777],{"class":216},[210,2138,1999],{"class":220},[210,2140,652],{"class":216},[210,2142,1003],{"class":216},[210,2144,1074],{"class":246},[210,2146,769],{"class":216},[210,2148,2010],{"class":216},[210,2150,2151,2153,2155,2157,2159,2161,2163,2166,2168,2170,2172,2174,2176,2178,2180],{"class":212,"line":468},[210,2152,2015],{"class":220},[210,2154,652],{"class":216},[210,2156,603],{"class":216},[210,2158,1985],{"class":220},[210,2160,652],{"class":216},[210,2162,1003],{"class":216},[210,2164,2165],{"class":246},"\u002Fapi\u002Fcustomer\u002Fuser",[210,2167,769],{"class":216},[210,2169,777],{"class":216},[210,2171,1999],{"class":220},[210,2173,652],{"class":216},[210,2175,1003],{"class":216},[210,2177,2041],{"class":246},[210,2179,769],{"class":216},[210,2181,2046],{"class":216},[210,2183,2184],{"class":212,"line":483},[210,2185,2051],{"class":216},[210,2187,2188,2190,2192],{"class":212,"line":490},[210,2189,2056],{"class":220},[210,2191,652],{"class":216},[210,2193,729],{"class":216},[210,2195,2196,2198,2200,2202,2205,2207],{"class":212,"line":495},[210,2197,1042],{"class":220},[210,2199,652],{"class":216},[210,2201,1003],{"class":216},[210,2203,2204],{"class":246},"\u002Fcustomer\u002Fdashboard",[210,2206,769],{"class":216},[210,2208,658],{"class":216},[210,2210,2211,2213,2215,2217,2220],{"class":212,"line":504},[210,2212,2080],{"class":220},[210,2214,652],{"class":216},[210,2216,1003],{"class":216},[210,2218,2219],{"class":246},"\u002Fcustomer\u002Flogin",[210,2221,1093],{"class":216},[210,2223,2224],{"class":212,"line":509},[210,2225,1103],{"class":216},[210,2227,2228],{"class":212,"line":543},[210,2229,1108],{"class":216},[210,2231,2232],{"class":212,"line":549},[210,2233,1113],{"class":216},[210,2235,2236],{"class":212,"line":558},[210,2237,875],{"class":216},[210,2239,2240,2242],{"class":212,"line":568},[210,2241,609],{"class":216},[210,2243,677],{"class":289},[201,2245,2247],{"className":203,"code":2246,"language":205,"meta":206,"style":206},"\u003Cscript setup>\nconst { loginWith } = useAuth()\n\nconst adminCredentials = ref({\n  email: 'admin@example.com',\n  password: ''\n})\n\nconst customerCredentials = ref({\n  email: 'customer@example.com',\n  password: ''\n})\n\nconst credentials = ref({\n  email: '',\n  password: ''\n})\n\n\u002F\u002F Admin login\nconst handleAdminLogin = async () => {\n  await loginWith('admin', adminCredentials.value)\n}\n\n\u002F\u002F Customer login\nconst handleCustomerLogin = async () => {\n  await loginWith('customer', customerCredentials.value)\n}\n\u003C\u002Fscript>\n",[191,2248,2249,2259,2275,2279,2294,2309,2317,2323,2327,2342,2357,2365,2371,2375,2389,2399,2407,2413,2417,2422,2439,2465,2469,2473,2478,2495,2521,2525],{"__ignoreMap":206},[210,2250,2251,2253,2255,2257],{"class":212,"line":213},[210,2252,217],{"class":216},[210,2254,589],{"class":220},[210,2256,592],{"class":236},[210,2258,224],{"class":216},[210,2260,2261,2263,2265,2267,2269,2271,2273],{"class":212,"line":227},[210,2262,600],{"class":236},[210,2264,603],{"class":216},[210,2266,606],{"class":289},[210,2268,609],{"class":216},[210,2270,612],{"class":216},[210,2272,616],{"class":615},[210,2274,619],{"class":289},[210,2276,2277],{"class":212,"line":254},[210,2278,581],{"emptyLinePlaceholder":580},[210,2280,2281,2283,2286,2288,2290,2292],{"class":212,"line":265},[210,2282,600],{"class":236},[210,2284,2285],{"class":289}," adminCredentials ",[210,2287,240],{"class":216},[210,2289,637],{"class":615},[210,2291,640],{"class":289},[210,2293,643],{"class":216},[210,2295,2296,2298,2300,2302,2305,2307],{"class":212,"line":300},[210,2297,649],{"class":220},[210,2299,652],{"class":216},[210,2301,1003],{"class":216},[210,2303,2304],{"class":246},"admin@example.com",[210,2306,769],{"class":216},[210,2308,658],{"class":216},[210,2310,2311,2313,2315],{"class":212,"line":311},[210,2312,664],{"class":220},[210,2314,652],{"class":216},[210,2316,669],{"class":216},[210,2318,2319,2321],{"class":212,"line":327},[210,2320,609],{"class":216},[210,2322,677],{"class":289},[210,2324,2325],{"class":212,"line":344},[210,2326,581],{"emptyLinePlaceholder":580},[210,2328,2329,2331,2334,2336,2338,2340],{"class":212,"line":360},[210,2330,600],{"class":236},[210,2332,2333],{"class":289}," customerCredentials ",[210,2335,240],{"class":216},[210,2337,637],{"class":615},[210,2339,640],{"class":289},[210,2341,643],{"class":216},[210,2343,2344,2346,2348,2350,2353,2355],{"class":212,"line":368},[210,2345,649],{"class":220},[210,2347,652],{"class":216},[210,2349,1003],{"class":216},[210,2351,2352],{"class":246},"customer@example.com",[210,2354,769],{"class":216},[210,2356,658],{"class":216},[210,2358,2359,2361,2363],{"class":212,"line":374},[210,2360,664],{"class":220},[210,2362,652],{"class":216},[210,2364,669],{"class":216},[210,2366,2367,2369],{"class":212,"line":384},[210,2368,609],{"class":216},[210,2370,677],{"class":289},[210,2372,2373],{"class":212,"line":390},[210,2374,581],{"emptyLinePlaceholder":580},[210,2376,2377,2379,2381,2383,2385,2387],{"class":212,"line":399},[210,2378,600],{"class":236},[210,2380,632],{"class":289},[210,2382,240],{"class":216},[210,2384,637],{"class":615},[210,2386,640],{"class":289},[210,2388,643],{"class":216},[210,2390,2391,2393,2395,2397],{"class":212,"line":428},[210,2392,649],{"class":220},[210,2394,652],{"class":216},[210,2396,655],{"class":216},[210,2398,658],{"class":216},[210,2400,2401,2403,2405],{"class":212,"line":437},[210,2402,664],{"class":220},[210,2404,652],{"class":216},[210,2406,669],{"class":216},[210,2408,2409,2411],{"class":212,"line":452},[210,2410,609],{"class":216},[210,2412,677],{"class":289},[210,2414,2415],{"class":212,"line":468},[210,2416,581],{"emptyLinePlaceholder":580},[210,2418,2419],{"class":212,"line":483},[210,2420,2421],{"class":792},"\u002F\u002F Admin login\n",[210,2423,2424,2426,2429,2431,2433,2435,2437],{"class":212,"line":490},[210,2425,600],{"class":236},[210,2427,2428],{"class":289}," handleAdminLogin ",[210,2430,240],{"class":216},[210,2432,720],{"class":236},[210,2434,723],{"class":216},[210,2436,726],{"class":236},[210,2438,729],{"class":216},[210,2440,2441,2443,2445,2447,2449,2452,2454,2456,2459,2461,2463],{"class":212,"line":495},[210,2442,1854],{"class":735},[210,2444,764],{"class":615},[210,2446,640],{"class":220},[210,2448,769],{"class":216},[210,2450,2451],{"class":246},"admin",[210,2453,769],{"class":216},[210,2455,777],{"class":216},[210,2457,2458],{"class":289}," adminCredentials",[210,2460,747],{"class":216},[210,2462,750],{"class":289},[210,2464,677],{"class":220},[210,2466,2467],{"class":212,"line":504},[210,2468,881],{"class":216},[210,2470,2471],{"class":212,"line":509},[210,2472,581],{"emptyLinePlaceholder":580},[210,2474,2475],{"class":212,"line":543},[210,2476,2477],{"class":792},"\u002F\u002F Customer login\n",[210,2479,2480,2482,2485,2487,2489,2491,2493],{"class":212,"line":549},[210,2481,600],{"class":236},[210,2483,2484],{"class":289}," handleCustomerLogin ",[210,2486,240],{"class":216},[210,2488,720],{"class":236},[210,2490,723],{"class":216},[210,2492,726],{"class":236},[210,2494,729],{"class":216},[210,2496,2497,2499,2501,2503,2505,2508,2510,2512,2515,2517,2519],{"class":212,"line":558},[210,2498,1854],{"class":735},[210,2500,764],{"class":615},[210,2502,640],{"class":220},[210,2504,769],{"class":216},[210,2506,2507],{"class":246},"customer",[210,2509,769],{"class":216},[210,2511,777],{"class":216},[210,2513,2514],{"class":289}," customerCredentials",[210,2516,747],{"class":216},[210,2518,750],{"class":289},[210,2520,677],{"class":220},[210,2522,2523],{"class":212,"line":568},[210,2524,881],{"class":216},[210,2526,2527,2529,2531],{"class":212,"line":577},[210,2528,293],{"class":216},[210,2530,589],{"class":220},[210,2532,224],{"class":216},[183,2534,2536],{"id":2535},"server-side-login","Server-Side Login",[176,2538,2539],{},"For server-side operations, use the server API:",[201,2541,2544],{"className":900,"code":2542,"filename":2543,"language":902,"meta":206,"style":206},"export default defineEventHandler(async (event) => {\n  const { strategyName, value } = await readBody(event)\n  \n  try {\n    const response = await $fetch('\u002Foauth\u002Ftoken', {\n      method: 'POST',\n      body: {\n        grant_type: 'password',\n        client_id: process.env.AUTH_CLIENT_ID,\n        client_secret: process.env.AUTH_CLIENT_SECRET,\n        username: value.email,\n        password: value.password\n      }\n    })\n    \n    return response\n  } catch (error) {\n    throw createError({\n      statusCode: 401,\n      statusMessage: 'Invalid credentials'\n    })\n  }\n})\n","server\u002Fapi\u002Flogin.post.ts",[191,2545,2546,2573,2605,2609,2615,2642,2657,2666,2681,2703,2723,2738,2752,2756,2762,2766,2774,2788,2800,2811,2824,2830,2834],{"__ignoreMap":206},[210,2547,2548,2550,2552,2555,2557,2560,2562,2566,2569,2571],{"class":212,"line":213},[210,2549,974],{"class":735},[210,2551,977],{"class":735},[210,2553,2554],{"class":615}," defineEventHandler",[210,2556,640],{"class":289},[210,2558,2559],{"class":236},"async",[210,2561,805],{"class":216},[210,2563,2565],{"class":2564},"sHdIc","event",[210,2567,2568],{"class":216},")",[210,2570,726],{"class":236},[210,2572,729],{"class":216},[210,2574,2575,2578,2580,2583,2585,2588,2591,2593,2596,2599,2601,2603],{"class":212,"line":227},[210,2576,2577],{"class":236},"  const",[210,2579,603],{"class":216},[210,2581,2582],{"class":289}," strategyName",[210,2584,777],{"class":216},[210,2586,2587],{"class":289}," value",[210,2589,2590],{"class":216}," }",[210,2592,612],{"class":216},[210,2594,2595],{"class":735}," await",[210,2597,2598],{"class":615}," readBody",[210,2600,640],{"class":220},[210,2602,2565],{"class":289},[210,2604,677],{"class":220},[210,2606,2607],{"class":212,"line":254},[210,2608,1550],{"class":220},[210,2610,2611,2613],{"class":212,"line":265},[210,2612,736],{"class":735},[210,2614,729],{"class":216},[210,2616,2617,2620,2623,2625,2627,2630,2632,2634,2636,2638,2640],{"class":212,"line":300},[210,2618,2619],{"class":236},"    const",[210,2621,2622],{"class":289}," response",[210,2624,612],{"class":216},[210,2626,2595],{"class":735},[210,2628,2629],{"class":615}," $fetch",[210,2631,640],{"class":220},[210,2633,769],{"class":216},[210,2635,1058],{"class":246},[210,2637,769],{"class":216},[210,2639,777],{"class":216},[210,2641,729],{"class":216},[210,2643,2644,2647,2649,2651,2653,2655],{"class":212,"line":311},[210,2645,2646],{"class":220},"      method",[210,2648,652],{"class":216},[210,2650,1003],{"class":216},[210,2652,1074],{"class":246},[210,2654,769],{"class":216},[210,2656,658],{"class":216},[210,2658,2659,2662,2664],{"class":212,"line":327},[210,2660,2661],{"class":220},"      body",[210,2663,652],{"class":216},[210,2665,729],{"class":216},[210,2667,2668,2671,2673,2675,2677,2679],{"class":212,"line":344},[210,2669,2670],{"class":220},"        grant_type",[210,2672,652],{"class":216},[210,2674,1003],{"class":216},[210,2676,412],{"class":246},[210,2678,769],{"class":216},[210,2680,658],{"class":216},[210,2682,2683,2686,2688,2691,2693,2696,2698,2701],{"class":212,"line":360},[210,2684,2685],{"class":220},"        client_id",[210,2687,652],{"class":216},[210,2689,2690],{"class":289}," process",[210,2692,747],{"class":216},[210,2694,2695],{"class":289},"env",[210,2697,747],{"class":216},[210,2699,2700],{"class":289},"AUTH_CLIENT_ID",[210,2702,658],{"class":216},[210,2704,2705,2708,2710,2712,2714,2716,2718,2721],{"class":212,"line":368},[210,2706,2707],{"class":220},"        client_secret",[210,2709,652],{"class":216},[210,2711,2690],{"class":289},[210,2713,747],{"class":216},[210,2715,2695],{"class":289},[210,2717,747],{"class":216},[210,2719,2720],{"class":289},"AUTH_CLIENT_SECRET",[210,2722,658],{"class":216},[210,2724,2725,2728,2730,2732,2734,2736],{"class":212,"line":374},[210,2726,2727],{"class":220},"        username",[210,2729,652],{"class":216},[210,2731,2587],{"class":289},[210,2733,747],{"class":216},[210,2735,281],{"class":289},[210,2737,658],{"class":216},[210,2739,2740,2743,2745,2747,2749],{"class":212,"line":384},[210,2741,2742],{"class":220},"        password",[210,2744,652],{"class":216},[210,2746,2587],{"class":289},[210,2748,747],{"class":216},[210,2750,2751],{"class":289},"password\n",[210,2753,2754],{"class":212,"line":390},[210,2755,1108],{"class":216},[210,2757,2758,2760],{"class":212,"line":399},[210,2759,1653],{"class":216},[210,2761,677],{"class":220},[210,2763,2764],{"class":212,"line":428},[210,2765,387],{"class":220},[210,2767,2768,2771],{"class":212,"line":437},[210,2769,2770],{"class":735},"    return",[210,2772,2773],{"class":289}," response\n",[210,2775,2776,2778,2780,2782,2784,2786],{"class":212,"line":452},[210,2777,799],{"class":216},[210,2779,802],{"class":735},[210,2781,805],{"class":220},[210,2783,808],{"class":289},[210,2785,811],{"class":220},[210,2787,643],{"class":216},[210,2789,2790,2793,2796,2798],{"class":212,"line":468},[210,2791,2792],{"class":735},"    throw",[210,2794,2795],{"class":615}," createError",[210,2797,640],{"class":220},[210,2799,643],{"class":216},[210,2801,2802,2805,2807,2809],{"class":212,"line":483},[210,2803,2804],{"class":220},"      statusCode",[210,2806,652],{"class":216},[210,2808,1626],{"class":1625},[210,2810,658],{"class":216},[210,2812,2813,2816,2818,2820,2822],{"class":212,"line":490},[210,2814,2815],{"class":220},"      statusMessage",[210,2817,652],{"class":216},[210,2819,1003],{"class":216},[210,2821,1646],{"class":246},[210,2823,1093],{"class":216},[210,2825,2826,2828],{"class":212,"line":495},[210,2827,1653],{"class":216},[210,2829,677],{"class":220},[210,2831,2832],{"class":212,"line":504},[210,2833,875],{"class":216},[210,2835,2836,2838],{"class":212,"line":509},[210,2837,609],{"class":216},[210,2839,677],{"class":289},[183,2841,2843],{"id":2842},"logout-with-custom-redirect","Logout with Custom Redirect",[201,2845,2847],{"className":203,"code":2846,"language":205,"meta":206,"style":206},"\u003Cscript setup>\nconst { logout } = useAuth()\n\nconst handleLogout = async () => {\n  \u002F\u002F Override the default redirect\n  await logout('client', { redirect: '\u002Fcustom-goodbye' })\n}\n\u003C\u002Fscript>\n",[191,2848,2849,2859,2875,2879,2895,2900,2934,2938],{"__ignoreMap":206},[210,2850,2851,2853,2855,2857],{"class":212,"line":213},[210,2852,217],{"class":216},[210,2854,589],{"class":220},[210,2856,592],{"class":236},[210,2858,224],{"class":216},[210,2860,2861,2863,2865,2867,2869,2871,2873],{"class":212,"line":227},[210,2862,600],{"class":236},[210,2864,603],{"class":216},[210,2866,1269],{"class":289},[210,2868,609],{"class":216},[210,2870,612],{"class":216},[210,2872,616],{"class":615},[210,2874,619],{"class":289},[210,2876,2877],{"class":212,"line":254},[210,2878,581],{"emptyLinePlaceholder":580},[210,2880,2881,2883,2885,2887,2889,2891,2893],{"class":212,"line":265},[210,2882,600],{"class":236},[210,2884,1288],{"class":289},[210,2886,240],{"class":216},[210,2888,720],{"class":236},[210,2890,723],{"class":216},[210,2892,726],{"class":236},[210,2894,729],{"class":216},[210,2896,2897],{"class":212,"line":300},[210,2898,2899],{"class":792},"  \u002F\u002F Override the default redirect\n",[210,2901,2902,2904,2906,2908,2910,2912,2914,2916,2918,2921,2923,2925,2928,2930,2932],{"class":212,"line":311},[210,2903,1854],{"class":735},[210,2905,1311],{"class":615},[210,2907,640],{"class":220},[210,2909,769],{"class":216},[210,2911,772],{"class":246},[210,2913,769],{"class":216},[210,2915,777],{"class":216},[210,2917,603],{"class":216},[210,2919,2920],{"class":220}," redirect",[210,2922,652],{"class":216},[210,2924,1003],{"class":216},[210,2926,2927],{"class":246},"\u002Fcustom-goodbye",[210,2929,769],{"class":216},[210,2931,2590],{"class":216},[210,2933,677],{"class":220},[210,2935,2936],{"class":212,"line":327},[210,2937,881],{"class":216},[210,2939,2940,2942,2944],{"class":212,"line":344},[210,2941,293],{"class":216},[210,2943,589],{"class":220},[210,2945,224],{"class":216},[183,2947,2949],{"id":2948},"authentication-state","Authentication State",[176,2951,2952],{},"Monitor authentication state changes:",[201,2954,2956],{"className":203,"code":2955,"language":205,"meta":206,"style":206},"\u003Cscript setup>\nconst { loggedIn, user } = useAuth()\n\n\u002F\u002F Watch for auth state changes\nwatch(loggedIn, (isLoggedIn) => {\n  if (isLoggedIn) {\n    console.log('User logged in:', user.value)\n  } else {\n    console.log('User logged out')\n  }\n})\n\u003C\u002Fscript>\n",[191,2957,2958,2968,2989,2993,2998,3019,3032,3060,3068,3087,3091,3097],{"__ignoreMap":206},[210,2959,2960,2962,2964,2966],{"class":212,"line":213},[210,2961,217],{"class":216},[210,2963,589],{"class":220},[210,2965,592],{"class":236},[210,2967,224],{"class":216},[210,2969,2970,2972,2974,2976,2978,2981,2983,2985,2987],{"class":212,"line":227},[210,2971,600],{"class":236},[210,2973,603],{"class":216},[210,2975,1259],{"class":289},[210,2977,777],{"class":216},[210,2979,2980],{"class":289}," user ",[210,2982,609],{"class":216},[210,2984,612],{"class":216},[210,2986,616],{"class":615},[210,2988,619],{"class":289},[210,2990,2991],{"class":212,"line":254},[210,2992,581],{"emptyLinePlaceholder":580},[210,2994,2995],{"class":212,"line":265},[210,2996,2997],{"class":792},"\u002F\u002F Watch for auth state changes\n",[210,2999,3000,3003,3006,3008,3010,3013,3015,3017],{"class":212,"line":300},[210,3001,3002],{"class":615},"watch",[210,3004,3005],{"class":289},"(loggedIn",[210,3007,777],{"class":216},[210,3009,805],{"class":216},[210,3011,3012],{"class":2564},"isLoggedIn",[210,3014,2568],{"class":216},[210,3016,726],{"class":236},[210,3018,729],{"class":216},[210,3020,3021,3024,3026,3028,3030],{"class":212,"line":311},[210,3022,3023],{"class":735},"  if",[210,3025,805],{"class":220},[210,3027,3012],{"class":289},[210,3029,811],{"class":220},[210,3031,643],{"class":216},[210,3033,3034,3036,3038,3041,3043,3045,3048,3050,3052,3054,3056,3058],{"class":212,"line":327},[210,3035,819],{"class":289},[210,3037,747],{"class":216},[210,3039,3040],{"class":615},"log",[210,3042,640],{"class":220},[210,3044,769],{"class":216},[210,3046,3047],{"class":246},"User logged in:",[210,3049,769],{"class":216},[210,3051,777],{"class":216},[210,3053,1264],{"class":289},[210,3055,747],{"class":216},[210,3057,750],{"class":289},[210,3059,677],{"class":220},[210,3061,3062,3064,3066],{"class":212,"line":344},[210,3063,799],{"class":216},[210,3065,1656],{"class":735},[210,3067,729],{"class":216},[210,3069,3070,3072,3074,3076,3078,3080,3083,3085],{"class":212,"line":360},[210,3071,819],{"class":289},[210,3073,747],{"class":216},[210,3075,3040],{"class":615},[210,3077,640],{"class":220},[210,3079,769],{"class":216},[210,3081,3082],{"class":246},"User logged out",[210,3084,769],{"class":216},[210,3086,677],{"class":220},[210,3088,3089],{"class":212,"line":368},[210,3090,875],{"class":216},[210,3092,3093,3095],{"class":212,"line":374},[210,3094,609],{"class":216},[210,3096,677],{"class":289},[210,3098,3099,3101,3103],{"class":212,"line":384},[210,3100,293],{"class":216},[210,3102,589],{"class":220},[210,3104,224],{"class":216},[183,3106,3108],{"id":3107},"error-handling-best-practices","Error Handling Best Practices",[196,3110,3112],{"id":3111},"common-login-errors","Common Login Errors",[3114,3115,3116,3132],"table",{},[3117,3118,3119],"thead",{},[3120,3121,3122,3126,3129],"tr",{},[3123,3124,3125],"th",{},"Error",[3123,3127,3128],{},"Description",[3123,3130,3131],{},"Solution",[3133,3134,3135,3148,3160,3173],"tbody",{},[3120,3136,3137,3143,3145],{},[3138,3139,3140],"td",{},[191,3141,3142],{},"401",[3138,3144,1646],{},[3138,3146,3147],{},"Check email\u002Fpassword",[3120,3149,3150,3155,3157],{},[3138,3151,3152],{},[191,3153,3154],{},"422",[3138,3156,1691],{},[3138,3158,3159],{},"Validate input format",[3120,3161,3162,3167,3170],{},[3138,3163,3164],{},[191,3165,3166],{},"500",[3138,3168,3169],{},"Server error",[3138,3171,3172],{},"Check server logs",[3120,3174,3175,3180,3183],{},[3138,3176,3177],{},[191,3178,3179],{},"Network Error",[3138,3181,3182],{},"Connection failed",[3138,3184,3185],{},"Check API connectivity",[196,3187,3189],{"id":3188},"error-handling-component","Error Handling Component",[201,3191,3193],{"className":203,"code":3192,"language":205,"meta":206,"style":206},"\u003Ctemplate>\n  \u003Cdiv v-if=\"error\" class=\"error-message\">\n    {{ error }}\n    \u003Cbutton @click=\"error = ''\">×\u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nconst error = ref('')\n\nconst handleLogin = async () => {\n  try {\n    await loginWith('client', credentials)\n  } catch (err) {\n    error.value = getErrorMessage(err)\n  }\n}\n\nconst getErrorMessage = (err) => {\n  switch (err.statusCode) {\n    case 401: return 'Invalid email or password'\n    case 422: return 'Please check your input'\n    case 429: return 'Too many attempts. Try again later.'\n    default: return 'Login failed. Please try again.'\n  }\n}\n\u003C\u002Fscript>\n",[191,3194,3195,3203,3233,3238,3266,3274,3282,3286,3296,3312,3316,3332,3338,3358,3372,3392,3396,3400,3404,3423,3440,3459,3476,3494,3509,3513,3517],{"__ignoreMap":206},[210,3196,3197,3199,3201],{"class":212,"line":213},[210,3198,217],{"class":216},[210,3200,221],{"class":220},[210,3202,224],{"class":216},[210,3204,3205,3207,3209,3211,3213,3215,3217,3219,3222,3224,3226,3229,3231],{"class":212,"line":227},[210,3206,230],{"class":216},[210,3208,260],{"class":220},[210,3210,1159],{"class":236},[210,3212,240],{"class":216},[210,3214,243],{"class":216},[210,3216,808],{"class":246},[210,3218,243],{"class":216},[210,3220,3221],{"class":236}," class",[210,3223,240],{"class":216},[210,3225,243],{"class":216},[210,3227,3228],{"class":246},"error-message",[210,3230,243],{"class":216},[210,3232,224],{"class":216},[210,3234,3235],{"class":212,"line":254},[210,3236,3237],{"class":289},"    {{ error }}\n",[210,3239,3240,3242,3244,3246,3248,3250,3253,3255,3257,3260,3262,3264],{"class":212,"line":265},[210,3241,257],{"class":216},[210,3243,514],{"class":220},[210,3245,1196],{"class":236},[210,3247,240],{"class":216},[210,3249,243],{"class":216},[210,3251,3252],{"class":246},"error = ''",[210,3254,243],{"class":216},[210,3256,286],{"class":216},[210,3258,3259],{"class":289},"×",[210,3261,293],{"class":216},[210,3263,514],{"class":220},[210,3265,224],{"class":216},[210,3267,3268,3270,3272],{"class":212,"line":300},[210,3269,561],{"class":216},[210,3271,260],{"class":220},[210,3273,224],{"class":216},[210,3275,3276,3278,3280],{"class":212,"line":311},[210,3277,293],{"class":216},[210,3279,221],{"class":220},[210,3281,224],{"class":216},[210,3283,3284],{"class":212,"line":327},[210,3285,581],{"emptyLinePlaceholder":580},[210,3287,3288,3290,3292,3294],{"class":212,"line":344},[210,3289,217],{"class":216},[210,3291,589],{"class":220},[210,3293,592],{"class":236},[210,3295,224],{"class":216},[210,3297,3298,3300,3302,3304,3306,3308,3310],{"class":212,"line":360},[210,3299,600],{"class":236},[210,3301,1472],{"class":289},[210,3303,240],{"class":216},[210,3305,637],{"class":615},[210,3307,640],{"class":289},[210,3309,1481],{"class":216},[210,3311,677],{"class":289},[210,3313,3314],{"class":212,"line":368},[210,3315,581],{"emptyLinePlaceholder":580},[210,3317,3318,3320,3322,3324,3326,3328,3330],{"class":212,"line":374},[210,3319,600],{"class":236},[210,3321,715],{"class":289},[210,3323,240],{"class":216},[210,3325,720],{"class":236},[210,3327,723],{"class":216},[210,3329,726],{"class":236},[210,3331,729],{"class":216},[210,3333,3334,3336],{"class":212,"line":384},[210,3335,736],{"class":735},[210,3337,729],{"class":216},[210,3339,3340,3342,3344,3346,3348,3350,3352,3354,3356],{"class":212,"line":390},[210,3341,761],{"class":735},[210,3343,764],{"class":615},[210,3345,640],{"class":220},[210,3347,769],{"class":216},[210,3349,772],{"class":246},[210,3351,769],{"class":216},[210,3353,777],{"class":216},[210,3355,780],{"class":289},[210,3357,677],{"class":220},[210,3359,3360,3362,3364,3366,3368,3370],{"class":212,"line":399},[210,3361,799],{"class":216},[210,3363,802],{"class":735},[210,3365,805],{"class":220},[210,3367,1596],{"class":289},[210,3369,811],{"class":220},[210,3371,643],{"class":216},[210,3373,3374,3377,3379,3381,3383,3386,3388,3390],{"class":212,"line":428},[210,3375,3376],{"class":289},"    error",[210,3378,747],{"class":216},[210,3380,750],{"class":289},[210,3382,612],{"class":216},[210,3384,3385],{"class":615}," getErrorMessage",[210,3387,640],{"class":220},[210,3389,1596],{"class":289},[210,3391,677],{"class":220},[210,3393,3394],{"class":212,"line":437},[210,3395,875],{"class":216},[210,3397,3398],{"class":212,"line":452},[210,3399,881],{"class":216},[210,3401,3402],{"class":212,"line":468},[210,3403,581],{"emptyLinePlaceholder":580},[210,3405,3406,3408,3411,3413,3415,3417,3419,3421],{"class":212,"line":483},[210,3407,600],{"class":236},[210,3409,3410],{"class":289}," getErrorMessage ",[210,3412,240],{"class":216},[210,3414,805],{"class":216},[210,3416,1596],{"class":2564},[210,3418,2568],{"class":216},[210,3420,726],{"class":236},[210,3422,729],{"class":216},[210,3424,3425,3428,3430,3432,3434,3436,3438],{"class":212,"line":490},[210,3426,3427],{"class":735},"  switch",[210,3429,805],{"class":220},[210,3431,1596],{"class":289},[210,3433,747],{"class":216},[210,3435,1619],{"class":289},[210,3437,811],{"class":220},[210,3439,643],{"class":216},[210,3441,3442,3445,3447,3449,3452,3454,3457],{"class":212,"line":495},[210,3443,3444],{"class":735},"    case",[210,3446,1626],{"class":1625},[210,3448,652],{"class":216},[210,3450,3451],{"class":735}," return",[210,3453,1003],{"class":216},[210,3455,3456],{"class":246},"Invalid email or password",[210,3458,1093],{"class":216},[210,3460,3461,3463,3465,3467,3469,3471,3474],{"class":212,"line":504},[210,3462,3444],{"class":735},[210,3464,1672],{"class":1625},[210,3466,652],{"class":216},[210,3468,3451],{"class":735},[210,3470,1003],{"class":216},[210,3472,3473],{"class":246},"Please check your input",[210,3475,1093],{"class":216},[210,3477,3478,3480,3483,3485,3487,3489,3492],{"class":212,"line":509},[210,3479,3444],{"class":735},[210,3481,3482],{"class":1625}," 429",[210,3484,652],{"class":216},[210,3486,3451],{"class":735},[210,3488,1003],{"class":216},[210,3490,3491],{"class":246},"Too many attempts. Try again later.",[210,3493,1093],{"class":216},[210,3495,3496,3499,3501,3503,3505,3507],{"class":212,"line":543},[210,3497,3498],{"class":735},"    default",[210,3500,652],{"class":216},[210,3502,3451],{"class":735},[210,3504,1003],{"class":216},[210,3506,1716],{"class":246},[210,3508,1093],{"class":216},[210,3510,3511],{"class":212,"line":549},[210,3512,875],{"class":216},[210,3514,3515],{"class":212,"line":558},[210,3516,881],{"class":216},[210,3518,3519,3521,3523],{"class":212,"line":568},[210,3520,293],{"class":216},[210,3522,589],{"class":220},[210,3524,224],{"class":216},[180,3526],{},[176,3528,3529,3532,3533,3537],{},[1893,3530,3531],{},"Next:"," Learn about ",[3534,3535,57],"a",{"href":3536},"\u002F3.passport\u002F3.tokens"," for handling token refresh and expiration.",[3539,3540,3541],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .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 .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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":206,"searchDepth":213,"depth":227,"links":3543},[3544,3548,3549,3552,3553,3554,3555,3556,3557,3558],{"id":185,"depth":227,"text":186,"children":3545},[3546,3547],{"id":198,"depth":254,"text":199},{"id":893,"depth":254,"text":894},{"id":959,"depth":227,"text":960},{"id":1126,"depth":227,"text":1127,"children":3550},[3551],{"id":1136,"depth":254,"text":1137},{"id":1387,"depth":227,"text":1388},{"id":1761,"depth":227,"text":1762},{"id":1906,"depth":227,"text":1907},{"id":2535,"depth":227,"text":2536},{"id":2842,"depth":227,"text":2843},{"id":2948,"depth":227,"text":2949},{"id":3107,"depth":227,"text":3108,"children":3559},[3560,3561],{"id":3111,"depth":254,"text":3112},{"id":3188,"depth":254,"text":3189},"How to implement login and logout functionality with Laravel Passport","md",null,{},{"icon":55},{"title":52,"description":3562},"GfhWQnOqyE1mKUODNApGyIhrevlmnCAaegoYzPjH_IA",[3570,3572],{"title":24,"path":49,"stem":50,"description":3571,"icon":27,"children":-1},"How to configure Laravel Passport authentication in Nuxt Umbu",{"title":57,"path":58,"stem":59,"description":3573,"icon":60,"children":-1},"Managing OAuth2 tokens, refresh, and expiration with Laravel Passport",1785126612932]