[{"data":1,"prerenderedAt":3086},["ShallowReactive",2],{"navigation":3,"\u002Fpassport\u002Ftokens":170,"\u002Fpassport\u002Ftokens-surround":3081},[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":57,"body":172,"description":3074,"extension":3075,"links":3076,"meta":3077,"navigation":3078,"path":58,"seo":3079,"stem":59,"__hash__":3080},"docs\u002F3.passport\u002F3.tokens.md",{"type":173,"value":174,"toc":3042},"minimark",[175,179,182,187,190,219,223,228,231,337,341,344,449,453,456,459,640,644,810,814,818,1084,1088,1221,1225,1229,1558,1562,1730,1734,1738,1919,1923,2254,2258,2262,2356,2360,2514,2518,2662,2666,2670,2954,2958,3025,3027,3038],[176,177,178],"p",{},"Learn how to manage OAuth2 tokens, handle automatic refresh, and deal with token expiration in Laravel Passport.",[180,181],"hr",{},[183,184,186],"h2",{"id":185},"token-overview","Token Overview",[176,188,189],{},"Laravel Passport uses OAuth2 tokens for authentication. Nuxt Umbu handles token management automatically, including:",[191,192,193,201,207,213],"ul",{},[194,195,196,200],"li",{},[197,198,199],"strong",{},"Access tokens"," - Short-lived tokens for API requests",[194,202,203,206],{},[197,204,205],{},"Refresh tokens"," - Long-lived tokens for obtaining new access tokens",[194,208,209,212],{},[197,210,211],{},"Token expiration"," - Automatic detection and refresh",[194,214,215,218],{},[197,216,217],{},"Secure storage"," - HTTP-only cookies and localStorage fallback",[183,220,222],{"id":221},"token-storage","Token Storage",[224,225,227],"h3",{"id":226},"server-side-ssr","Server-Side (SSR)",[176,229,230],{},"Tokens are stored in secure HTTP-only cookies:",[232,233,238],"pre",{"className":234,"code":235,"language":236,"meta":237,"style":237},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Automatic cookie management\nconst tokenCookie = `${prefix}_token.${strategyName}`\nconst refreshCookie = `${prefix}_refresh.${strategyName}`\nconst expirationCookie = `${prefix}_token_expiration.${strategyName}`\n","typescript","",[239,240,241,250,287,312],"code",{"__ignoreMap":237},[242,243,246],"span",{"class":244,"line":245},"line",1,[242,247,249],{"class":248},"sHwdD","\u002F\u002F Automatic cookie management\n",[242,251,253,257,261,265,268,271,274,278,281,284],{"class":244,"line":252},2,[242,254,256],{"class":255},"spNyl","const",[242,258,260],{"class":259},"sTEyZ"," tokenCookie ",[242,262,264],{"class":263},"sMK4o","=",[242,266,267],{"class":263}," `${",[242,269,270],{"class":259},"prefix",[242,272,273],{"class":263},"}",[242,275,277],{"class":276},"sfazB","_token.",[242,279,280],{"class":263},"${",[242,282,283],{"class":259},"strategyName",[242,285,286],{"class":263},"}`\n",[242,288,290,292,295,297,299,301,303,306,308,310],{"class":244,"line":289},3,[242,291,256],{"class":255},[242,293,294],{"class":259}," refreshCookie ",[242,296,264],{"class":263},[242,298,267],{"class":263},[242,300,270],{"class":259},[242,302,273],{"class":263},[242,304,305],{"class":276},"_refresh.",[242,307,280],{"class":263},[242,309,283],{"class":259},[242,311,286],{"class":263},[242,313,315,317,320,322,324,326,328,331,333,335],{"class":244,"line":314},4,[242,316,256],{"class":255},[242,318,319],{"class":259}," expirationCookie ",[242,321,264],{"class":263},[242,323,267],{"class":263},[242,325,270],{"class":259},[242,327,273],{"class":263},[242,329,330],{"class":276},"_token_expiration.",[242,332,280],{"class":263},[242,334,283],{"class":259},[242,336,286],{"class":263},[224,338,340],{"id":339},"client-side","Client-Side",[176,342,343],{},"Tokens fall back to localStorage for SPA mode:",[232,345,347],{"className":234,"code":346,"language":236,"meta":237,"style":237},"\u002F\u002F Client-side storage\nlocalStorage.setItem(`${prefix}_token.${strategyName}`, token)\nlocalStorage.setItem(`${prefix}_refresh.${strategyName}`, refreshToken)\nlocalStorage.setItem(`${prefix}_token_expiration.${strategyName}`, expires)\n",[239,348,349,354,391,420],{"__ignoreMap":237},[242,350,351],{"class":244,"line":245},[242,352,353],{"class":248},"\u002F\u002F Client-side storage\n",[242,355,356,359,362,366,369,372,374,376,378,380,382,385,388],{"class":244,"line":252},[242,357,358],{"class":259},"localStorage",[242,360,361],{"class":263},".",[242,363,365],{"class":364},"s2Zo4","setItem",[242,367,368],{"class":259},"(",[242,370,371],{"class":263},"`${",[242,373,270],{"class":259},[242,375,273],{"class":263},[242,377,277],{"class":276},[242,379,280],{"class":263},[242,381,283],{"class":259},[242,383,384],{"class":263},"}`",[242,386,387],{"class":263},",",[242,389,390],{"class":259}," token)\n",[242,392,393,395,397,399,401,403,405,407,409,411,413,415,417],{"class":244,"line":289},[242,394,358],{"class":259},[242,396,361],{"class":263},[242,398,365],{"class":364},[242,400,368],{"class":259},[242,402,371],{"class":263},[242,404,270],{"class":259},[242,406,273],{"class":263},[242,408,305],{"class":276},[242,410,280],{"class":263},[242,412,283],{"class":259},[242,414,384],{"class":263},[242,416,387],{"class":263},[242,418,419],{"class":259}," refreshToken)\n",[242,421,422,424,426,428,430,432,434,436,438,440,442,444,446],{"class":244,"line":314},[242,423,358],{"class":259},[242,425,361],{"class":263},[242,427,365],{"class":364},[242,429,368],{"class":259},[242,431,371],{"class":263},[242,433,270],{"class":259},[242,435,273],{"class":263},[242,437,330],{"class":276},[242,439,280],{"class":263},[242,441,283],{"class":259},[242,443,384],{"class":263},[242,445,387],{"class":263},[242,447,448],{"class":259}," expires)\n",[183,450,452],{"id":451},"automatic-token-refresh","Automatic Token Refresh",[176,454,455],{},"Nuxt Umbu automatically refreshes tokens when they're about to expire.",[224,457,24],{"id":458},"configuration",[232,460,463],{"className":234,"code":461,"filename":462,"language":236,"meta":237,"style":237},"export default defineNuxtConfig({\n  auth: {\n    provider: 'passport',\n    strategies: {\n      client: {\n        endpoints: {\n          refresh: {\n            url: '\u002Foauth\u002Ftoken\u002Frefresh',\n            method: 'POST',\n            alias: 'token-refresh'\n          }\n        }\n      }\n    }\n  }\n})\n","nuxt.config.ts",[239,464,465,482,494,513,522,532,542,552,569,586,602,608,614,620,626,632],{"__ignoreMap":237},[242,466,467,471,474,477,479],{"class":244,"line":245},[242,468,470],{"class":469},"s7zQu","export",[242,472,473],{"class":469}," default",[242,475,476],{"class":364}," defineNuxtConfig",[242,478,368],{"class":259},[242,480,481],{"class":263},"{\n",[242,483,484,488,491],{"class":244,"line":252},[242,485,487],{"class":486},"swJcz","  auth",[242,489,490],{"class":263},":",[242,492,493],{"class":263}," {\n",[242,495,496,499,501,504,507,510],{"class":244,"line":289},[242,497,498],{"class":486},"    provider",[242,500,490],{"class":263},[242,502,503],{"class":263}," '",[242,505,506],{"class":276},"passport",[242,508,509],{"class":263},"'",[242,511,512],{"class":263},",\n",[242,514,515,518,520],{"class":244,"line":314},[242,516,517],{"class":486},"    strategies",[242,519,490],{"class":263},[242,521,493],{"class":263},[242,523,525,528,530],{"class":244,"line":524},5,[242,526,527],{"class":486},"      client",[242,529,490],{"class":263},[242,531,493],{"class":263},[242,533,535,538,540],{"class":244,"line":534},6,[242,536,537],{"class":486},"        endpoints",[242,539,490],{"class":263},[242,541,493],{"class":263},[242,543,545,548,550],{"class":244,"line":544},7,[242,546,547],{"class":486},"          refresh",[242,549,490],{"class":263},[242,551,493],{"class":263},[242,553,555,558,560,562,565,567],{"class":244,"line":554},8,[242,556,557],{"class":486},"            url",[242,559,490],{"class":263},[242,561,503],{"class":263},[242,563,564],{"class":276},"\u002Foauth\u002Ftoken\u002Frefresh",[242,566,509],{"class":263},[242,568,512],{"class":263},[242,570,572,575,577,579,582,584],{"class":244,"line":571},9,[242,573,574],{"class":486},"            method",[242,576,490],{"class":263},[242,578,503],{"class":263},[242,580,581],{"class":276},"POST",[242,583,509],{"class":263},[242,585,512],{"class":263},[242,587,589,592,594,596,599],{"class":244,"line":588},10,[242,590,591],{"class":486},"            alias",[242,593,490],{"class":263},[242,595,503],{"class":263},[242,597,598],{"class":276},"token-refresh",[242,600,601],{"class":263},"'\n",[242,603,605],{"class":244,"line":604},11,[242,606,607],{"class":263},"          }\n",[242,609,611],{"class":244,"line":610},12,[242,612,613],{"class":263},"        }\n",[242,615,617],{"class":244,"line":616},13,[242,618,619],{"class":263},"      }\n",[242,621,623],{"class":244,"line":622},14,[242,624,625],{"class":263},"    }\n",[242,627,629],{"class":244,"line":628},15,[242,630,631],{"class":263},"  }\n",[242,633,635,637],{"class":244,"line":634},16,[242,636,273],{"class":263},[242,638,639],{"class":259},")\n",[224,641,643],{"id":642},"manual-token-refresh","Manual Token Refresh",[232,645,649],{"className":646,"code":647,"language":648,"meta":237,"style":237},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup>\nconst { fetchProfile } = useAuth()\n\nconst refreshToken = async () => {\n  try {\n    await fetchProfile('client')\n    \u002F\u002F Token automatically refreshed if needed\n  } catch (error) {\n    console.error('Token refresh failed:', error)\n    \u002F\u002F Handle refresh failure (e.g., redirect to login)\n  }\n}\n\u003C\u002Fscript>\n","vue",[239,650,651,665,686,692,712,719,738,743,762,787,792,796,801],{"__ignoreMap":237},[242,652,653,656,659,662],{"class":244,"line":245},[242,654,655],{"class":263},"\u003C",[242,657,658],{"class":486},"script",[242,660,661],{"class":255}," setup",[242,663,664],{"class":263},">\n",[242,666,667,669,672,675,677,680,683],{"class":244,"line":252},[242,668,256],{"class":255},[242,670,671],{"class":263}," {",[242,673,674],{"class":259}," fetchProfile ",[242,676,273],{"class":263},[242,678,679],{"class":263}," =",[242,681,682],{"class":364}," useAuth",[242,684,685],{"class":259},"()\n",[242,687,688],{"class":244,"line":289},[242,689,691],{"emptyLinePlaceholder":690},true,"\n",[242,693,694,696,699,701,704,707,710],{"class":244,"line":314},[242,695,256],{"class":255},[242,697,698],{"class":259}," refreshToken ",[242,700,264],{"class":263},[242,702,703],{"class":255}," async",[242,705,706],{"class":263}," ()",[242,708,709],{"class":255}," =>",[242,711,493],{"class":263},[242,713,714,717],{"class":244,"line":524},[242,715,716],{"class":469},"  try",[242,718,493],{"class":263},[242,720,721,724,727,729,731,734,736],{"class":244,"line":534},[242,722,723],{"class":469},"    await",[242,725,726],{"class":364}," fetchProfile",[242,728,368],{"class":486},[242,730,509],{"class":263},[242,732,733],{"class":276},"client",[242,735,509],{"class":263},[242,737,639],{"class":486},[242,739,740],{"class":244,"line":544},[242,741,742],{"class":248},"    \u002F\u002F Token automatically refreshed if needed\n",[242,744,745,748,751,754,757,760],{"class":244,"line":554},[242,746,747],{"class":263},"  }",[242,749,750],{"class":469}," catch",[242,752,753],{"class":486}," (",[242,755,756],{"class":259},"error",[242,758,759],{"class":486},") ",[242,761,481],{"class":263},[242,763,764,767,769,771,773,775,778,780,782,785],{"class":244,"line":571},[242,765,766],{"class":259},"    console",[242,768,361],{"class":263},[242,770,756],{"class":364},[242,772,368],{"class":486},[242,774,509],{"class":263},[242,776,777],{"class":276},"Token refresh failed:",[242,779,509],{"class":263},[242,781,387],{"class":263},[242,783,784],{"class":259}," error",[242,786,639],{"class":486},[242,788,789],{"class":244,"line":588},[242,790,791],{"class":248},"    \u002F\u002F Handle refresh failure (e.g., redirect to login)\n",[242,793,794],{"class":244,"line":604},[242,795,631],{"class":263},[242,797,798],{"class":244,"line":610},[242,799,800],{"class":263},"}\n",[242,802,803,806,808],{"class":244,"line":616},[242,804,805],{"class":263},"\u003C\u002F",[242,807,658],{"class":486},[242,809,664],{"class":263},[183,811,813],{"id":812},"token-expiration-handling","Token Expiration Handling",[224,815,817],{"id":816},"check-token-status","Check Token Status",[232,819,821],{"className":646,"code":820,"language":648,"meta":237,"style":237},"\u003Cscript setup>\nconst { loggedIn, user } = useAuth()\n\nconst isTokenExpired = computed(() => {\n  if (!loggedIn.value) return true\n  \n  const expiration = localStorage.getItem('__Secure-_token_expiration.client')\n  return expiration ? Date.now() > parseInt(expiration) : false\n})\n\n\u002F\u002F Watch for token expiration\nwatch(isTokenExpired, (expired) => {\n  if (expired && loggedIn.value) {\n    console.log('Token expired, need to re-authenticate')\n    \u002F\u002F Redirect to login or refresh token\n  }\n})\n\u003C\u002Fscript>\n",[239,822,823,833,855,859,880,907,912,941,980,986,990,995,1018,1039,1059,1064,1068,1075],{"__ignoreMap":237},[242,824,825,827,829,831],{"class":244,"line":245},[242,826,655],{"class":263},[242,828,658],{"class":486},[242,830,661],{"class":255},[242,832,664],{"class":263},[242,834,835,837,839,842,844,847,849,851,853],{"class":244,"line":252},[242,836,256],{"class":255},[242,838,671],{"class":263},[242,840,841],{"class":259}," loggedIn",[242,843,387],{"class":263},[242,845,846],{"class":259}," user ",[242,848,273],{"class":263},[242,850,679],{"class":263},[242,852,682],{"class":364},[242,854,685],{"class":259},[242,856,857],{"class":244,"line":289},[242,858,691],{"emptyLinePlaceholder":690},[242,860,861,863,866,868,871,873,876,878],{"class":244,"line":314},[242,862,256],{"class":255},[242,864,865],{"class":259}," isTokenExpired ",[242,867,264],{"class":263},[242,869,870],{"class":364}," computed",[242,872,368],{"class":259},[242,874,875],{"class":263},"()",[242,877,709],{"class":255},[242,879,493],{"class":263},[242,881,882,885,887,890,893,895,898,900,903],{"class":244,"line":524},[242,883,884],{"class":469},"  if",[242,886,753],{"class":486},[242,888,889],{"class":263},"!",[242,891,892],{"class":259},"loggedIn",[242,894,361],{"class":263},[242,896,897],{"class":259},"value",[242,899,759],{"class":486},[242,901,902],{"class":469},"return",[242,904,906],{"class":905},"sfNiH"," true\n",[242,908,909],{"class":244,"line":534},[242,910,911],{"class":486},"  \n",[242,913,914,917,920,922,925,927,930,932,934,937,939],{"class":244,"line":544},[242,915,916],{"class":255},"  const",[242,918,919],{"class":259}," expiration",[242,921,679],{"class":263},[242,923,924],{"class":259}," localStorage",[242,926,361],{"class":263},[242,928,929],{"class":364},"getItem",[242,931,368],{"class":486},[242,933,509],{"class":263},[242,935,936],{"class":276},"__Secure-_token_expiration.client",[242,938,509],{"class":263},[242,940,639],{"class":486},[242,942,943,946,948,951,954,956,959,962,965,968,970,973,975,977],{"class":244,"line":554},[242,944,945],{"class":469},"  return",[242,947,919],{"class":259},[242,949,950],{"class":263}," ?",[242,952,953],{"class":259}," Date",[242,955,361],{"class":263},[242,957,958],{"class":364},"now",[242,960,961],{"class":486},"() ",[242,963,964],{"class":263},">",[242,966,967],{"class":364}," parseInt",[242,969,368],{"class":486},[242,971,972],{"class":259},"expiration",[242,974,759],{"class":486},[242,976,490],{"class":263},[242,978,979],{"class":905}," false\n",[242,981,982,984],{"class":244,"line":571},[242,983,273],{"class":263},[242,985,639],{"class":259},[242,987,988],{"class":244,"line":588},[242,989,691],{"emptyLinePlaceholder":690},[242,991,992],{"class":244,"line":604},[242,993,994],{"class":248},"\u002F\u002F Watch for token expiration\n",[242,996,997,1000,1003,1005,1007,1011,1014,1016],{"class":244,"line":610},[242,998,999],{"class":364},"watch",[242,1001,1002],{"class":259},"(isTokenExpired",[242,1004,387],{"class":263},[242,1006,753],{"class":263},[242,1008,1010],{"class":1009},"sHdIc","expired",[242,1012,1013],{"class":263},")",[242,1015,709],{"class":255},[242,1017,493],{"class":263},[242,1019,1020,1022,1024,1026,1029,1031,1033,1035,1037],{"class":244,"line":616},[242,1021,884],{"class":469},[242,1023,753],{"class":486},[242,1025,1010],{"class":259},[242,1027,1028],{"class":263}," &&",[242,1030,841],{"class":259},[242,1032,361],{"class":263},[242,1034,897],{"class":259},[242,1036,759],{"class":486},[242,1038,481],{"class":263},[242,1040,1041,1043,1045,1048,1050,1052,1055,1057],{"class":244,"line":622},[242,1042,766],{"class":259},[242,1044,361],{"class":263},[242,1046,1047],{"class":364},"log",[242,1049,368],{"class":486},[242,1051,509],{"class":263},[242,1053,1054],{"class":276},"Token expired, need to re-authenticate",[242,1056,509],{"class":263},[242,1058,639],{"class":486},[242,1060,1061],{"class":244,"line":628},[242,1062,1063],{"class":248},"    \u002F\u002F Redirect to login or refresh token\n",[242,1065,1066],{"class":244,"line":634},[242,1067,631],{"class":263},[242,1069,1071,1073],{"class":244,"line":1070},17,[242,1072,273],{"class":263},[242,1074,639],{"class":259},[242,1076,1078,1080,1082],{"class":244,"line":1077},18,[242,1079,805],{"class":263},[242,1081,658],{"class":486},[242,1083,664],{"class":263},[224,1085,1087],{"id":1086},"token-expiration-event","Token Expiration Event",[232,1089,1091],{"className":646,"code":1090,"language":648,"meta":237,"style":237},"\u003Cscript setup>\nconst { fetchProfile } = useAuth()\n\nonMounted(async () => {\n  try {\n    await fetchProfile('client')\n    \u002F\u002F This will automatically refresh expired tokens\n  } catch (error) {\n    \u002F\u002F Token is invalid, redirect to login\n    await navigateTo('\u002Flogin')\n  }\n})\n\u003C\u002Fscript>\n",[239,1092,1093,1103,1119,1123,1139,1145,1161,1166,1180,1185,1203,1207,1213],{"__ignoreMap":237},[242,1094,1095,1097,1099,1101],{"class":244,"line":245},[242,1096,655],{"class":263},[242,1098,658],{"class":486},[242,1100,661],{"class":255},[242,1102,664],{"class":263},[242,1104,1105,1107,1109,1111,1113,1115,1117],{"class":244,"line":252},[242,1106,256],{"class":255},[242,1108,671],{"class":263},[242,1110,674],{"class":259},[242,1112,273],{"class":263},[242,1114,679],{"class":263},[242,1116,682],{"class":364},[242,1118,685],{"class":259},[242,1120,1121],{"class":244,"line":289},[242,1122,691],{"emptyLinePlaceholder":690},[242,1124,1125,1128,1130,1133,1135,1137],{"class":244,"line":314},[242,1126,1127],{"class":364},"onMounted",[242,1129,368],{"class":259},[242,1131,1132],{"class":255},"async",[242,1134,706],{"class":263},[242,1136,709],{"class":255},[242,1138,493],{"class":263},[242,1140,1141,1143],{"class":244,"line":524},[242,1142,716],{"class":469},[242,1144,493],{"class":263},[242,1146,1147,1149,1151,1153,1155,1157,1159],{"class":244,"line":534},[242,1148,723],{"class":469},[242,1150,726],{"class":364},[242,1152,368],{"class":486},[242,1154,509],{"class":263},[242,1156,733],{"class":276},[242,1158,509],{"class":263},[242,1160,639],{"class":486},[242,1162,1163],{"class":244,"line":544},[242,1164,1165],{"class":248},"    \u002F\u002F This will automatically refresh expired tokens\n",[242,1167,1168,1170,1172,1174,1176,1178],{"class":244,"line":554},[242,1169,747],{"class":263},[242,1171,750],{"class":469},[242,1173,753],{"class":486},[242,1175,756],{"class":259},[242,1177,759],{"class":486},[242,1179,481],{"class":263},[242,1181,1182],{"class":244,"line":571},[242,1183,1184],{"class":248},"    \u002F\u002F Token is invalid, redirect to login\n",[242,1186,1187,1189,1192,1194,1196,1199,1201],{"class":244,"line":588},[242,1188,723],{"class":469},[242,1190,1191],{"class":364}," navigateTo",[242,1193,368],{"class":486},[242,1195,509],{"class":263},[242,1197,1198],{"class":276},"\u002Flogin",[242,1200,509],{"class":263},[242,1202,639],{"class":486},[242,1204,1205],{"class":244,"line":604},[242,1206,631],{"class":263},[242,1208,1209,1211],{"class":244,"line":610},[242,1210,273],{"class":263},[242,1212,639],{"class":259},[242,1214,1215,1217,1219],{"class":244,"line":616},[242,1216,805],{"class":263},[242,1218,658],{"class":486},[242,1220,664],{"class":263},[183,1222,1224],{"id":1223},"custom-token-logic","Custom Token Logic",[224,1226,1228],{"id":1227},"token-interceptor","Token Interceptor",[232,1230,1233],{"className":234,"code":1231,"filename":1232,"language":236,"meta":237,"style":237},"export default defineNuxtPlugin(() => {\n  const { $fetch: originalFetch } = useNuxtApp()\n  const { fetchProfile } = useAuth()\n  \n  \u002F\u002F Intercept API calls to check token validity\n  const interceptedFetch = async (url, options) => {\n    try {\n      return await originalFetch(url, options)\n    } catch (error) {\n      if (error.statusCode === 401) {\n        \u002F\u002F Try to refresh token\n        try {\n          await fetchProfile('client')\n          return await originalFetch(url, options)\n        } catch (refreshError) {\n          \u002F\u002F Refresh failed, redirect to login\n          await navigateTo('\u002Flogin')\n        }\n      }\n      throw error\n    }\n  }\n  \n  return {\n    provide: {\n      $fetch: interceptedFetch\n    }\n  }\n})\n","plugins\u002Fauth-interceptor.client.ts",[239,1234,1235,1252,1276,1292,1296,1301,1328,1335,1355,1370,1395,1400,1407,1424,1443,1459,1464,1480,1484,1489,1498,1503,1508,1513,1520,1530,1541,1546,1551],{"__ignoreMap":237},[242,1236,1237,1239,1241,1244,1246,1248,1250],{"class":244,"line":245},[242,1238,470],{"class":469},[242,1240,473],{"class":469},[242,1242,1243],{"class":364}," defineNuxtPlugin",[242,1245,368],{"class":259},[242,1247,875],{"class":263},[242,1249,709],{"class":255},[242,1251,493],{"class":263},[242,1253,1254,1256,1258,1261,1263,1266,1269,1271,1274],{"class":244,"line":252},[242,1255,916],{"class":255},[242,1257,671],{"class":263},[242,1259,1260],{"class":486}," $fetch",[242,1262,490],{"class":263},[242,1264,1265],{"class":259}," originalFetch",[242,1267,1268],{"class":263}," }",[242,1270,679],{"class":263},[242,1272,1273],{"class":364}," useNuxtApp",[242,1275,685],{"class":486},[242,1277,1278,1280,1282,1284,1286,1288,1290],{"class":244,"line":289},[242,1279,916],{"class":255},[242,1281,671],{"class":263},[242,1283,726],{"class":259},[242,1285,1268],{"class":263},[242,1287,679],{"class":263},[242,1289,682],{"class":364},[242,1291,685],{"class":486},[242,1293,1294],{"class":244,"line":314},[242,1295,911],{"class":486},[242,1297,1298],{"class":244,"line":524},[242,1299,1300],{"class":248},"  \u002F\u002F Intercept API calls to check token validity\n",[242,1302,1303,1305,1308,1310,1312,1314,1317,1319,1322,1324,1326],{"class":244,"line":534},[242,1304,916],{"class":255},[242,1306,1307],{"class":259}," interceptedFetch",[242,1309,679],{"class":263},[242,1311,703],{"class":255},[242,1313,753],{"class":263},[242,1315,1316],{"class":1009},"url",[242,1318,387],{"class":263},[242,1320,1321],{"class":1009}," options",[242,1323,1013],{"class":263},[242,1325,709],{"class":255},[242,1327,493],{"class":263},[242,1329,1330,1333],{"class":244,"line":544},[242,1331,1332],{"class":469},"    try",[242,1334,493],{"class":263},[242,1336,1337,1340,1343,1345,1347,1349,1351,1353],{"class":244,"line":554},[242,1338,1339],{"class":469},"      return",[242,1341,1342],{"class":469}," await",[242,1344,1265],{"class":364},[242,1346,368],{"class":486},[242,1348,1316],{"class":259},[242,1350,387],{"class":263},[242,1352,1321],{"class":259},[242,1354,639],{"class":486},[242,1356,1357,1360,1362,1364,1366,1368],{"class":244,"line":571},[242,1358,1359],{"class":263},"    }",[242,1361,750],{"class":469},[242,1363,753],{"class":486},[242,1365,756],{"class":259},[242,1367,759],{"class":486},[242,1369,481],{"class":263},[242,1371,1372,1375,1377,1379,1381,1384,1387,1391,1393],{"class":244,"line":588},[242,1373,1374],{"class":469},"      if",[242,1376,753],{"class":486},[242,1378,756],{"class":259},[242,1380,361],{"class":263},[242,1382,1383],{"class":259},"statusCode",[242,1385,1386],{"class":263}," ===",[242,1388,1390],{"class":1389},"sbssI"," 401",[242,1392,759],{"class":486},[242,1394,481],{"class":263},[242,1396,1397],{"class":244,"line":604},[242,1398,1399],{"class":248},"        \u002F\u002F Try to refresh token\n",[242,1401,1402,1405],{"class":244,"line":610},[242,1403,1404],{"class":469},"        try",[242,1406,493],{"class":263},[242,1408,1409,1412,1414,1416,1418,1420,1422],{"class":244,"line":616},[242,1410,1411],{"class":469},"          await",[242,1413,726],{"class":364},[242,1415,368],{"class":486},[242,1417,509],{"class":263},[242,1419,733],{"class":276},[242,1421,509],{"class":263},[242,1423,639],{"class":486},[242,1425,1426,1429,1431,1433,1435,1437,1439,1441],{"class":244,"line":622},[242,1427,1428],{"class":469},"          return",[242,1430,1342],{"class":469},[242,1432,1265],{"class":364},[242,1434,368],{"class":486},[242,1436,1316],{"class":259},[242,1438,387],{"class":263},[242,1440,1321],{"class":259},[242,1442,639],{"class":486},[242,1444,1445,1448,1450,1452,1455,1457],{"class":244,"line":628},[242,1446,1447],{"class":263},"        }",[242,1449,750],{"class":469},[242,1451,753],{"class":486},[242,1453,1454],{"class":259},"refreshError",[242,1456,759],{"class":486},[242,1458,481],{"class":263},[242,1460,1461],{"class":244,"line":634},[242,1462,1463],{"class":248},"          \u002F\u002F Refresh failed, redirect to login\n",[242,1465,1466,1468,1470,1472,1474,1476,1478],{"class":244,"line":1070},[242,1467,1411],{"class":469},[242,1469,1191],{"class":364},[242,1471,368],{"class":486},[242,1473,509],{"class":263},[242,1475,1198],{"class":276},[242,1477,509],{"class":263},[242,1479,639],{"class":486},[242,1481,1482],{"class":244,"line":1077},[242,1483,613],{"class":263},[242,1485,1487],{"class":244,"line":1486},19,[242,1488,619],{"class":263},[242,1490,1492,1495],{"class":244,"line":1491},20,[242,1493,1494],{"class":469},"      throw",[242,1496,1497],{"class":259}," error\n",[242,1499,1501],{"class":244,"line":1500},21,[242,1502,625],{"class":263},[242,1504,1506],{"class":244,"line":1505},22,[242,1507,631],{"class":263},[242,1509,1511],{"class":244,"line":1510},23,[242,1512,911],{"class":486},[242,1514,1516,1518],{"class":244,"line":1515},24,[242,1517,945],{"class":469},[242,1519,493],{"class":263},[242,1521,1523,1526,1528],{"class":244,"line":1522},25,[242,1524,1525],{"class":486},"    provide",[242,1527,490],{"class":263},[242,1529,493],{"class":263},[242,1531,1533,1536,1538],{"class":244,"line":1532},26,[242,1534,1535],{"class":486},"      $fetch",[242,1537,490],{"class":263},[242,1539,1540],{"class":259}," interceptedFetch\n",[242,1542,1544],{"class":244,"line":1543},27,[242,1545,625],{"class":263},[242,1547,1549],{"class":244,"line":1548},28,[242,1550,631],{"class":263},[242,1552,1554,1556],{"class":244,"line":1553},29,[242,1555,273],{"class":263},[242,1557,639],{"class":259},[224,1559,1561],{"id":1560},"token-validation-middleware","Token Validation Middleware",[232,1563,1566],{"className":234,"code":1564,"filename":1565,"language":236,"meta":237,"style":237},"export default defineNuxtRouteMiddleware(async (to) => {\n  const { loggedIn, fetchProfile } = useAuth()\n  \n  if (!loggedIn.value) {\n    return navigateTo('\u002Flogin')\n  }\n  \n  try {\n    await fetchProfile('client')\n    \u002F\u002F Token is valid\n  } catch (error) {\n    \u002F\u002F Token is invalid, redirect to login\n    return navigateTo('\u002Flogin')\n  }\n})\n","middleware\u002Fauth.ts",[239,1567,1568,1592,1612,1616,1634,1651,1655,1659,1665,1681,1686,1700,1704,1720,1724],{"__ignoreMap":237},[242,1569,1570,1572,1574,1577,1579,1581,1583,1586,1588,1590],{"class":244,"line":245},[242,1571,470],{"class":469},[242,1573,473],{"class":469},[242,1575,1576],{"class":364}," defineNuxtRouteMiddleware",[242,1578,368],{"class":259},[242,1580,1132],{"class":255},[242,1582,753],{"class":263},[242,1584,1585],{"class":1009},"to",[242,1587,1013],{"class":263},[242,1589,709],{"class":255},[242,1591,493],{"class":263},[242,1593,1594,1596,1598,1600,1602,1604,1606,1608,1610],{"class":244,"line":252},[242,1595,916],{"class":255},[242,1597,671],{"class":263},[242,1599,841],{"class":259},[242,1601,387],{"class":263},[242,1603,726],{"class":259},[242,1605,1268],{"class":263},[242,1607,679],{"class":263},[242,1609,682],{"class":364},[242,1611,685],{"class":486},[242,1613,1614],{"class":244,"line":289},[242,1615,911],{"class":486},[242,1617,1618,1620,1622,1624,1626,1628,1630,1632],{"class":244,"line":314},[242,1619,884],{"class":469},[242,1621,753],{"class":486},[242,1623,889],{"class":263},[242,1625,892],{"class":259},[242,1627,361],{"class":263},[242,1629,897],{"class":259},[242,1631,759],{"class":486},[242,1633,481],{"class":263},[242,1635,1636,1639,1641,1643,1645,1647,1649],{"class":244,"line":524},[242,1637,1638],{"class":469},"    return",[242,1640,1191],{"class":364},[242,1642,368],{"class":486},[242,1644,509],{"class":263},[242,1646,1198],{"class":276},[242,1648,509],{"class":263},[242,1650,639],{"class":486},[242,1652,1653],{"class":244,"line":534},[242,1654,631],{"class":263},[242,1656,1657],{"class":244,"line":544},[242,1658,911],{"class":486},[242,1660,1661,1663],{"class":244,"line":554},[242,1662,716],{"class":469},[242,1664,493],{"class":263},[242,1666,1667,1669,1671,1673,1675,1677,1679],{"class":244,"line":571},[242,1668,723],{"class":469},[242,1670,726],{"class":364},[242,1672,368],{"class":486},[242,1674,509],{"class":263},[242,1676,733],{"class":276},[242,1678,509],{"class":263},[242,1680,639],{"class":486},[242,1682,1683],{"class":244,"line":588},[242,1684,1685],{"class":248},"    \u002F\u002F Token is valid\n",[242,1687,1688,1690,1692,1694,1696,1698],{"class":244,"line":604},[242,1689,747],{"class":263},[242,1691,750],{"class":469},[242,1693,753],{"class":486},[242,1695,756],{"class":259},[242,1697,759],{"class":486},[242,1699,481],{"class":263},[242,1701,1702],{"class":244,"line":610},[242,1703,1184],{"class":248},[242,1705,1706,1708,1710,1712,1714,1716,1718],{"class":244,"line":616},[242,1707,1638],{"class":469},[242,1709,1191],{"class":364},[242,1711,368],{"class":486},[242,1713,509],{"class":263},[242,1715,1198],{"class":276},[242,1717,509],{"class":263},[242,1719,639],{"class":486},[242,1721,1722],{"class":244,"line":622},[242,1723,631],{"class":263},[242,1725,1726,1728],{"class":244,"line":628},[242,1727,273],{"class":263},[242,1729,639],{"class":259},[183,1731,1733],{"id":1732},"advanced-token-management","Advanced Token Management",[224,1735,1737],{"id":1736},"multiple-token-strategies","Multiple Token Strategies",[232,1739,1741],{"className":234,"code":1740,"filename":462,"language":236,"meta":237,"style":237},"export default defineNuxtConfig({\n  auth: {\n    provider: 'passport',\n    strategies: {\n      admin: {\n        endpoints: {\n          refresh: { url: '\u002Fapi\u002Fadmin\u002Frefresh', method: 'POST' }\n        }\n      },\n      api: {\n        endpoints: {\n          refresh: { url: '\u002Fapi\u002Frefresh', method: 'POST' }\n        }\n      }\n    }\n  }\n})\n",[239,1742,1743,1755,1763,1777,1785,1794,1802,1838,1842,1847,1856,1864,1897,1901,1905,1909,1913],{"__ignoreMap":237},[242,1744,1745,1747,1749,1751,1753],{"class":244,"line":245},[242,1746,470],{"class":469},[242,1748,473],{"class":469},[242,1750,476],{"class":364},[242,1752,368],{"class":259},[242,1754,481],{"class":263},[242,1756,1757,1759,1761],{"class":244,"line":252},[242,1758,487],{"class":486},[242,1760,490],{"class":263},[242,1762,493],{"class":263},[242,1764,1765,1767,1769,1771,1773,1775],{"class":244,"line":289},[242,1766,498],{"class":486},[242,1768,490],{"class":263},[242,1770,503],{"class":263},[242,1772,506],{"class":276},[242,1774,509],{"class":263},[242,1776,512],{"class":263},[242,1778,1779,1781,1783],{"class":244,"line":314},[242,1780,517],{"class":486},[242,1782,490],{"class":263},[242,1784,493],{"class":263},[242,1786,1787,1790,1792],{"class":244,"line":524},[242,1788,1789],{"class":486},"      admin",[242,1791,490],{"class":263},[242,1793,493],{"class":263},[242,1795,1796,1798,1800],{"class":244,"line":534},[242,1797,537],{"class":486},[242,1799,490],{"class":263},[242,1801,493],{"class":263},[242,1803,1804,1806,1808,1810,1813,1815,1817,1820,1822,1824,1827,1829,1831,1833,1835],{"class":244,"line":544},[242,1805,547],{"class":486},[242,1807,490],{"class":263},[242,1809,671],{"class":263},[242,1811,1812],{"class":486}," url",[242,1814,490],{"class":263},[242,1816,503],{"class":263},[242,1818,1819],{"class":276},"\u002Fapi\u002Fadmin\u002Frefresh",[242,1821,509],{"class":263},[242,1823,387],{"class":263},[242,1825,1826],{"class":486}," method",[242,1828,490],{"class":263},[242,1830,503],{"class":263},[242,1832,581],{"class":276},[242,1834,509],{"class":263},[242,1836,1837],{"class":263}," }\n",[242,1839,1840],{"class":244,"line":554},[242,1841,613],{"class":263},[242,1843,1844],{"class":244,"line":571},[242,1845,1846],{"class":263},"      },\n",[242,1848,1849,1852,1854],{"class":244,"line":588},[242,1850,1851],{"class":486},"      api",[242,1853,490],{"class":263},[242,1855,493],{"class":263},[242,1857,1858,1860,1862],{"class":244,"line":604},[242,1859,537],{"class":486},[242,1861,490],{"class":263},[242,1863,493],{"class":263},[242,1865,1866,1868,1870,1872,1874,1876,1878,1881,1883,1885,1887,1889,1891,1893,1895],{"class":244,"line":610},[242,1867,547],{"class":486},[242,1869,490],{"class":263},[242,1871,671],{"class":263},[242,1873,1812],{"class":486},[242,1875,490],{"class":263},[242,1877,503],{"class":263},[242,1879,1880],{"class":276},"\u002Fapi\u002Frefresh",[242,1882,509],{"class":263},[242,1884,387],{"class":263},[242,1886,1826],{"class":486},[242,1888,490],{"class":263},[242,1890,503],{"class":263},[242,1892,581],{"class":276},[242,1894,509],{"class":263},[242,1896,1837],{"class":263},[242,1898,1899],{"class":244,"line":616},[242,1900,613],{"class":263},[242,1902,1903],{"class":244,"line":622},[242,1904,619],{"class":263},[242,1906,1907],{"class":244,"line":628},[242,1908,625],{"class":263},[242,1910,1911],{"class":244,"line":634},[242,1912,631],{"class":263},[242,1914,1915,1917],{"class":244,"line":1070},[242,1916,273],{"class":263},[242,1918,639],{"class":259},[224,1920,1922],{"id":1921},"token-refresh-with-custom-logic","Token Refresh with Custom Logic",[232,1924,1926],{"className":646,"code":1925,"language":648,"meta":237,"style":237},"\u003Cscript setup>\nconst { fetchProfile } = useAuth()\n\nconst customTokenRefresh = async (strategyName: string) => {\n  try {\n    \u002F\u002F Custom refresh logic\n    const response = await $fetch('\u002Fcustom-refresh', {\n      method: 'POST',\n      body: { strategy: strategyName }\n    })\n    \n    \u002F\u002F Update token storage manually\n    if (response.token) {\n      const prefix = '__Secure-'\n      localStorage.setItem(`${prefix}_token.${strategyName}`, response.token)\n      localStorage.setItem(`${prefix}_token_expiration.${strategyName}`, response.expires)\n    }\n    \n    return response\n  } catch (error) {\n    console.error('Custom refresh failed:', error)\n    throw error\n  }\n}\n\u003C\u002Fscript>\n",[239,1927,1928,1938,1954,1958,1985,1991,1996,2023,2038,2057,2063,2068,2073,2092,2109,2144,2179,2183,2187,2194,2208,2231,2238,2242,2246],{"__ignoreMap":237},[242,1929,1930,1932,1934,1936],{"class":244,"line":245},[242,1931,655],{"class":263},[242,1933,658],{"class":486},[242,1935,661],{"class":255},[242,1937,664],{"class":263},[242,1939,1940,1942,1944,1946,1948,1950,1952],{"class":244,"line":252},[242,1941,256],{"class":255},[242,1943,671],{"class":263},[242,1945,674],{"class":259},[242,1947,273],{"class":263},[242,1949,679],{"class":263},[242,1951,682],{"class":364},[242,1953,685],{"class":259},[242,1955,1956],{"class":244,"line":289},[242,1957,691],{"emptyLinePlaceholder":690},[242,1959,1960,1962,1965,1967,1969,1971,1973,1975,1979,1981,1983],{"class":244,"line":314},[242,1961,256],{"class":255},[242,1963,1964],{"class":259}," customTokenRefresh ",[242,1966,264],{"class":263},[242,1968,703],{"class":255},[242,1970,753],{"class":263},[242,1972,283],{"class":1009},[242,1974,490],{"class":263},[242,1976,1978],{"class":1977},"sBMFI"," string",[242,1980,1013],{"class":263},[242,1982,709],{"class":255},[242,1984,493],{"class":263},[242,1986,1987,1989],{"class":244,"line":524},[242,1988,716],{"class":469},[242,1990,493],{"class":263},[242,1992,1993],{"class":244,"line":534},[242,1994,1995],{"class":248},"    \u002F\u002F Custom refresh logic\n",[242,1997,1998,2001,2004,2006,2008,2010,2012,2014,2017,2019,2021],{"class":244,"line":544},[242,1999,2000],{"class":255},"    const",[242,2002,2003],{"class":259}," response",[242,2005,679],{"class":263},[242,2007,1342],{"class":469},[242,2009,1260],{"class":364},[242,2011,368],{"class":486},[242,2013,509],{"class":263},[242,2015,2016],{"class":276},"\u002Fcustom-refresh",[242,2018,509],{"class":263},[242,2020,387],{"class":263},[242,2022,493],{"class":263},[242,2024,2025,2028,2030,2032,2034,2036],{"class":244,"line":554},[242,2026,2027],{"class":486},"      method",[242,2029,490],{"class":263},[242,2031,503],{"class":263},[242,2033,581],{"class":276},[242,2035,509],{"class":263},[242,2037,512],{"class":263},[242,2039,2040,2043,2045,2047,2050,2052,2055],{"class":244,"line":571},[242,2041,2042],{"class":486},"      body",[242,2044,490],{"class":263},[242,2046,671],{"class":263},[242,2048,2049],{"class":486}," strategy",[242,2051,490],{"class":263},[242,2053,2054],{"class":259}," strategyName",[242,2056,1837],{"class":263},[242,2058,2059,2061],{"class":244,"line":588},[242,2060,1359],{"class":263},[242,2062,639],{"class":486},[242,2064,2065],{"class":244,"line":604},[242,2066,2067],{"class":486},"    \n",[242,2069,2070],{"class":244,"line":610},[242,2071,2072],{"class":248},"    \u002F\u002F Update token storage manually\n",[242,2074,2075,2078,2080,2083,2085,2088,2090],{"class":244,"line":616},[242,2076,2077],{"class":469},"    if",[242,2079,753],{"class":486},[242,2081,2082],{"class":259},"response",[242,2084,361],{"class":263},[242,2086,2087],{"class":259},"token",[242,2089,759],{"class":486},[242,2091,481],{"class":263},[242,2093,2094,2097,2100,2102,2104,2107],{"class":244,"line":622},[242,2095,2096],{"class":255},"      const",[242,2098,2099],{"class":259}," prefix",[242,2101,679],{"class":263},[242,2103,503],{"class":263},[242,2105,2106],{"class":276},"__Secure-",[242,2108,601],{"class":263},[242,2110,2111,2114,2116,2118,2120,2122,2124,2126,2128,2130,2132,2134,2136,2138,2140,2142],{"class":244,"line":628},[242,2112,2113],{"class":259},"      localStorage",[242,2115,361],{"class":263},[242,2117,365],{"class":364},[242,2119,368],{"class":486},[242,2121,371],{"class":263},[242,2123,270],{"class":259},[242,2125,273],{"class":263},[242,2127,277],{"class":276},[242,2129,280],{"class":263},[242,2131,283],{"class":259},[242,2133,384],{"class":263},[242,2135,387],{"class":263},[242,2137,2003],{"class":259},[242,2139,361],{"class":263},[242,2141,2087],{"class":259},[242,2143,639],{"class":486},[242,2145,2146,2148,2150,2152,2154,2156,2158,2160,2162,2164,2166,2168,2170,2172,2174,2177],{"class":244,"line":634},[242,2147,2113],{"class":259},[242,2149,361],{"class":263},[242,2151,365],{"class":364},[242,2153,368],{"class":486},[242,2155,371],{"class":263},[242,2157,270],{"class":259},[242,2159,273],{"class":263},[242,2161,330],{"class":276},[242,2163,280],{"class":263},[242,2165,283],{"class":259},[242,2167,384],{"class":263},[242,2169,387],{"class":263},[242,2171,2003],{"class":259},[242,2173,361],{"class":263},[242,2175,2176],{"class":259},"expires",[242,2178,639],{"class":486},[242,2180,2181],{"class":244,"line":1070},[242,2182,625],{"class":263},[242,2184,2185],{"class":244,"line":1077},[242,2186,2067],{"class":486},[242,2188,2189,2191],{"class":244,"line":1486},[242,2190,1638],{"class":469},[242,2192,2193],{"class":259}," response\n",[242,2195,2196,2198,2200,2202,2204,2206],{"class":244,"line":1491},[242,2197,747],{"class":263},[242,2199,750],{"class":469},[242,2201,753],{"class":486},[242,2203,756],{"class":259},[242,2205,759],{"class":486},[242,2207,481],{"class":263},[242,2209,2210,2212,2214,2216,2218,2220,2223,2225,2227,2229],{"class":244,"line":1500},[242,2211,766],{"class":259},[242,2213,361],{"class":263},[242,2215,756],{"class":364},[242,2217,368],{"class":486},[242,2219,509],{"class":263},[242,2221,2222],{"class":276},"Custom refresh failed:",[242,2224,509],{"class":263},[242,2226,387],{"class":263},[242,2228,784],{"class":259},[242,2230,639],{"class":486},[242,2232,2233,2236],{"class":244,"line":1505},[242,2234,2235],{"class":469},"    throw",[242,2237,1497],{"class":259},[242,2239,2240],{"class":244,"line":1510},[242,2241,631],{"class":263},[242,2243,2244],{"class":244,"line":1515},[242,2245,800],{"class":263},[242,2247,2248,2250,2252],{"class":244,"line":1522},[242,2249,805],{"class":263},[242,2251,658],{"class":486},[242,2253,664],{"class":263},[183,2255,2257],{"id":2256},"token-security-best-practices","Token Security Best Practices",[224,2259,2261],{"id":2260},"secure-token-transmission","Secure Token Transmission",[232,2263,2265],{"className":234,"code":2264,"language":236,"meta":237,"style":237},"\u002F\u002F Tokens are automatically included in headers\nconst { headers } = useAuth()\n\n\u002F\u002F Manual API call with auth headers\nconst apiCall = await $fetch('\u002Fapi\u002Fprotected', {\n  headers: {\n    \u002F\u002F Authorization header is automatically added\n    ...headers\n  }\n})\n",[239,2266,2267,2272,2289,2293,2298,2324,2333,2338,2346,2350],{"__ignoreMap":237},[242,2268,2269],{"class":244,"line":245},[242,2270,2271],{"class":248},"\u002F\u002F Tokens are automatically included in headers\n",[242,2273,2274,2276,2278,2281,2283,2285,2287],{"class":244,"line":252},[242,2275,256],{"class":255},[242,2277,671],{"class":263},[242,2279,2280],{"class":259}," headers ",[242,2282,273],{"class":263},[242,2284,679],{"class":263},[242,2286,682],{"class":364},[242,2288,685],{"class":259},[242,2290,2291],{"class":244,"line":289},[242,2292,691],{"emptyLinePlaceholder":690},[242,2294,2295],{"class":244,"line":314},[242,2296,2297],{"class":248},"\u002F\u002F Manual API call with auth headers\n",[242,2299,2300,2302,2305,2307,2309,2311,2313,2315,2318,2320,2322],{"class":244,"line":524},[242,2301,256],{"class":255},[242,2303,2304],{"class":259}," apiCall ",[242,2306,264],{"class":263},[242,2308,1342],{"class":469},[242,2310,1260],{"class":364},[242,2312,368],{"class":259},[242,2314,509],{"class":263},[242,2316,2317],{"class":276},"\u002Fapi\u002Fprotected",[242,2319,509],{"class":263},[242,2321,387],{"class":263},[242,2323,493],{"class":263},[242,2325,2326,2329,2331],{"class":244,"line":534},[242,2327,2328],{"class":486},"  headers",[242,2330,490],{"class":263},[242,2332,493],{"class":263},[242,2334,2335],{"class":244,"line":544},[242,2336,2337],{"class":248},"    \u002F\u002F Authorization header is automatically added\n",[242,2339,2340,2343],{"class":244,"line":554},[242,2341,2342],{"class":263},"    ...",[242,2344,2345],{"class":259},"headers\n",[242,2347,2348],{"class":244,"line":571},[242,2349,631],{"class":263},[242,2351,2352,2354],{"class":244,"line":588},[242,2353,273],{"class":263},[242,2355,639],{"class":259},[224,2357,2359],{"id":2358},"token-cleanup-on-logout","Token Cleanup on Logout",[232,2361,2363],{"className":646,"code":2362,"language":648,"meta":237,"style":237},"\u003Cscript setup>\nconst { logout } = useAuth()\n\nconst handleLogout = async () => {\n  try {\n    await logout('client')\n    \u002F\u002F All tokens automatically cleared:\n    \u002F\u002F - Access token\n    \u002F\u002F - Refresh token  \n    \u002F\u002F - Expiration timestamps\n    \u002F\u002F - 2FA tokens\n  } catch (error) {\n    console.error('Logout error:', error)\n  }\n}\n\u003C\u002Fscript>\n",[239,2364,2365,2375,2392,2396,2413,2419,2436,2441,2446,2451,2456,2461,2475,2498,2502,2506],{"__ignoreMap":237},[242,2366,2367,2369,2371,2373],{"class":244,"line":245},[242,2368,655],{"class":263},[242,2370,658],{"class":486},[242,2372,661],{"class":255},[242,2374,664],{"class":263},[242,2376,2377,2379,2381,2384,2386,2388,2390],{"class":244,"line":252},[242,2378,256],{"class":255},[242,2380,671],{"class":263},[242,2382,2383],{"class":259}," logout ",[242,2385,273],{"class":263},[242,2387,679],{"class":263},[242,2389,682],{"class":364},[242,2391,685],{"class":259},[242,2393,2394],{"class":244,"line":289},[242,2395,691],{"emptyLinePlaceholder":690},[242,2397,2398,2400,2403,2405,2407,2409,2411],{"class":244,"line":314},[242,2399,256],{"class":255},[242,2401,2402],{"class":259}," handleLogout ",[242,2404,264],{"class":263},[242,2406,703],{"class":255},[242,2408,706],{"class":263},[242,2410,709],{"class":255},[242,2412,493],{"class":263},[242,2414,2415,2417],{"class":244,"line":524},[242,2416,716],{"class":469},[242,2418,493],{"class":263},[242,2420,2421,2423,2426,2428,2430,2432,2434],{"class":244,"line":534},[242,2422,723],{"class":469},[242,2424,2425],{"class":364}," logout",[242,2427,368],{"class":486},[242,2429,509],{"class":263},[242,2431,733],{"class":276},[242,2433,509],{"class":263},[242,2435,639],{"class":486},[242,2437,2438],{"class":244,"line":544},[242,2439,2440],{"class":248},"    \u002F\u002F All tokens automatically cleared:\n",[242,2442,2443],{"class":244,"line":554},[242,2444,2445],{"class":248},"    \u002F\u002F - Access token\n",[242,2447,2448],{"class":244,"line":571},[242,2449,2450],{"class":248},"    \u002F\u002F - Refresh token  \n",[242,2452,2453],{"class":244,"line":588},[242,2454,2455],{"class":248},"    \u002F\u002F - Expiration timestamps\n",[242,2457,2458],{"class":244,"line":604},[242,2459,2460],{"class":248},"    \u002F\u002F - 2FA tokens\n",[242,2462,2463,2465,2467,2469,2471,2473],{"class":244,"line":610},[242,2464,747],{"class":263},[242,2466,750],{"class":469},[242,2468,753],{"class":486},[242,2470,756],{"class":259},[242,2472,759],{"class":486},[242,2474,481],{"class":263},[242,2476,2477,2479,2481,2483,2485,2487,2490,2492,2494,2496],{"class":244,"line":616},[242,2478,766],{"class":259},[242,2480,361],{"class":263},[242,2482,756],{"class":364},[242,2484,368],{"class":486},[242,2486,509],{"class":263},[242,2488,2489],{"class":276},"Logout error:",[242,2491,509],{"class":263},[242,2493,387],{"class":263},[242,2495,784],{"class":259},[242,2497,639],{"class":486},[242,2499,2500],{"class":244,"line":622},[242,2501,631],{"class":263},[242,2503,2504],{"class":244,"line":628},[242,2505,800],{"class":263},[242,2507,2508,2510,2512],{"class":244,"line":634},[242,2509,805],{"class":263},[242,2511,658],{"class":486},[242,2513,664],{"class":263},[224,2515,2517],{"id":2516},"token-storage-security","Token Storage Security",[232,2519,2521],{"className":234,"code":2520,"filename":462,"language":236,"meta":237,"style":237},"export default defineNuxtConfig({\n  auth: {\n    cookie: {\n      prefix: '__Secure-', \u002F\u002F Secure prefix\n      options: {\n        httpOnly: true,    \u002F\u002F Prevent XSS\n        secure: true,      \u002F\u002F HTTPS only\n        sameSite: 'lax',   \u002F\u002F CSRF protection\n        priority: 'high'   \u002F\u002F Cookie priority\n      }\n    }\n  }\n})\n",[239,2522,2523,2535,2543,2552,2570,2579,2594,2608,2627,2644,2648,2652,2656],{"__ignoreMap":237},[242,2524,2525,2527,2529,2531,2533],{"class":244,"line":245},[242,2526,470],{"class":469},[242,2528,473],{"class":469},[242,2530,476],{"class":364},[242,2532,368],{"class":259},[242,2534,481],{"class":263},[242,2536,2537,2539,2541],{"class":244,"line":252},[242,2538,487],{"class":486},[242,2540,490],{"class":263},[242,2542,493],{"class":263},[242,2544,2545,2548,2550],{"class":244,"line":289},[242,2546,2547],{"class":486},"    cookie",[242,2549,490],{"class":263},[242,2551,493],{"class":263},[242,2553,2554,2557,2559,2561,2563,2565,2567],{"class":244,"line":314},[242,2555,2556],{"class":486},"      prefix",[242,2558,490],{"class":263},[242,2560,503],{"class":263},[242,2562,2106],{"class":276},[242,2564,509],{"class":263},[242,2566,387],{"class":263},[242,2568,2569],{"class":248}," \u002F\u002F Secure prefix\n",[242,2571,2572,2575,2577],{"class":244,"line":524},[242,2573,2574],{"class":486},"      options",[242,2576,490],{"class":263},[242,2578,493],{"class":263},[242,2580,2581,2584,2586,2589,2591],{"class":244,"line":534},[242,2582,2583],{"class":486},"        httpOnly",[242,2585,490],{"class":263},[242,2587,2588],{"class":905}," true",[242,2590,387],{"class":263},[242,2592,2593],{"class":248},"    \u002F\u002F Prevent XSS\n",[242,2595,2596,2599,2601,2603,2605],{"class":244,"line":544},[242,2597,2598],{"class":486},"        secure",[242,2600,490],{"class":263},[242,2602,2588],{"class":905},[242,2604,387],{"class":263},[242,2606,2607],{"class":248},"      \u002F\u002F HTTPS only\n",[242,2609,2610,2613,2615,2617,2620,2622,2624],{"class":244,"line":554},[242,2611,2612],{"class":486},"        sameSite",[242,2614,490],{"class":263},[242,2616,503],{"class":263},[242,2618,2619],{"class":276},"lax",[242,2621,509],{"class":263},[242,2623,387],{"class":263},[242,2625,2626],{"class":248},"   \u002F\u002F CSRF protection\n",[242,2628,2629,2632,2634,2636,2639,2641],{"class":244,"line":571},[242,2630,2631],{"class":486},"        priority",[242,2633,490],{"class":263},[242,2635,503],{"class":263},[242,2637,2638],{"class":276},"high",[242,2640,509],{"class":263},[242,2642,2643],{"class":248},"   \u002F\u002F Cookie priority\n",[242,2645,2646],{"class":244,"line":588},[242,2647,619],{"class":263},[242,2649,2650],{"class":244,"line":604},[242,2651,625],{"class":263},[242,2653,2654],{"class":244,"line":610},[242,2655,631],{"class":263},[242,2657,2658,2660],{"class":244,"line":616},[242,2659,273],{"class":263},[242,2661,639],{"class":259},[183,2663,2665],{"id":2664},"debugging-token-issues","Debugging Token Issues",[224,2667,2669],{"id":2668},"token-inspector","Token Inspector",[232,2671,2673],{"className":646,"code":2672,"language":648,"meta":237,"style":237},"\u003Ctemplate>\n  \u003Cdiv class=\"token-debug\">\n    \u003Ch3>Token Status\u003C\u002Fh3>\n    \u003Cp>Logged In: {{ loggedIn }}\u003C\u002Fp>\n    \u003Cp>Strategy: {{ strategy }}\u003C\u002Fp>\n    \u003Cp>Token Present: !!token\u003C\u002Fp>\n    \u003Cp>Expires: {{ tokenExpiration }}\u003C\u002Fp>\n    \u003Cp>Is Expired: isTokenExpired\u003C\u002Fp>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup>\nconst { loggedIn, strategy, token, tokenExpiration } = useAuth()\n\nconst isTokenExpired = computed(() => {\n  if (!tokenExpiration.value) return true\n  return Date.now() > parseInt(tokenExpiration.value)\n})\n\u003C\u002Fscript>\n",[239,2674,2675,2684,2707,2725,2742,2759,2776,2793,2810,2819,2827,2831,2841,2871,2875,2893,2914,2940,2946],{"__ignoreMap":237},[242,2676,2677,2679,2682],{"class":244,"line":245},[242,2678,655],{"class":263},[242,2680,2681],{"class":486},"template",[242,2683,664],{"class":263},[242,2685,2686,2689,2692,2695,2697,2700,2703,2705],{"class":244,"line":252},[242,2687,2688],{"class":263},"  \u003C",[242,2690,2691],{"class":486},"div",[242,2693,2694],{"class":255}," class",[242,2696,264],{"class":263},[242,2698,2699],{"class":263},"\"",[242,2701,2702],{"class":276},"token-debug",[242,2704,2699],{"class":263},[242,2706,664],{"class":263},[242,2708,2709,2712,2714,2716,2719,2721,2723],{"class":244,"line":289},[242,2710,2711],{"class":263},"    \u003C",[242,2713,224],{"class":486},[242,2715,964],{"class":263},[242,2717,2718],{"class":259},"Token Status",[242,2720,805],{"class":263},[242,2722,224],{"class":486},[242,2724,664],{"class":263},[242,2726,2727,2729,2731,2733,2736,2738,2740],{"class":244,"line":314},[242,2728,2711],{"class":263},[242,2730,176],{"class":486},[242,2732,964],{"class":263},[242,2734,2735],{"class":259},"Logged In: {{ loggedIn }}",[242,2737,805],{"class":263},[242,2739,176],{"class":486},[242,2741,664],{"class":263},[242,2743,2744,2746,2748,2750,2753,2755,2757],{"class":244,"line":524},[242,2745,2711],{"class":263},[242,2747,176],{"class":486},[242,2749,964],{"class":263},[242,2751,2752],{"class":259},"Strategy: {{ strategy }}",[242,2754,805],{"class":263},[242,2756,176],{"class":486},[242,2758,664],{"class":263},[242,2760,2761,2763,2765,2767,2770,2772,2774],{"class":244,"line":534},[242,2762,2711],{"class":263},[242,2764,176],{"class":486},[242,2766,964],{"class":263},[242,2768,2769],{"class":259},"Token Present: !!token",[242,2771,805],{"class":263},[242,2773,176],{"class":486},[242,2775,664],{"class":263},[242,2777,2778,2780,2782,2784,2787,2789,2791],{"class":244,"line":544},[242,2779,2711],{"class":263},[242,2781,176],{"class":486},[242,2783,964],{"class":263},[242,2785,2786],{"class":259},"Expires: {{ tokenExpiration }}",[242,2788,805],{"class":263},[242,2790,176],{"class":486},[242,2792,664],{"class":263},[242,2794,2795,2797,2799,2801,2804,2806,2808],{"class":244,"line":554},[242,2796,2711],{"class":263},[242,2798,176],{"class":486},[242,2800,964],{"class":263},[242,2802,2803],{"class":259},"Is Expired: isTokenExpired",[242,2805,805],{"class":263},[242,2807,176],{"class":486},[242,2809,664],{"class":263},[242,2811,2812,2815,2817],{"class":244,"line":571},[242,2813,2814],{"class":263},"  \u003C\u002F",[242,2816,2691],{"class":486},[242,2818,664],{"class":263},[242,2820,2821,2823,2825],{"class":244,"line":588},[242,2822,805],{"class":263},[242,2824,2681],{"class":486},[242,2826,664],{"class":263},[242,2828,2829],{"class":244,"line":604},[242,2830,691],{"emptyLinePlaceholder":690},[242,2832,2833,2835,2837,2839],{"class":244,"line":610},[242,2834,655],{"class":263},[242,2836,658],{"class":486},[242,2838,661],{"class":255},[242,2840,664],{"class":263},[242,2842,2843,2845,2847,2849,2851,2853,2855,2858,2860,2863,2865,2867,2869],{"class":244,"line":616},[242,2844,256],{"class":255},[242,2846,671],{"class":263},[242,2848,841],{"class":259},[242,2850,387],{"class":263},[242,2852,2049],{"class":259},[242,2854,387],{"class":263},[242,2856,2857],{"class":259}," token",[242,2859,387],{"class":263},[242,2861,2862],{"class":259}," tokenExpiration ",[242,2864,273],{"class":263},[242,2866,679],{"class":263},[242,2868,682],{"class":364},[242,2870,685],{"class":259},[242,2872,2873],{"class":244,"line":622},[242,2874,691],{"emptyLinePlaceholder":690},[242,2876,2877,2879,2881,2883,2885,2887,2889,2891],{"class":244,"line":628},[242,2878,256],{"class":255},[242,2880,865],{"class":259},[242,2882,264],{"class":263},[242,2884,870],{"class":364},[242,2886,368],{"class":259},[242,2888,875],{"class":263},[242,2890,709],{"class":255},[242,2892,493],{"class":263},[242,2894,2895,2897,2899,2901,2904,2906,2908,2910,2912],{"class":244,"line":634},[242,2896,884],{"class":469},[242,2898,753],{"class":486},[242,2900,889],{"class":263},[242,2902,2903],{"class":259},"tokenExpiration",[242,2905,361],{"class":263},[242,2907,897],{"class":259},[242,2909,759],{"class":486},[242,2911,902],{"class":469},[242,2913,906],{"class":905},[242,2915,2916,2918,2920,2922,2924,2926,2928,2930,2932,2934,2936,2938],{"class":244,"line":1070},[242,2917,945],{"class":469},[242,2919,953],{"class":259},[242,2921,361],{"class":263},[242,2923,958],{"class":364},[242,2925,961],{"class":486},[242,2927,964],{"class":263},[242,2929,967],{"class":364},[242,2931,368],{"class":486},[242,2933,2903],{"class":259},[242,2935,361],{"class":263},[242,2937,897],{"class":259},[242,2939,639],{"class":486},[242,2941,2942,2944],{"class":244,"line":1077},[242,2943,273],{"class":263},[242,2945,639],{"class":259},[242,2947,2948,2950,2952],{"class":244,"line":1486},[242,2949,805],{"class":263},[242,2951,658],{"class":486},[242,2953,664],{"class":263},[224,2955,2957],{"id":2956},"common-token-issues","Common Token Issues",[2959,2960,2961,2977],"table",{},[2962,2963,2964],"thead",{},[2965,2966,2967,2971,2974],"tr",{},[2968,2969,2970],"th",{},"Issue",[2968,2972,2973],{},"Cause",[2968,2975,2976],{},"Solution",[2978,2979,2980,2992,3003,3014],"tbody",{},[2965,2981,2982,2986,2989],{},[2983,2984,2985],"td",{},"Token not found",[2983,2987,2988],{},"User not logged in",[2983,2990,2991],{},"Redirect to login",[2965,2993,2994,2997,3000],{},[2983,2995,2996],{},"Token expired",[2983,2998,2999],{},"Token reached expiration",[2983,3001,3002],{},"Refresh token or re-authenticate",[2965,3004,3005,3008,3011],{},[2983,3006,3007],{},"Invalid token",[2983,3009,3010],{},"Token revoked or corrupted",[2983,3012,3013],{},"Clear storage and re-authenticate",[2965,3015,3016,3019,3022],{},[2983,3017,3018],{},"Refresh failed",[2983,3020,3021],{},"Refresh token expired",[2983,3023,3024],{},"Force logout and re-authenticate",[180,3026],{},[176,3028,3029,3032,3033,3037],{},[197,3030,3031],{},"Next:"," Learn about ",[3034,3035,62],"a",{"href":3036},"\u002F3.passport\u002F4.2fa"," for enhanced security.",[3039,3040,3041],"style",{},"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 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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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 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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":237,"searchDepth":245,"depth":252,"links":3043},[3044,3045,3049,3053,3057,3061,3065,3070],{"id":185,"depth":252,"text":186},{"id":221,"depth":252,"text":222,"children":3046},[3047,3048],{"id":226,"depth":289,"text":227},{"id":339,"depth":289,"text":340},{"id":451,"depth":252,"text":452,"children":3050},[3051,3052],{"id":458,"depth":289,"text":24},{"id":642,"depth":289,"text":643},{"id":812,"depth":252,"text":813,"children":3054},[3055,3056],{"id":816,"depth":289,"text":817},{"id":1086,"depth":289,"text":1087},{"id":1223,"depth":252,"text":1224,"children":3058},[3059,3060],{"id":1227,"depth":289,"text":1228},{"id":1560,"depth":289,"text":1561},{"id":1732,"depth":252,"text":1733,"children":3062},[3063,3064],{"id":1736,"depth":289,"text":1737},{"id":1921,"depth":289,"text":1922},{"id":2256,"depth":252,"text":2257,"children":3066},[3067,3068,3069],{"id":2260,"depth":289,"text":2261},{"id":2358,"depth":289,"text":2359},{"id":2516,"depth":289,"text":2517},{"id":2664,"depth":252,"text":2665,"children":3071},[3072,3073],{"id":2668,"depth":289,"text":2669},{"id":2956,"depth":289,"text":2957},"Managing OAuth2 tokens, refresh, and expiration with Laravel Passport","md",null,{},{"icon":60},{"title":57,"description":3074},"dIRP9O7_e2V-lUA6UH31vER0D0Jwg-Gx1j08IhRsJGs",[3082,3084],{"title":52,"path":53,"stem":54,"description":3083,"icon":55,"children":-1},"How to implement login and logout functionality with Laravel Passport",{"title":62,"path":63,"stem":64,"description":3085,"icon":65,"children":-1},"Implementing two-factor authentication (2FA) with Laravel Passport",1785126612932]