{"section":"authentication","format":"markdown","public":true,"content":"# Login og sikkerhed i apps på Agenter.dk\n\n## Identitet og adgang\nAgenter.dk bruger egen Better Auth-tjeneste. En fælles konto er en identitet, ikke automatisk adgang til platformen, organisationer eller apps. Kunder oprettet gennem en app får ikke automatisk platformadgang. Hver app har sit eget OIDC-client-id, medlemskab, active/blocked-status og rolle (viewer, member, admin). Alle medlemmer og agenter i en platformorganisation har fuld adgang inden for den organisation. Publicerede apps kan stadig have egne slutbrugerroller; de er adskilt fra platformens organisationsmedlemskab. En app-admin er ikke platformadministrator. Standarddata er brugeropdelt. Fælles data er sat på pause; foreslå ikke nye datasæt eller forbindelser. Eksisterende integrationer og data skal bevares.\n\n## Undersøg før du bygger\napps_get.authentication.readiness viser separat status for preview og live: registrering, callback-vært, valgt build og klargjort loginpreview. Følg nextAction ved manglende klargøring eller versionsforskel. provided-after-login beskriver platformens adapter efter rigtigt login; det er ikke en verificeret brugersession. Rå HTML-preview har ikke menneskeligt login. En agent-testadapter har isTest=true og kan ikke bevise menneskelig callback eller logout.\nLæs apps_get.authentication, environment og eksisterende frontend/API-kode. Variablernes configured betyder kun, at en værdi er gemt; det beviser hverken registreret OIDC-client, aktuel bygning, fungerende login eller korrekt adgangskontrol. Manglende metadata er ukendt, ikke en tilladelse til at åbne appen. Bevar importeret Clerk/anden loginudbyder, medmindre opgaven kræver migration. Slet ikke brugere, medlemskaber, loginopsætning eller eksisterende data for at få et build igennem.\n\n## Fælles loginlag og komponenter\nVælg loginmiljø under Brugere og login. Previewets fælles login kan gemmes før første udgivelse og før build. Efter et færdigt build: Klargør loginpreview → Åbn loginpreview. Ejeren og aktuelle organisationsmedlemmer har automatisk administratoradgang til preview med deres verificerede portalkonto; organisationens loginpolitik gælder stadig. Eksterne testbrugere kan inviteres, og ventende invitationer vises separat fra accepterede brugere. Preview har eget OIDC-client-id, egne eksterne medlemskaber, invitationer, sessioner og brugeridentiteter; koden bruger preview-databasen. Preview-adgang giver ikke adgang til den udgivne app. Åben registrering og MFA vælges separat. Et nyt build kræver ny klargøring, så frontend og API matcher. Udgivelse aktiveres ikke ved preview-login. Agentens syntetiske browser er stadig adskilt fra dette menneskelige login.\nEt medlem af appens organisation aktiverer Fælles loginlag under Opsætning → Brugere og login. Platformen registrerer de konkrete HTTPS-callbacks automatisk og bruger Authorization Code + PKCE S256, state, nonce og validerede OIDC-signaturer. Har appen et verificeret eget domæne, bruges det som loginadresse; platformens hostingadresse sender besøgende videre dertil. Det fælles login registrerer callbacks på én vært, så login og sessioncookie bruger samme adresse. Hele appen og API’et beskyttes. Login-tokens og refresh-tokens opbevares krypteret på serveren; browseren har kun en HttpOnly, Secure, SameSite-sessioncookie. Appkoden kører i en isoleret iframe og får ingen tokens eller CSRF-nøgler.\nHent apps_get med section=buildingBlocks (følg nextOffset til null). Læs apps_get.buildingBlocks og genbrug Agenter UI. window.appAuth.getSession()/getUser(), login(), logout() og account() leveres automatisk ved managed-login. Brug window.appApi.request('/endpoint', options) eller fetch('/api/endpoint'). Skriv ikke en egen callback- eller tokenadapter til fælles login. Wrapperfiler bruger Vue 3 Options API; registrér version og komponenter i app.json.agenterUI. Komponenter aktiverer aldrig adgang i sig selv. Appen ejer header, footer, navigation og profilside; loginlaget tilføjer ingen fast kontobjælke. Placér AgenterUserMenu i appen","offset":0,"totalCharacters":8712,"nextOffset":4000,"instruction":"Læs content og fortsæt med nextOffset som offset indtil nextOffset er null. Ingen lokal filadgang eller appId er nødvendig."}