[{"data":1,"prerenderedAt":2079},["ShallowReactive",2],{"navigation":3,"/ecosystem/nuxt-auth-sp":145,"/ecosystem/nuxt-auth-sp-surround":2074},[4,28,49,88,101,127],{"title":5,"path":6,"stem":7,"children":8,"icon":27},"Getting Started","/getting-started","1.getting-started/1.index",[9,11,15,19,23],{"title":10,"path":6,"stem":7},"Introduction",{"title":12,"path":13,"stem":14},"Working with Agents","/getting-started/working-with-agents","1.getting-started/2.working-with-agents",{"title":16,"path":17,"stem":18},"Setup a Service Provider","/getting-started/setup-service-provider","1.getting-started/3.setup-service-provider",{"title":20,"path":21,"stem":22},"Setup an Identity Provider","/getting-started/setup-identity-provider","1.getting-started/4.setup-identity-provider",{"title":24,"path":25,"stem":26},"Developers","/getting-started/developers","1.getting-started/5.developers",false,{"title":29,"icon":27,"path":30,"stem":31,"children":32,"page":27},"Guides","/guides","2.guides",[33,37,41,45],{"title":34,"path":35,"stem":36},"How It Works","/guides/how-it-works","2.guides/1.how-it-works",{"title":38,"path":39,"stem":40},"Capabilities Guide","/guides/capabilities-guide","2.guides/2.capabilities-guide",{"title":42,"path":43,"stem":44},"End-to-End Tutorial","/guides/end-to-end-tutorial","2.guides/3.end-to-end-tutorial",{"title":46,"path":47,"stem":48},"Delegation Guide","/guides/delegation-guide","2.guides/4.delegation-guide",{"title":50,"path":51,"stem":52,"children":53,"icon":27},"Ecosystem","/ecosystem","3.ecosystem/1.index",[54,56,60,64,68,72,76,80,84],{"title":55,"path":51,"stem":52},"Overview",{"title":57,"path":58,"stem":59},"grapes CLI","/ecosystem/grapes","3.ecosystem/2.grapes",{"title":61,"path":62,"stem":63},"shapes CLI","/ecosystem/shapes","3.ecosystem/3.shapes",{"title":65,"path":66,"stem":67},"escapes","/ecosystem/escapes","3.ecosystem/4.escapes",{"title":69,"path":70,"stem":71},"OpenApe Proxy","/ecosystem/proxy","3.ecosystem/5.proxy",{"title":73,"path":74,"stem":75},"OpenApe Browser","/ecosystem/browser","3.ecosystem/6.browser",{"title":77,"path":78,"stem":79},"OpenApe Auth","/ecosystem/auth","3.ecosystem/7.auth",{"title":81,"path":82,"stem":83},"OpenApe Grants","/ecosystem/grants","3.ecosystem/8.grants",{"title":85,"path":86,"stem":87},"nuxt-auth-sp","/ecosystem/nuxt-auth-sp","3.ecosystem/9.nuxt-auth-sp",{"title":89,"icon":27,"path":90,"stem":91,"children":92,"page":27},"Security","/security","4.security",[93,97],{"title":94,"path":95,"stem":96},"Compliance","/security/compliance","4.security/1.compliance",{"title":98,"path":99,"stem":100},"Threat Model","/security/threat-model","4.security/2.threat-model",{"title":102,"path":103,"stem":104,"children":105,"icon":27},"Reference","/reference","5.reference/1.index",[106,107,111,115,119,123],{"title":102,"path":103,"stem":104},{"title":108,"path":109,"stem":110},"IdP Configuration","/reference/idp-configuration","5.reference/2.idp-configuration",{"title":112,"path":113,"stem":114},"SP Configuration","/reference/sp-configuration","5.reference/3.sp-configuration",{"title":116,"path":117,"stem":118},"API Endpoints","/reference/api-endpoints","5.reference/4.api-endpoints",{"title":120,"path":121,"stem":122},"escapes Config","/reference/escapes-config","5.reference/5.escapes-config",{"title":124,"path":125,"stem":126},"Proxy Config","/reference/proxy-config","5.reference/6.proxy-config",{"title":128,"path":129,"stem":130,"children":131,"icon":27},"Operations","/operations","6.operations/1.index",[132,133,137,141],{"title":128,"path":129,"stem":130},{"title":134,"path":135,"stem":136},"Deployment","/operations/deployment","6.operations/2.deployment",{"title":138,"path":139,"stem":140},"Troubleshooting","/operations/troubleshooting","6.operations/3.troubleshooting",{"title":142,"path":143,"stem":144},"Monitoring","/operations/monitoring","6.operations/4.monitoring",{"id":146,"title":85,"body":147,"description":2068,"extension":2069,"links":2070,"meta":2071,"navigation":1278,"path":86,"seo":2072,"stem":87,"__hash__":2073},"docs/3.ecosystem/9.nuxt-auth-sp.md",{"type":148,"value":149,"toc":2042},"minimark",[150,155,159,164,169,195,202,265,276,280,318,325,329,336,388,399,405,408,412,494,498,530,534,603,607,613,852,858,862,868,896,901,1058,1065,1068,1115,1210,1214,1581,1585,1588,1665,1669,1674,1816,1819,1890,1894,1901,1922,1957,1960,1964,1969,2038],[151,152,154],"h1",{"id":153},"openapenuxt-auth-sp","@openape/nuxt-auth-sp",[156,157,158],"p",{},"Drop-in Nuxt module for Service Provider authentication. Stateless, zero server storage.",[160,161,163],"h2",{"id":162},"quick-start","Quick Start",[165,166,168],"h3",{"id":167},"_1-install","1. Install",[170,171,176],"pre",{"className":172,"code":173,"language":174,"meta":175,"style":175},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add @openape/nuxt-auth-sp\n","bash","",[177,178,179],"code",{"__ignoreMap":175},[180,181,184,188,192],"span",{"class":182,"line":183},"line",1,[180,185,187],{"class":186},"sBMFI","pnpm",[180,189,191],{"class":190},"sfazB"," add",[180,193,194],{"class":190}," @openape/nuxt-auth-sp\n",[165,196,198,199],{"id":197},"_2-add-to-nuxtconfigts","2. Add to ",[177,200,201],{},"nuxt.config.ts",[170,203,207],{"className":204,"code":205,"language":206,"meta":175,"style":175},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: ['@openape/nuxt-auth-sp'],\n})\n","ts",[177,208,209,230,256],{"__ignoreMap":175},[180,210,211,215,218,222,226],{"class":182,"line":183},[180,212,214],{"class":213},"s7zQu","export",[180,216,217],{"class":213}," default",[180,219,221],{"class":220},"s2Zo4"," defineNuxtConfig",[180,223,225],{"class":224},"sTEyZ","(",[180,227,229],{"class":228},"sMK4o","{\n",[180,231,233,237,240,243,246,248,250,253],{"class":182,"line":232},2,[180,234,236],{"class":235},"swJcz","  modules",[180,238,239],{"class":228},":",[180,241,242],{"class":224}," [",[180,244,245],{"class":228},"'",[180,247,154],{"class":190},[180,249,245],{"class":228},[180,251,252],{"class":224},"]",[180,254,255],{"class":228},",\n",[180,257,259,262],{"class":182,"line":258},3,[180,260,261],{"class":228},"}",[180,263,264],{"class":224},")\n",[156,266,267,268,271,272,275],{},"That's it for development. The module auto-generates a ",[177,269,270],{},"sessionSecret"," and derives ",[177,273,274],{},"clientId"," from your dev server port.",[165,277,279],{"id":278},"_3-add-a-login-page","3. Add a login page",[170,281,285],{"className":282,"code":283,"language":284,"meta":175,"style":175},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Ctemplate>\n  \u003COpenApeAuth />\n\u003C/template>\n","vue",[177,286,287,298,309],{"__ignoreMap":175},[180,288,289,292,295],{"class":182,"line":183},[180,290,291],{"class":228},"\u003C",[180,293,294],{"class":235},"template",[180,296,297],{"class":228},">\n",[180,299,300,303,306],{"class":182,"line":232},[180,301,302],{"class":228},"  \u003C",[180,304,305],{"class":235},"OpenApeAuth",[180,307,308],{"class":228}," />\n",[180,310,311,314,316],{"class":182,"line":258},[180,312,313],{"class":228},"\u003C/",[180,315,294],{"class":235},[180,317,297],{"class":228},[156,319,320,321,324],{},"The ",[177,322,323],{},"\u003COpenApeAuth />"," component handles the full login flow: email input, IdP redirect, error display, and loading states.",[160,326,328],{"id":327},"zero-config-dev-mode","Zero-Config Dev Mode",[156,330,331,332,335],{},"In development (",[177,333,334],{},"nuxt dev","), the module auto-configures:",[337,338,339,352],"table",{},[340,341,342],"thead",{},[343,344,345,349],"tr",{},[346,347,348],"th",{},"Setting",[346,350,351],{},"Auto-value",[353,354,355,365,376],"tbody",{},[343,356,357,362],{},[358,359,360],"td",{},[177,361,270],{},[358,363,364],{},"Random UUID (regenerated each restart)",[343,366,367,371],{},[358,368,369],{},[177,370,274],{},[358,372,373],{},[177,374,375],{},"localhost:{port}",[343,377,378,383],{},[358,379,380],{},[177,381,382],{},"fallbackIdpUrl",[358,384,385],{},[177,386,387],{},"https://id.openape.at",[156,389,390,391,394,395,398],{},"No ",[177,392,393],{},".env"," file or ",[177,396,397],{},"runtimeConfig"," needed to start developing.",[160,400,402,404],{"id":401},"openapeauth-component",[177,403,323],{}," Component",[156,406,407],{},"A prebuilt login form shipped with the module. Handles email input, loading/error states, and the DDISA redirect flow.",[165,409,411],{"id":410},"props","Props",[337,413,414,427],{},[340,415,416],{},[343,417,418,421,424],{},[346,419,420],{},"Prop",[346,422,423],{},"Type",[346,425,426],{},"Default",[353,428,429,446,462,478],{},[343,430,431,436,441],{},[358,432,433],{},[177,434,435],{},"title",[358,437,438],{},[177,439,440],{},"string",[358,442,443],{},[177,444,445],{},"'Sign in'",[343,447,448,453,457],{},[358,449,450],{},[177,451,452],{},"subtitle",[358,454,455],{},[177,456,440],{},[358,458,459],{},[177,460,461],{},"'Enter your email to continue'",[343,463,464,469,473],{},[358,465,466],{},[177,467,468],{},"buttonText",[358,470,471],{},[177,472,440],{},[358,474,475],{},[177,476,477],{},"'Continue'",[343,479,480,485,489],{},[358,481,482],{},[177,483,484],{},"placeholder",[358,486,487],{},[177,488,440],{},[358,490,491],{},[177,492,493],{},"'you@example.com'",[165,495,497],{"id":496},"events","Events",[337,499,500,513],{},[340,501,502],{},[343,503,504,507,510],{},[346,505,506],{},"Event",[346,508,509],{},"Payload",[346,511,512],{},"Description",[353,514,515],{},[343,516,517,522,527],{},[358,518,519],{},[177,520,521],{},"error",[358,523,524],{},[177,525,526],{},"Error",[358,528,529],{},"Emitted when login fails",[165,531,533],{"id":532},"slots","Slots",[337,535,536,547],{},[340,537,538],{},[343,539,540,543,545],{},[346,541,542],{},"Slot",[346,544,411],{},[346,546,512],{},[353,548,549,562,577,591],{},[343,550,551,556,559],{},[358,552,553],{},[177,554,555],{},"header",[358,557,558],{},"—",[358,560,561],{},"Replace the title/subtitle block",[343,563,564,569,574],{},[358,565,566],{},[177,567,568],{},"button",[358,570,571],{},[177,572,573],{},"{ submitting: boolean }",[358,575,576],{},"Replace the submit button",[343,578,579,583,588],{},[358,580,581],{},[177,582,521],{},[358,584,585],{},[177,586,587],{},"{ error: string }",[358,589,590],{},"Replace the error display",[343,592,593,598,600],{},[358,594,595],{},[177,596,597],{},"footer",[358,599,558],{},[358,601,602],{},"Add content below the form",[165,604,606],{"id":605},"styling","Styling",[156,608,609,610,239],{},"The component uses CSS custom properties for theming. Override them on ",[177,611,612],{},".openape-auth",[170,614,618],{"className":615,"code":616,"language":617,"meta":175,"style":175},"language-css shiki shiki-themes material-theme-lighter material-theme material-theme-palenight",".openape-auth {\n  --oa-bg: #ffffff;\n  --oa-border: #e2e2e2;\n  --oa-text: #1a1a1a;\n  --oa-text-muted: #6b7280;\n  --oa-primary: #18181b;\n  --oa-primary-hover: #27272a;\n  --oa-primary-text: #ffffff;\n  --oa-error: #dc2626;\n  --oa-error-bg: #fef2f2;\n  --oa-input-bg: #ffffff;\n  --oa-input-border: #d1d5db;\n  --oa-input-focus: #18181b;\n  --oa-radius: 8px;\n  --oa-font: system-ui, -apple-system, sans-serif;\n}\n","css",[177,619,620,631,647,661,676,691,706,721,735,750,765,779,794,808,822,846],{"__ignoreMap":175},[180,621,622,625,628],{"class":182,"line":183},[180,623,624],{"class":228},".",[180,626,627],{"class":186},"openape-auth",[180,629,630],{"class":228}," {\n",[180,632,633,636,638,641,644],{"class":182,"line":232},[180,634,635],{"class":224},"  --oa-bg",[180,637,239],{"class":228},[180,639,640],{"class":228}," #",[180,642,643],{"class":224},"ffffff",[180,645,646],{"class":228},";\n",[180,648,649,652,654,656,659],{"class":182,"line":258},[180,650,651],{"class":224},"  --oa-border",[180,653,239],{"class":228},[180,655,640],{"class":228},[180,657,658],{"class":224},"e2e2e2",[180,660,646],{"class":228},[180,662,664,667,669,671,674],{"class":182,"line":663},4,[180,665,666],{"class":224},"  --oa-text",[180,668,239],{"class":228},[180,670,640],{"class":228},[180,672,673],{"class":224},"1a1a1a",[180,675,646],{"class":228},[180,677,679,682,684,686,689],{"class":182,"line":678},5,[180,680,681],{"class":224},"  --oa-text-muted",[180,683,239],{"class":228},[180,685,640],{"class":228},[180,687,688],{"class":224},"6b7280",[180,690,646],{"class":228},[180,692,694,697,699,701,704],{"class":182,"line":693},6,[180,695,696],{"class":224},"  --oa-primary",[180,698,239],{"class":228},[180,700,640],{"class":228},[180,702,703],{"class":224},"18181b",[180,705,646],{"class":228},[180,707,709,712,714,716,719],{"class":182,"line":708},7,[180,710,711],{"class":224},"  --oa-primary-hover",[180,713,239],{"class":228},[180,715,640],{"class":228},[180,717,718],{"class":224},"27272a",[180,720,646],{"class":228},[180,722,724,727,729,731,733],{"class":182,"line":723},8,[180,725,726],{"class":224},"  --oa-primary-text",[180,728,239],{"class":228},[180,730,640],{"class":228},[180,732,643],{"class":224},[180,734,646],{"class":228},[180,736,738,741,743,745,748],{"class":182,"line":737},9,[180,739,740],{"class":224},"  --oa-error",[180,742,239],{"class":228},[180,744,640],{"class":228},[180,746,747],{"class":224},"dc2626",[180,749,646],{"class":228},[180,751,753,756,758,760,763],{"class":182,"line":752},10,[180,754,755],{"class":224},"  --oa-error-bg",[180,757,239],{"class":228},[180,759,640],{"class":228},[180,761,762],{"class":224},"fef2f2",[180,764,646],{"class":228},[180,766,768,771,773,775,777],{"class":182,"line":767},11,[180,769,770],{"class":224},"  --oa-input-bg",[180,772,239],{"class":228},[180,774,640],{"class":228},[180,776,643],{"class":224},[180,778,646],{"class":228},[180,780,782,785,787,789,792],{"class":182,"line":781},12,[180,783,784],{"class":224},"  --oa-input-border",[180,786,239],{"class":228},[180,788,640],{"class":228},[180,790,791],{"class":224},"d1d5db",[180,793,646],{"class":228},[180,795,797,800,802,804,806],{"class":182,"line":796},13,[180,798,799],{"class":224},"  --oa-input-focus",[180,801,239],{"class":228},[180,803,640],{"class":228},[180,805,703],{"class":224},[180,807,646],{"class":228},[180,809,811,814,816,820],{"class":182,"line":810},14,[180,812,813],{"class":224},"  --oa-radius",[180,815,239],{"class":228},[180,817,819],{"class":818},"sbssI"," 8px",[180,821,646],{"class":228},[180,823,825,828,830,833,836,839,841,844],{"class":182,"line":824},15,[180,826,827],{"class":224},"  --oa-font",[180,829,239],{"class":228},[180,831,832],{"class":224}," system-ui",[180,834,835],{"class":228},",",[180,837,838],{"class":224}," -apple-system",[180,840,835],{"class":228},[180,842,843],{"class":224}," sans-serif",[180,845,646],{"class":228},[180,847,849],{"class":182,"line":848},16,[180,850,851],{"class":228},"}\n",[156,853,854,855,624],{},"Dark mode is supported automatically via ",[177,856,857],{},"prefers-color-scheme",[165,859,861],{"id":860},"examples","Examples",[156,863,864],{},[865,866,867],"strong",{},"Minimal:",[170,869,870],{"className":282,"code":283,"language":284,"meta":175,"style":175},[177,871,872,880,888],{"__ignoreMap":175},[180,873,874,876,878],{"class":182,"line":183},[180,875,291],{"class":228},[180,877,294],{"class":235},[180,879,297],{"class":228},[180,881,882,884,886],{"class":182,"line":232},[180,883,302],{"class":228},[180,885,305],{"class":235},[180,887,308],{"class":228},[180,889,890,892,894],{"class":182,"line":258},[180,891,313],{"class":228},[180,893,294],{"class":235},[180,895,297],{"class":228},[156,897,898],{},[865,899,900],{},"Customized:",[170,902,904],{"className":282,"code":903,"language":284,"meta":175,"style":175},"\u003Ctemplate>\n  \u003COpenApeAuth\n    title=\"Welcome back\"\n    subtitle=\"Sign in to your account\"\n    button-text=\"Sign in\"\n    placeholder=\"name@company.com\"\n    @error=\"handleError\"\n  >\n    \u003Ctemplate #footer>\n      \u003Cp>Don't have an account? Contact your admin.\u003C/p>\n    \u003C/template>\n  \u003C/OpenApeAuth>\n\u003C/template>\n",[177,905,906,914,921,939,953,967,981,995,1000,1013,1032,1041,1050],{"__ignoreMap":175},[180,907,908,910,912],{"class":182,"line":183},[180,909,291],{"class":228},[180,911,294],{"class":235},[180,913,297],{"class":228},[180,915,916,918],{"class":182,"line":232},[180,917,302],{"class":228},[180,919,920],{"class":235},"OpenApeAuth\n",[180,922,923,927,930,933,936],{"class":182,"line":258},[180,924,926],{"class":925},"spNyl","    title",[180,928,929],{"class":228},"=",[180,931,932],{"class":228},"\"",[180,934,935],{"class":190},"Welcome back",[180,937,938],{"class":228},"\"\n",[180,940,941,944,946,948,951],{"class":182,"line":663},[180,942,943],{"class":925},"    subtitle",[180,945,929],{"class":228},[180,947,932],{"class":228},[180,949,950],{"class":190},"Sign in to your account",[180,952,938],{"class":228},[180,954,955,958,960,962,965],{"class":182,"line":678},[180,956,957],{"class":925},"    button-text",[180,959,929],{"class":228},[180,961,932],{"class":228},[180,963,964],{"class":190},"Sign in",[180,966,938],{"class":228},[180,968,969,972,974,976,979],{"class":182,"line":693},[180,970,971],{"class":925},"    placeholder",[180,973,929],{"class":228},[180,975,932],{"class":228},[180,977,978],{"class":190},"name@company.com",[180,980,938],{"class":228},[180,982,983,986,988,990,993],{"class":182,"line":708},[180,984,985],{"class":925},"    @error",[180,987,929],{"class":228},[180,989,932],{"class":228},[180,991,992],{"class":190},"handleError",[180,994,938],{"class":228},[180,996,997],{"class":182,"line":723},[180,998,999],{"class":228},"  >\n",[180,1001,1002,1005,1007,1009,1011],{"class":182,"line":737},[180,1003,1004],{"class":228},"    \u003C",[180,1006,294],{"class":235},[180,1008,640],{"class":228},[180,1010,597],{"class":925},[180,1012,297],{"class":228},[180,1014,1015,1018,1020,1023,1026,1028,1030],{"class":182,"line":752},[180,1016,1017],{"class":228},"      \u003C",[180,1019,156],{"class":235},[180,1021,1022],{"class":228},">",[180,1024,1025],{"class":224},"Don't have an account? Contact your admin.",[180,1027,313],{"class":228},[180,1029,156],{"class":235},[180,1031,297],{"class":228},[180,1033,1034,1037,1039],{"class":182,"line":767},[180,1035,1036],{"class":228},"    \u003C/",[180,1038,294],{"class":235},[180,1040,297],{"class":228},[180,1042,1043,1046,1048],{"class":182,"line":781},[180,1044,1045],{"class":228},"  \u003C/",[180,1047,305],{"class":235},[180,1049,297],{"class":228},[180,1051,1052,1054,1056],{"class":182,"line":796},[180,1053,313],{"class":228},[180,1055,294],{"class":235},[180,1057,297],{"class":228},[160,1059,1061,1064],{"id":1060},"useopenapeauth-composable",[177,1062,1063],{},"useOpenApeAuth()"," Composable",[156,1066,1067],{},"For custom login UIs, use the composable directly:",[170,1069,1071],{"className":204,"code":1070,"language":206,"meta":175,"style":175},"const { user, loading, fetchUser, login, logout } = useOpenApeAuth()\n",[177,1072,1073],{"__ignoreMap":175},[180,1074,1075,1078,1081,1084,1086,1089,1091,1094,1096,1099,1101,1104,1106,1109,1112],{"class":182,"line":183},[180,1076,1077],{"class":925},"const",[180,1079,1080],{"class":228}," {",[180,1082,1083],{"class":224}," user",[180,1085,835],{"class":228},[180,1087,1088],{"class":224}," loading",[180,1090,835],{"class":228},[180,1092,1093],{"class":224}," fetchUser",[180,1095,835],{"class":228},[180,1097,1098],{"class":224}," login",[180,1100,835],{"class":228},[180,1102,1103],{"class":224}," logout ",[180,1105,261],{"class":228},[180,1107,1108],{"class":228}," =",[180,1110,1111],{"class":220}," useOpenApeAuth",[180,1113,1114],{"class":224},"()\n",[337,1116,1117,1128],{},[340,1118,1119],{},[343,1120,1121,1124,1126],{},[346,1122,1123],{},"Property",[346,1125,423],{},[346,1127,512],{},[353,1129,1130,1145,1160,1178,1193],{},[343,1131,1132,1137,1142],{},[358,1133,1134],{},[177,1135,1136],{},"user",[358,1138,1139],{},[177,1140,1141],{},"Ref\u003CDDISAAssertionClaims | null>",[358,1143,1144],{},"Current authenticated user",[343,1146,1147,1152,1157],{},[358,1148,1149],{},[177,1150,1151],{},"loading",[358,1153,1154],{},[177,1155,1156],{},"Ref\u003Cboolean>",[358,1158,1159],{},"Whether auth state is being fetched",[343,1161,1162,1167,1172],{},[358,1163,1164],{},[177,1165,1166],{},"fetchUser()",[358,1168,1169],{},[177,1170,1171],{},"() => Promise\u003Cvoid>",[358,1173,1174,1175],{},"Fetch current user from ",[177,1176,1177],{},"/api/me",[343,1179,1180,1185,1190],{},[358,1181,1182],{},[177,1183,1184],{},"login(email)",[358,1186,1187],{},[177,1188,1189],{},"(email: string) => Promise\u003Cvoid>",[358,1191,1192],{},"Initiate login — redirects to IdP",[343,1194,1195,1200,1204],{},[358,1196,1197],{},[177,1198,1199],{},"logout()",[358,1201,1202],{},[177,1203,1171],{},[358,1205,1206,1207],{},"Destroy session and redirect to ",[177,1208,1209],{},"/",[165,1211,1213],{"id":1212},"custom-login-page-example","Custom Login Page Example",[170,1215,1217],{"className":282,"code":1216,"language":284,"meta":175,"style":175},"\u003Cscript setup lang=\"ts\">\nconst { user, loading, fetchUser, login, logout } = useOpenApeAuth()\n\nonMounted(async () => {\n  await fetchUser()\n  if (user.value) navigateTo('/dashboard')\n})\n\u003C/script>\n\n\u003Ctemplate>\n  \u003Cdiv v-if=\"loading\">Loading...\u003C/div>\n  \u003Cdiv v-else-if=\"user\">\n    \u003Cp>Logged in as {{ user.sub }}\u003C/p>\n    \u003Cbutton @click=\"logout()\">Logout\u003C/button>\n  \u003C/div>\n  \u003Cform v-else @submit.prevent=\"login(email)\">\n    \u003Cinput v-model=\"email\" type=\"email\" placeholder=\"you@example.com\">\n    \u003Cbutton type=\"submit\">Login\u003C/button>\n  \u003C/form>\n\u003C/template>\n",[177,1218,1219,1242,1274,1280,1298,1307,1339,1345,1353,1357,1365,1394,1413,1430,1458,1466,1489,1534,1563,1572],{"__ignoreMap":175},[180,1220,1221,1223,1226,1229,1232,1234,1236,1238,1240],{"class":182,"line":183},[180,1222,291],{"class":228},[180,1224,1225],{"class":235},"script",[180,1227,1228],{"class":925}," setup",[180,1230,1231],{"class":925}," lang",[180,1233,929],{"class":228},[180,1235,932],{"class":228},[180,1237,206],{"class":190},[180,1239,932],{"class":228},[180,1241,297],{"class":228},[180,1243,1244,1246,1248,1250,1252,1254,1256,1258,1260,1262,1264,1266,1268,1270,1272],{"class":182,"line":232},[180,1245,1077],{"class":925},[180,1247,1080],{"class":228},[180,1249,1083],{"class":224},[180,1251,835],{"class":228},[180,1253,1088],{"class":224},[180,1255,835],{"class":228},[180,1257,1093],{"class":224},[180,1259,835],{"class":228},[180,1261,1098],{"class":224},[180,1263,835],{"class":228},[180,1265,1103],{"class":224},[180,1267,261],{"class":228},[180,1269,1108],{"class":228},[180,1271,1111],{"class":220},[180,1273,1114],{"class":224},[180,1275,1276],{"class":182,"line":258},[180,1277,1279],{"emptyLinePlaceholder":1278},true,"\n",[180,1281,1282,1285,1287,1290,1293,1296],{"class":182,"line":663},[180,1283,1284],{"class":220},"onMounted",[180,1286,225],{"class":224},[180,1288,1289],{"class":925},"async",[180,1291,1292],{"class":228}," ()",[180,1294,1295],{"class":925}," =>",[180,1297,630],{"class":228},[180,1299,1300,1303,1305],{"class":182,"line":678},[180,1301,1302],{"class":213},"  await",[180,1304,1093],{"class":220},[180,1306,1114],{"class":235},[180,1308,1309,1312,1315,1317,1319,1322,1325,1328,1330,1332,1335,1337],{"class":182,"line":693},[180,1310,1311],{"class":213},"  if",[180,1313,1314],{"class":235}," (",[180,1316,1136],{"class":224},[180,1318,624],{"class":228},[180,1320,1321],{"class":224},"value",[180,1323,1324],{"class":235},") ",[180,1326,1327],{"class":220},"navigateTo",[180,1329,225],{"class":235},[180,1331,245],{"class":228},[180,1333,1334],{"class":190},"/dashboard",[180,1336,245],{"class":228},[180,1338,264],{"class":235},[180,1340,1341,1343],{"class":182,"line":708},[180,1342,261],{"class":228},[180,1344,264],{"class":224},[180,1346,1347,1349,1351],{"class":182,"line":723},[180,1348,313],{"class":228},[180,1350,1225],{"class":235},[180,1352,297],{"class":228},[180,1354,1355],{"class":182,"line":737},[180,1356,1279],{"emptyLinePlaceholder":1278},[180,1358,1359,1361,1363],{"class":182,"line":752},[180,1360,291],{"class":228},[180,1362,294],{"class":235},[180,1364,297],{"class":228},[180,1366,1367,1369,1372,1375,1377,1379,1381,1383,1385,1388,1390,1392],{"class":182,"line":767},[180,1368,302],{"class":228},[180,1370,1371],{"class":235},"div",[180,1373,1374],{"class":925}," v-if",[180,1376,929],{"class":228},[180,1378,932],{"class":228},[180,1380,1151],{"class":190},[180,1382,932],{"class":228},[180,1384,1022],{"class":228},[180,1386,1387],{"class":224},"Loading...",[180,1389,313],{"class":228},[180,1391,1371],{"class":235},[180,1393,297],{"class":228},[180,1395,1396,1398,1400,1403,1405,1407,1409,1411],{"class":182,"line":781},[180,1397,302],{"class":228},[180,1399,1371],{"class":235},[180,1401,1402],{"class":925}," v-else-if",[180,1404,929],{"class":228},[180,1406,932],{"class":228},[180,1408,1136],{"class":190},[180,1410,932],{"class":228},[180,1412,297],{"class":228},[180,1414,1415,1417,1419,1421,1424,1426,1428],{"class":182,"line":796},[180,1416,1004],{"class":228},[180,1418,156],{"class":235},[180,1420,1022],{"class":228},[180,1422,1423],{"class":224},"Logged in as {{ user.sub }}",[180,1425,313],{"class":228},[180,1427,156],{"class":235},[180,1429,297],{"class":228},[180,1431,1432,1434,1436,1439,1441,1443,1445,1447,1449,1452,1454,1456],{"class":182,"line":810},[180,1433,1004],{"class":228},[180,1435,568],{"class":235},[180,1437,1438],{"class":925}," @click",[180,1440,929],{"class":228},[180,1442,932],{"class":228},[180,1444,1199],{"class":190},[180,1446,932],{"class":228},[180,1448,1022],{"class":228},[180,1450,1451],{"class":224},"Logout",[180,1453,313],{"class":228},[180,1455,568],{"class":235},[180,1457,297],{"class":228},[180,1459,1460,1462,1464],{"class":182,"line":824},[180,1461,1045],{"class":228},[180,1463,1371],{"class":235},[180,1465,297],{"class":228},[180,1467,1468,1470,1473,1476,1479,1481,1483,1485,1487],{"class":182,"line":848},[180,1469,302],{"class":228},[180,1471,1472],{"class":235},"form",[180,1474,1475],{"class":925}," v-else",[180,1477,1478],{"class":925}," @submit.prevent",[180,1480,929],{"class":228},[180,1482,932],{"class":228},[180,1484,1184],{"class":190},[180,1486,932],{"class":228},[180,1488,297],{"class":228},[180,1490,1492,1494,1497,1500,1502,1504,1507,1509,1512,1514,1516,1518,1520,1523,1525,1527,1530,1532],{"class":182,"line":1491},17,[180,1493,1004],{"class":228},[180,1495,1496],{"class":235},"input",[180,1498,1499],{"class":925}," v-model",[180,1501,929],{"class":228},[180,1503,932],{"class":228},[180,1505,1506],{"class":190},"email",[180,1508,932],{"class":228},[180,1510,1511],{"class":925}," type",[180,1513,929],{"class":228},[180,1515,932],{"class":228},[180,1517,1506],{"class":190},[180,1519,932],{"class":228},[180,1521,1522],{"class":925}," placeholder",[180,1524,929],{"class":228},[180,1526,932],{"class":228},[180,1528,1529],{"class":190},"you@example.com",[180,1531,932],{"class":228},[180,1533,297],{"class":228},[180,1535,1537,1539,1541,1543,1545,1547,1550,1552,1554,1557,1559,1561],{"class":182,"line":1536},18,[180,1538,1004],{"class":228},[180,1540,568],{"class":235},[180,1542,1511],{"class":925},[180,1544,929],{"class":228},[180,1546,932],{"class":228},[180,1548,1549],{"class":190},"submit",[180,1551,932],{"class":228},[180,1553,1022],{"class":228},[180,1555,1556],{"class":224},"Login",[180,1558,313],{"class":228},[180,1560,568],{"class":235},[180,1562,297],{"class":228},[180,1564,1566,1568,1570],{"class":182,"line":1565},19,[180,1567,1045],{"class":228},[180,1569,1472],{"class":235},[180,1571,297],{"class":228},[180,1573,1575,1577,1579],{"class":182,"line":1574},20,[180,1576,313],{"class":228},[180,1578,294],{"class":235},[180,1580,297],{"class":228},[160,1582,1584],{"id":1583},"server-api-routes","Server API Routes",[156,1586,1587],{},"The module auto-registers these server routes:",[337,1589,1590,1602],{},[340,1591,1592],{},[343,1593,1594,1597,1600],{},[346,1595,1596],{},"Route",[346,1598,1599],{},"Method",[346,1601,512],{},[353,1603,1604,1617,1630,1642,1653],{},[343,1605,1606,1611,1614],{},[358,1607,1608],{},[177,1609,1610],{},"/api/login",[358,1612,1613],{},"POST",[358,1615,1616],{},"Initiate DDISA login flow",[343,1618,1619,1624,1627],{},[358,1620,1621],{},[177,1622,1623],{},"/api/callback",[358,1625,1626],{},"GET",[358,1628,1629],{},"Handle OAuth callback from IdP",[343,1631,1632,1637,1639],{},[358,1633,1634],{},[177,1635,1636],{},"/api/logout",[358,1638,1613],{},[358,1640,1641],{},"Destroy session",[343,1643,1644,1648,1650],{},[358,1645,1646],{},[177,1647,1177],{},[358,1649,1626],{},[358,1651,1652],{},"Return current user claims",[343,1654,1655,1660,1662],{},[358,1656,1657],{},[177,1658,1659],{},"/.well-known/sp-manifest.json",[358,1661,1626],{},[358,1663,1664],{},"SP metadata for IdP discovery",[160,1666,1668],{"id":1667},"configuration","Configuration",[156,1670,1671,1672,239],{},"Full configuration in ",[177,1673,201],{},[170,1675,1677],{"className":204,"code":1676,"language":206,"meta":175,"style":175},"export default defineNuxtConfig({\n  modules: ['@openape/nuxt-auth-sp'],\n  openapeSp: {\n    clientId: 'myapp.example.com',        // Your SP domain\n    spName: 'My App',                  // Display name\n    sessionSecret: '',                 // 32+ char secret (auto-generated in dev)\n    openapeUrl: '',                    // Direct IdP URL (bypasses DNS discovery)\n    fallbackIdpUrl: 'https://id.openape.at',  // Fallback when DNS has no record\n  },\n})\n",[177,1678,1679,1691,1709,1718,1739,1758,1773,1787,1805,1810],{"__ignoreMap":175},[180,1680,1681,1683,1685,1687,1689],{"class":182,"line":183},[180,1682,214],{"class":213},[180,1684,217],{"class":213},[180,1686,221],{"class":220},[180,1688,225],{"class":224},[180,1690,229],{"class":228},[180,1692,1693,1695,1697,1699,1701,1703,1705,1707],{"class":182,"line":232},[180,1694,236],{"class":235},[180,1696,239],{"class":228},[180,1698,242],{"class":224},[180,1700,245],{"class":228},[180,1702,154],{"class":190},[180,1704,245],{"class":228},[180,1706,252],{"class":224},[180,1708,255],{"class":228},[180,1710,1711,1714,1716],{"class":182,"line":258},[180,1712,1713],{"class":235},"  openapeSp",[180,1715,239],{"class":228},[180,1717,630],{"class":228},[180,1719,1720,1723,1725,1728,1731,1733,1735],{"class":182,"line":663},[180,1721,1722],{"class":235},"    clientId",[180,1724,239],{"class":228},[180,1726,1727],{"class":228}," '",[180,1729,1730],{"class":190},"myapp.example.com",[180,1732,245],{"class":228},[180,1734,835],{"class":228},[180,1736,1738],{"class":1737},"sHwdD","        // Your SP domain\n",[180,1740,1741,1744,1746,1748,1751,1753,1755],{"class":182,"line":678},[180,1742,1743],{"class":235},"    spName",[180,1745,239],{"class":228},[180,1747,1727],{"class":228},[180,1749,1750],{"class":190},"My App",[180,1752,245],{"class":228},[180,1754,835],{"class":228},[180,1756,1757],{"class":1737},"                  // Display name\n",[180,1759,1760,1763,1765,1768,1770],{"class":182,"line":693},[180,1761,1762],{"class":235},"    sessionSecret",[180,1764,239],{"class":228},[180,1766,1767],{"class":228}," ''",[180,1769,835],{"class":228},[180,1771,1772],{"class":1737},"                 // 32+ char secret (auto-generated in dev)\n",[180,1774,1775,1778,1780,1782,1784],{"class":182,"line":708},[180,1776,1777],{"class":235},"    openapeUrl",[180,1779,239],{"class":228},[180,1781,1767],{"class":228},[180,1783,835],{"class":228},[180,1785,1786],{"class":1737},"                    // Direct IdP URL (bypasses DNS discovery)\n",[180,1788,1789,1792,1794,1796,1798,1800,1802],{"class":182,"line":723},[180,1790,1791],{"class":235},"    fallbackIdpUrl",[180,1793,239],{"class":228},[180,1795,1727],{"class":228},[180,1797,387],{"class":190},[180,1799,245],{"class":228},[180,1801,835],{"class":228},[180,1803,1804],{"class":1737},"  // Fallback when DNS has no record\n",[180,1806,1807],{"class":182,"line":737},[180,1808,1809],{"class":228},"  },\n",[180,1811,1812,1814],{"class":182,"line":752},[180,1813,261],{"class":228},[180,1815,264],{"class":224},[156,1817,1818],{},"All options can be set via environment variables:",[337,1820,1821,1831],{},[340,1822,1823],{},[343,1824,1825,1828],{},[346,1826,1827],{},"Variable",[346,1829,1830],{},"Config Key",[353,1832,1833,1844,1856,1867,1879],{},[343,1834,1835,1840],{},[358,1836,1837],{},[177,1838,1839],{},"NUXT_OPENAPE_SP_CLIENT_ID",[358,1841,1842],{},[177,1843,274],{},[343,1845,1846,1851],{},[358,1847,1848],{},[177,1849,1850],{},"NUXT_OPENAPE_SP_SP_NAME",[358,1852,1853],{},[177,1854,1855],{},"spName",[343,1857,1858,1863],{},[358,1859,1860],{},[177,1861,1862],{},"NUXT_OPENAPE_SP_SESSION_SECRET",[358,1864,1865],{},[177,1866,270],{},[343,1868,1869,1874],{},[358,1870,1871],{},[177,1872,1873],{},"NUXT_OPENAPE_SP_OPENAPE_URL",[358,1875,1876],{},[177,1877,1878],{},"openapeUrl",[343,1880,1881,1886],{},[358,1882,1883],{},[177,1884,1885],{},"NUXT_OPENAPE_SP_FALLBACK_IDP_URL",[358,1887,1888],{},[177,1889,382],{},[160,1891,1893],{"id":1892},"production-deployment","Production Deployment",[156,1895,1896,1897,1900],{},"For production, you ",[865,1898,1899],{},"must"," set:",[1902,1903,1904,1912],"ol",{},[1905,1906,1907,1911],"li",{},[865,1908,1909],{},[177,1910,270],{}," — a random string of 32+ characters",[1905,1913,1914,1918,1919,1921],{},[865,1915,1916],{},[177,1917,274],{}," — your production domain (e.g. ",[177,1920,1730],{},")",[170,1923,1925],{"className":172,"code":1924,"language":174,"meta":175,"style":175},"NUXT_OPENAPE_SP_SESSION_SECRET=$(openssl rand -hex 32)\nNUXT_OPENAPE_SP_CLIENT_ID=myapp.example.com\n",[177,1926,1927,1948],{"__ignoreMap":175},[180,1928,1929,1931,1934,1937,1940,1943,1946],{"class":182,"line":183},[180,1930,1862],{"class":224},[180,1932,1933],{"class":228},"=$(",[180,1935,1936],{"class":186},"openssl",[180,1938,1939],{"class":190}," rand",[180,1941,1942],{"class":190}," -hex",[180,1944,1945],{"class":818}," 32",[180,1947,264],{"class":228},[180,1949,1950,1952,1954],{"class":182,"line":232},[180,1951,1839],{"class":224},[180,1953,929],{"class":228},[180,1955,1956],{"class":190},"myapp.example.com\n",[156,1958,1959],{},"The module logs warnings at startup if these are missing in production.",[165,1961,1963],{"id":1962},"nitro-configuration","Nitro Configuration",[156,1965,1966,1967,239],{},"For Vercel or other serverless deployments, add to ",[177,1968,201],{},[170,1970,1972],{"className":204,"code":1971,"language":206,"meta":175,"style":175},"export default defineNuxtConfig({\n  nitro: {\n    externals: {\n      inline: ['@openape/nuxt-auth-sp'],\n    },\n  },\n})\n",[177,1973,1974,1986,1995,2004,2023,2028,2032],{"__ignoreMap":175},[180,1975,1976,1978,1980,1982,1984],{"class":182,"line":183},[180,1977,214],{"class":213},[180,1979,217],{"class":213},[180,1981,221],{"class":220},[180,1983,225],{"class":224},[180,1985,229],{"class":228},[180,1987,1988,1991,1993],{"class":182,"line":232},[180,1989,1990],{"class":235},"  nitro",[180,1992,239],{"class":228},[180,1994,630],{"class":228},[180,1996,1997,2000,2002],{"class":182,"line":258},[180,1998,1999],{"class":235},"    externals",[180,2001,239],{"class":228},[180,2003,630],{"class":228},[180,2005,2006,2009,2011,2013,2015,2017,2019,2021],{"class":182,"line":663},[180,2007,2008],{"class":235},"      inline",[180,2010,239],{"class":228},[180,2012,242],{"class":224},[180,2014,245],{"class":228},[180,2016,154],{"class":190},[180,2018,245],{"class":228},[180,2020,252],{"class":224},[180,2022,255],{"class":228},[180,2024,2025],{"class":182,"line":678},[180,2026,2027],{"class":228},"    },\n",[180,2029,2030],{"class":182,"line":693},[180,2031,1809],{"class":228},[180,2033,2034,2036],{"class":182,"line":708},[180,2035,261],{"class":228},[180,2037,264],{"class":224},[2039,2040,2041],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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}",{"title":175,"searchDepth":258,"depth":232,"links":2043},[2044,2050,2051,2059,2063,2064,2065],{"id":162,"depth":232,"text":163,"children":2045},[2046,2047,2049],{"id":167,"depth":258,"text":168},{"id":197,"depth":258,"text":2048},"2. Add to nuxt.config.ts",{"id":278,"depth":258,"text":279},{"id":327,"depth":232,"text":328},{"id":401,"depth":232,"text":2052,"children":2053},"\u003COpenApeAuth /> Component",[2054,2055,2056,2057,2058],{"id":410,"depth":258,"text":411},{"id":496,"depth":258,"text":497},{"id":532,"depth":258,"text":533},{"id":605,"depth":258,"text":606},{"id":860,"depth":258,"text":861},{"id":1060,"depth":232,"text":2060,"children":2061},"useOpenApeAuth() Composable",[2062],{"id":1212,"depth":258,"text":1213},{"id":1583,"depth":232,"text":1584},{"id":1667,"depth":232,"text":1668},{"id":1892,"depth":232,"text":1893,"children":2066},[2067],{"id":1962,"depth":258,"text":1963},"Add OpenApe login to any Nuxt app in minutes.","md",null,{},{"title":85,"description":2068},"bw1Z_wD3AJeH1PuD6BW1sfo1CjcqyrVKgWR_jbaZzgg",[2075,2077],{"title":81,"path":82,"stem":83,"description":2076,"children":-1},"Human-in-the-loop permissions for agents.",{"title":94,"path":95,"stem":96,"description":2078,"children":-1},"NIS2, NIST CSF 2.0, and regulatory compliance.",1774221117377]