[{"data":1,"prerenderedAt":523},["ShallowReactive",2],{"navigation":3,"\u002Fgetting-started\u002Ffor-service-providers":89,"\u002Fgetting-started\u002Ffor-service-providers-surround":518},[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":32,"body":91,"description":511,"extension":512,"links":513,"meta":514,"navigation":515,"path":33,"seo":516,"stem":34,"__hash__":517},"docs\u002F1.getting-started\u002F7.for-service-providers.md",{"type":92,"value":93,"toc":502},"minimark",[94,99,104,130,134,199,203,242,246,250,277,281,284,312,316,322,395,487,491,498],[95,96,98],"h1",{"id":97},"add-auth-to-your-app-in-3-steps","Add Auth to Your App in 3 Steps",[100,101,103],"h2",{"id":102},"step-1-install","Step 1 — Install",[105,106,111],"pre",{"className":107,"code":108,"language":109,"meta":110,"style":110},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add @openape\u002Fnuxt-auth-sp\n","bash","",[112,113,114],"code",{"__ignoreMap":110},[115,116,119,123,127],"span",{"class":117,"line":118},"line",1,[115,120,122],{"class":121},"sBMFI","pnpm",[115,124,126],{"class":125},"sfazB"," add",[115,128,129],{"class":125}," @openape\u002Fnuxt-auth-sp\n",[100,131,133],{"id":132},"step-2-register-the-module","Step 2 — Register the Module",[105,135,140],{"className":136,"code":137,"filename":138,"language":139,"meta":110,"style":110},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: ['@openape\u002Fnuxt-auth-sp'],\n})\n","nuxt.config.ts","ts",[112,141,142,163,190],{"__ignoreMap":110},[115,143,144,148,151,155,159],{"class":117,"line":118},[115,145,147],{"class":146},"s7zQu","export",[115,149,150],{"class":146}," default",[115,152,154],{"class":153},"s2Zo4"," defineNuxtConfig",[115,156,158],{"class":157},"sTEyZ","(",[115,160,162],{"class":161},"sMK4o","{\n",[115,164,166,170,173,176,179,182,184,187],{"class":117,"line":165},2,[115,167,169],{"class":168},"swJcz","  modules",[115,171,172],{"class":161},":",[115,174,175],{"class":157}," [",[115,177,178],{"class":161},"'",[115,180,181],{"class":125},"@openape\u002Fnuxt-auth-sp",[115,183,178],{"class":161},[115,185,186],{"class":157},"]",[115,188,189],{"class":161},",\n",[115,191,193,196],{"class":117,"line":192},3,[115,194,195],{"class":161},"}",[115,197,198],{"class":157},")\n",[100,200,202],{"id":201},"step-3-add-the-login-component","Step 3 — Add the Login Component",[105,204,209],{"className":205,"code":206,"filename":207,"language":208,"meta":110,"style":110},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Ctemplate>\n  \u003COpenApeAuth \u002F>\n\u003C\u002Ftemplate>\n","pages\u002Flogin.vue","vue",[112,210,211,222,233],{"__ignoreMap":110},[115,212,213,216,219],{"class":117,"line":118},[115,214,215],{"class":161},"\u003C",[115,217,218],{"class":168},"template",[115,220,221],{"class":161},">\n",[115,223,224,227,230],{"class":117,"line":165},[115,225,226],{"class":161},"  \u003C",[115,228,229],{"class":168},"OpenApeAuth",[115,231,232],{"class":161}," \u002F>\n",[115,234,235,238,240],{"class":117,"line":192},[115,236,237],{"class":161},"\u003C\u002F",[115,239,218],{"class":168},[115,241,221],{"class":161},[243,244,245],"p",{},"That's it. Your app now supports passwordless login via the DDISA protocol.",[100,247,249],{"id":248},"it-just-works","It Just Works",[251,252,253,265,271],"ul",{},[254,255,256,260,261,264],"li",{},[257,258,259],"strong",{},"Zero config in development"," — session secrets are auto-generated, ",[112,262,263],{},"clientId"," is derived from your dev server port",[254,266,267,270],{},[257,268,269],{},"Humans and agents use the same protocol"," — no special API keys, no separate bot accounts",[254,272,273,276],{},[257,274,275],{},"No vendor lock-in"," — DDISA is an open protocol based on DNS discovery, WebAuthn, and standard OAuth flows",[100,278,280],{"id":279},"what-about-the-idp","What About the IdP?",[243,282,283],{},"You don't need to run an Identity Provider. Your users authenticate at their own IdP, discovered automatically via DNS.",[251,285,286,301,309],{},[254,287,288,289,292,293,300],{},"No DNS record for a user's domain? The ",[257,290,291],{},"fallback IdP"," (",[294,295,299],"a",{"href":296,"rel":297},"https:\u002F\u002Fid.openape.ai",[298],"nofollow","id.openape.ai",") handles it — free, zero-setup",[254,302,303,304],{},"Users who want full control can run their own IdP with ",[294,305,306],{"href":25},[112,307,308],{},"@openape\u002Fnuxt-auth-idp",[254,310,311],{},"DNS discovery happens transparently — your app doesn't need to know where users authenticate",[100,313,315],{"id":314},"production-checklist","Production Checklist",[243,317,318,319,321],{},"Before deploying, set these values (via ",[112,320,138],{}," or environment variables):",[323,324,325,341],"table",{},[326,327,328],"thead",{},[329,330,331,335,338],"tr",{},[332,333,334],"th",{},"Setting",[332,336,337],{},"Env Variable",[332,339,340],{},"Description",[342,343,344,363,378],"tbody",{},[329,345,346,351,356],{},[347,348,349],"td",{},[112,350,263],{},[347,352,353],{},[112,354,355],{},"NUXT_OPENAPE_SP_CLIENT_ID",[347,357,358,359,362],{},"Your service identifier (e.g. ",[112,360,361],{},"myapp.example.com",")",[329,364,365,370,375],{},[347,366,367],{},[112,368,369],{},"sessionSecret",[347,371,372],{},[112,373,374],{},"NUXT_OPENAPE_SP_SESSION_SECRET",[347,376,377],{},"A random string, at least 32 characters",[329,379,380,385,388],{},[347,381,382],{},[112,383,384],{},"spName",[347,386,387],{},"—",[347,389,390,391,394],{},"Human-readable name (shown in ",[112,392,393],{},"auth.md"," and SP manifest)",[105,396,398],{"className":136,"code":397,"filename":138,"language":139,"meta":110,"style":110},"export default defineNuxtConfig({\n  modules: ['@openape\u002Fnuxt-auth-sp'],\n  openapeSp: {\n    clientId: 'myapp.example.com',\n    spName: 'My App',\n  },\n})\n",[112,399,400,412,430,440,457,474,480],{"__ignoreMap":110},[115,401,402,404,406,408,410],{"class":117,"line":118},[115,403,147],{"class":146},[115,405,150],{"class":146},[115,407,154],{"class":153},[115,409,158],{"class":157},[115,411,162],{"class":161},[115,413,414,416,418,420,422,424,426,428],{"class":117,"line":165},[115,415,169],{"class":168},[115,417,172],{"class":161},[115,419,175],{"class":157},[115,421,178],{"class":161},[115,423,181],{"class":125},[115,425,178],{"class":161},[115,427,186],{"class":157},[115,429,189],{"class":161},[115,431,432,435,437],{"class":117,"line":192},[115,433,434],{"class":168},"  openapeSp",[115,436,172],{"class":161},[115,438,439],{"class":161}," {\n",[115,441,443,446,448,451,453,455],{"class":117,"line":442},4,[115,444,445],{"class":168},"    clientId",[115,447,172],{"class":161},[115,449,450],{"class":161}," '",[115,452,361],{"class":125},[115,454,178],{"class":161},[115,456,189],{"class":161},[115,458,460,463,465,467,470,472],{"class":117,"line":459},5,[115,461,462],{"class":168},"    spName",[115,464,172],{"class":161},[115,466,450],{"class":161},[115,468,469],{"class":125},"My App",[115,471,178],{"class":161},[115,473,189],{"class":161},[115,475,477],{"class":117,"line":476},6,[115,478,479],{"class":161},"  },\n",[115,481,483,485],{"class":117,"line":482},7,[115,484,195],{"class":161},[115,486,198],{"class":157},[100,488,490],{"id":489},"for-ai-agents","For AI Agents",[243,492,493,494,497],{},"Every SP automatically serves ",[112,495,496],{},"\u002F.well-known\u002Fauth.md"," — a machine-readable Markdown document that describes how to authenticate. Agents can fetch this endpoint to discover the login flow, endpoints, and protocol details without any prior configuration.",[499,500,501],"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}",{"title":110,"searchDepth":118,"depth":165,"links":503},[504,505,506,507,508,509,510],{"id":102,"depth":165,"text":103},{"id":132,"depth":165,"text":133},{"id":201,"depth":165,"text":202},{"id":248,"depth":165,"text":249},{"id":279,"depth":165,"text":280},{"id":314,"depth":165,"text":315},{"id":489,"depth":165,"text":490},"Add authentication to your Nuxt app in 3 steps.","md",null,{},true,{"title":32,"description":511},"zrB84F6AOwRZIx7OUt8b_VrFFgF3y3jLPgU-yN5dKLU",[519,521],{"title":28,"path":29,"stem":30,"description":520,"children":-1},"The DDISA login flow and grant system explained.",{"title":36,"path":37,"stem":38,"description":522,"children":-1},"Install and use the apes command-line interface and the ape-shell wrapper.",1776885317056]