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