← FAQ
FAQ

API van de profielserver

FAQ › Profielserver › API · English

Wat is het?

De profielserver (server/profile, axum) beantwoordt HTTP-verzoeken van vier soorten clients:

  1. De EUZOS-pc (de kernel): een regelprotocol in platte tekst (regels sleutel=waarde, de eerste regel een statuswoord), met een ondertekend profiel.
  2. De EUZOS-app op de telefoon: JSON onder /api/app/v2/, met bearer-tokens.
  3. Werkplekservers (EUZOS Server): het regelprotocol onder /api/workplace/v1/.
  4. Agents en beheerders: JSON-agent-API's voor DriverEnricher en BrowserFeedback (beheersleutel), HTML-pagina's (de webterugval, het registreren, de beheerpagina).

Daarnaast controleert de downloadserver download.euzos.eu (server/download) downloadtokens voor Caddy.

Elke route heeft een Engels pad. De oude Nederlandse paden (van vóór 27-10-2026) worden nog bediend door server/profile/src/legacy.rs, met hun precieze oude draadformaat, omdat productie-pc's, werkplekservers en de telefoon-app ze nog aanroepen.

Hoe doe ik…?

…de handler bij een pad vinden?

De router is euzos_profileserver::router in server/profile/src/lib.rs; hij voegt admin_page::router() (admin_page/mod.rs) en legacy::router() (legacy.rs) samen. De tabellen hieronder geven bij elke route de handler als crate::module::fn.

…de API vanaf een pc aanroepen?

Gebruik het regelprotocol: GET/POST met ?token=<pc-token> (64 hex) waar nodig, een text/plain-body met regels sleutel=waarde, en lees de eerste regel van het antwoord (ok, fout, wacht, verlopen, afgemeld, …). De pc krijgt eerst een pc-token door in te loggen (QR-code via /api/session/{id}, of /api/pc/login, /api/pc/entra, /api/pc/reconnect).

…de API vanuit de app aanroepen?

Stuur JSON met Authorization: Bearer <token>: een eza_…-token uit POST /api/app/v2/sign-in (aanmelden met wachtwoord, 15 minuten, in het geheugen) om een telefoon te koppelen en apparaten te beheren, of een ezd_…-apparaattoken uit het koppelen (geldig tot het ingetrokken wordt) om inlogverzoeken te bekijken en te bevestigen en pc's af te melden.

…de agent-API's gebruiken?

Zet admin_token_file in de configuratie en stuur dan Authorization: Bearer <beheersleutel> naar /api/driverenricher/v2/… of /api/browserfeedback/v2/…. Zonder dat bestand geven deze API's 404.

…weten of een functie uitgeschakeld is?

Veel routes geven 404 (fout\nonbekend pad\n) als hun functie in de configuratie uit staat: /api/pc/login (pc_password = no), /api/pc/entra (geen entra_client_id), de kluis (geen vault_key_file), /api/apps/token (geen download_key_file), meldingseindpunten (reports = no), agent-API's (geen admin_token_file), /beheer (admin_page = no).

Details

Het regelprotocol van de pc

  • Content type text/plain; charset=utf-8.
  • Eerste regel: het statuswoord. ok (gelukt), fout (fout, gevolgd door een tekstregel of reden=<code>), wacht (wacht op de telefoon), verlopen (met reden=), afgemeld (met reden=), beschikbaar / niet_beschikbaar (appcatalogus).
  • Daarna regels sleutel=waarde. Onbekende sleutels slaan beide kanten over; een bekende sleutel twee keer is een fout.
  • De statuswoorden, sleutels, namen van queryparameters (pc=, voorkeur=, intrekken=, token=) en waarden zijn hetzelfde op de Engelse en de oude routes en blijven Nederlands: het is een draadformaat dat de kernel controleert.
  • Fouten van deze eindpunten hebben de vorm fout\nreden=<code>\n (enkele oudere fout\n<tekst>\n), met codes zoals te_vaak (+ wacht=<s>), ongeldig, te_groot, database, druk, onjuist, andere_site.

Het ondertekende profiel

Na een geslaagde login (QR-goedkeuring, wachtwoord, Microsoft, herverbinden) krijgt de pc, in deze volgorde: ok, versie=2 (versie=1 voor het oude 8.5-formaat zonder pc-geheim), omgeving=, server=, sessie=, pc= (hash van het pc-geheim), soort= (zakelijk/prive), naam= (het e-mailadres), weergavenaam=, kleur= (6 hex), taal=, de instellingsregels (zie hieronder), eventueel beheer= (beheerbeleid), item=-regels (bestanden), eventueel methode=wachtwoord|microsoft, eventueel de offline-regels (offline-dagen=, offline-token=, account=), token= (het pc-token, 64 hex), uitgegeven=, verloopt=, sleutel-id=, en als laatste handtekening= (Ed25519). Alles vóór handtekening= is ondertekend met het voorvoegsel EUZOS-profiel-v2\0 (pc::profile_response_with). De pc controleert het met de publieke sleutel uit \EOS\FW\PROFILE.TXT (key=, oud sleutel=).

item=-regels: item=<map|bestand>\t<naam>\t<aantal>\t<wanneer> (hoogstens 64).

Instellingen die de pc terugschrijft

POST /api/profile/settings neemt regels sleutel=waarde uit een toegestane lijst (settings.rs), bijvoorbeeld balk=boven|onder, thema=donker|licht|automatisch, toetsenbord=…, schermtoetsenbord=…, opties voor touchpad, muis en aanraken, screensaver=, screensaver-wachttijd=, vergrendelen=, recent=, taal=, kleur=, browser-zoekmachine=, browser-favoriet=, browser-engine=euzos|chromium, browser-site=, mail-account=. De sleutels en waarden blijven Nederlands (pc-protocol), behalve screensaver-animatie=, dat logo|aurora|stars|clock neemt (de oude sterren|klok worden nog geaccepteerd). Ze komen ondertekend terug in het volgende profiel. Nooit een wachtwoord of token.

JSON (app en agents)

  • Fouten van de app: {"error": "<tekst>"} of {"error": "<tekst>", "code": "<code>"} met codes zoals te_vaak, onjuist, niet_aangemeld, verlopen, intern, en de statuscodes van het account bij 403.
  • Op de oude routes (/api/app/v1/…, de agentpaden zonder versie) hernoemt een middleware (legacy::translate) de JSON-veldnamen en queryparameters: Nederlands → Engels in het verzoek, Engels → Nederlands in het antwoord. Waarden (codes, statussen, teksten) worden niet vertaald.

Ondertekende berichten

BerichtOndertekend doorRegels
EUZOS-koppelen-v1 (koppelen)chipsleutel van de telefoon (ECDSA P-256)omgeving=, server=, gebruiker=, uitdaging=, sleutel= (SHA-256 van de publieke sleutel)
EUZOS-inloggen-v1 (pc-login)chipsleutel van de telefoonomgeving=, server=, sessie=, pc=, pcip=, profiel=, tijd=, uitdaging=, apparaat=
EUZOS-beheer-v1 (login op de beheerpagina)chipsleutel van de telefoonomgeving=, server=, sessie=, beheerip=, gebruiker=, tijd=, uitdaging=, apparaat=
EUZOS-koppelcode-v1— (hash)de 6-cijferige code die pc en telefoon allebei tonen: SHA-256 over het voorvoegsel, de sessie-id en de hash van het pc-geheim
EUZOS-profiel-v2ondertekensleutel van de server (Ed25519)het ondertekende profiel hierboven
EUZOS-werkplek-aanmelden-v1werkpleksleutel (Ed25519)omgeving=, server=, sleutel=, uitdaging=, tijd=, lan=, tls=, naam=, handtekening=
EUZOS-downloadtoken-v1downloadsleutel (Ed25519)het token ezdl1.<kid>.<app>.<versie>.<exp>.<jti>.<account>.<handtekening>

Voorvoegsels van tokens

eza_ (aanmelden in de app met wachtwoord), ezd_ (gekoppelde telefoon), eze_ (werkplekserver, 1 uur, alleen in het geheugen), ezdl1. (downloadtoken, 2 uur); het pc-token is 64 hex zonder voorvoegsel.

Gemeenschappelijke beveiliging

  • Grootte van de body: standaard 16 KiB; instellingen 2 × 48 KiB; BrowserFeedback-meldingen iets meer dan 512 KB (de handler leest zelf); de bureaubladachtergrond 1 MiB (de handler leest zelf; een te grote Content-Length wordt geweigerd vóór het lezen).
  • CSRF (lib::same_site): elk verzoek anders dan GET/HEAD/OPTIONS met Sec-Fetch-Site anders dan same-origin/none, of een vreemde Origin, wordt geweigerd met 403 fout\nreden=andere_site\n. De pc en de app sturen geen van beide headers.
  • Antwoordheaders (lib::security): Cache-Control: no-store, Referrer-Policy: no-referrer, X-Content-Type-Options: nosniff, X-Frame-Options: DENY, Server: euzos-profielserver.
  • IP van de client: achter Caddy telt het laatste adres van X-Forwarded-For, alleen vanaf localhost en alleen met de proxygeheim-header X-Euzos-Proxy.
  • Poort van het beheerdomein (admin_page::gate): op het beheerdomein bestaan alleen /beheer…, /b/<id> en /.well-known/… (/ stuurt door naar /beheer); op het profieldomein stuurt /beheer… tot 26-10-2027 door (308) naar het beheerdomein, daarna 404.
  • Onbekend pad: 404 fout\nonbekend pad\n.

Grenzen (de belangrijkste)

Grenzen gelden per netwerk (IPv4-adres, IPv6 /64, en IPv6 /48 met 4×) plus per token/account/pc. Daarboven volgt 429.

GebiedGrens (uit de code)
Sessiepolls60/min per pc (sessie + pc-geheim, of pc-token), 1200/min per netwerk; lopende sessies hoogstens 60 per netwerk, 10.000 in totaal (harde grens 20.000)
Instellingen30 per 5 minuten per pc-token
Pc-login met wachtwoordper account en per pc: 3 vrije pogingen, blokkade na 10; per netwerk 10/30; per /48 40/120; oplopende wachttijd, blokkade 15 min (tot 4 u)
Aanmelden in de app10 mislukte per 15 minuten per IP en per gebruikersnaam
Kluis30 per 5 minuten per pc-token, 60 per account
Appcatalogus30/min per netwerk
Downloadtokens20/uur per account, 60/uur per netwerk
Entra-login30/min per netwerk
Offline herverbinden120/min per netwerk, 10 per token
Werkplek30/min per netwerk voor uitdaging/aanmelden; 30 downloadtokens/uur per werkplek; 120 beheerbewijzen/uur per account; registratie 10/min per netwerk en 10/uur per account
Login op de beheerpagina10 per netwerk en 5 per account per 15 minuten
Mail1/min en 5/dag per adres; 200/uur in totaal

Naslag

Kolommen: Methode, Pad (Engels), Oud pad (Nederlands, bediend door legacy.rs; "—" = hetzelfde pad of geen), Toegang, Verzoek, Antwoord, Handler (euzos_profileserver::…).

Pc-login en sessie (regelprotocol)

MethodePadOud padToegangVerzoekAntwoordHandler
GET/api/session/{id}/api/sessie/{id}pc-geheim (?pc=<32 hex>), sessie gebonden aan het IP van de pc{id} 32 hex; query pc=, voorkeur=zakelijk|prive, intrekken=1 (QR-wissel)wacht + code=<6 cijfers> [+ gezien=1]; verlopen + reden= (ingetrokken, gebruikt, geen profiel, …); of één keer het ondertekende profiel. Fouten: 400, 403 andere pc, 429, 503pc::session
GET/api/files/api/bestandenpc-token (?token=)—ok + item=-regels; 401 ongeldig tokenpc::files
GET/api/status— (hetzelfde)pc-token—ok + verloopt=<unix>; of afgemeld + reden= (onbekend, afgemeld, verlopen); 503 bij een databasefout (nooit afgemeld). Start ook de Entra-hercontrole.pc::status
GET/api/logout/api/afmeldenpc-token—altijd okpc::logout
POST/api/pc/login/api/pc/inloggengeen (afgeremd); uit met pc_password = noregels email=, wachtwoord=, sessie=, pc= (32 hex), pc-id= (32 hex), voorkeur= (optioneel)ondertekend profiel met methode=wachtwoord (+ offline-regels); fouten reden=ongeldig, te_vaak (+wacht=), onjuist (401), account + status=<code> (403), geen_profiel (403), te_groot, druk, databasepc_login::login
POST/api/pc/entra— (hetzelfde)ID-token van Microsoft; uit zonder entra_client_idregels id_token=, sessie=, pc=, pc-id=, nonce= (optioneel), taal= (optioneel)ondertekend profiel met methode=microsoft; fouten reden=ongeldig, te_groot, te_vaak, token, verlopen, sleutels, tenant, domein, account, drukentra::login
POST/api/pc/reconnect/api/pc/herverbindoffline-tokenregels offline-token= (64 hex), sessie=, pc=nieuw ondertekend profiel (nieuw herverbindtoken); 403 reden= ingetrokken, verlopen, geblokkeerd, gewist, uit, onbekend (de pc meldt af en wist zijn offline-kluisje); 400, 413, 429, 503offline::reconnect
POST/api/pc/register/api/pc/registreergeen; alleen met registration_openregels email=, wachtwoord=, voornaam=, achternaam=, woonplaats= (alle verplicht), taal=nl|en (optioneel)201 ok + email=<adres> (altijd, geen enumeratie); 400 reden=ongeldig|email_ongeldig|wachtwoord_kort; 403 gesloten; 413; 429 te_vaak; 503 drukpc_registration::register
POST/api/pc/verify/api/pc/verifieergeenregels email=, code= (6 cijfers), wachtwoord=200 ok; 400 code_onjuist; 401 wachtwoord_onjuist; 409 email_in_gebruik; 429; 503pc_registration::verify
POST/api/pc/resend/api/pc/opnieuwgeenregel email=altijd 200 ok; 400 ongeldig; 429 te_vaakpc_registration::resend
GET/api/preference/{id}/api/voorkeur/{id}geensessie-idéén regel: zakelijk, prive of leeg (de knop die op de pc gekozen is; voor de webpagina)web::preference

Instellingen en kluis (pc-token)

MethodePadOud padToegangVerzoekAntwoordHandler
POST/api/profile/settings/api/profiel/instellingenpc-tokeninstellingsregels sleutel=waarde (toegestane lijst)ok; 400 fout\n<reden>; 401; 413 te groot; 429; 503pc::settings
GET/api/profile/background—pc-token; uit zonder vault_key_file—ok + id=, size=, changed= als dit profiel een afbeelding heeftbackground::info
PUT/api/profile/background/{id}—pc-tokende door de pc verzegelde blob (hooguit 1 MiB)ok; 400 reason=invalid, 401, 404, 408, 409 reason=not_current (niet het id van desktop-background=), 413 reason=too_large (vóór het lezen), 429, 503background::put
GET/api/profile/background/{id}—pc-token—200 de blob als application/octet-stream, of 204 nietsbackground::fetch
DELETE/api/profile/background—pc-token—ok (ook als er niets was)background::delete
GET/api/vault/api/kluispc-token; uit zonder vault_key_file—ok + soort=<soort> per geheim (geen inhoud)vault::list
PUT/api/vault/{kind}/api/kluis/{kind}pc-tokenruwe bytes = het geheimok; 400, 401, 403 (opslag-sleutel alleen door de server), 404, 409 (te veel, of lager: een lagere generatie), 413, 429, 503vault::set
GET/api/vault/{kind}/api/kluis/{kind}pc-token—200 geheim als application/octet-stream, of 204 niets; opslag-sleutel wordt bij de eerste keer gemaaktvault::fetch
DELETE/api/vault/{kind}/api/kluis/{kind}pc-token—ok (ook als er niets was); voor opslag-sleutel is dit crypto-shredding; sinds 28-10-2026 403 voor opslag-sleutel met een pc-token (PS-15)vault::delete_secret

Kluissoorten (toegestane lijst, draadwaarden): opslag-sleutel (opslagsleutel, 32 bytes, door de server gemaakt), ms-refresh:<32 hex> (een Microsoft-refreshtoken), opslag-versie:<32 hex> (generatie van een profielmap, 8 bytes, gaat alleen omhoog). Hoogstens 9 geheimen per gebruiker en profielsoort, elk 8 KiB; AEAD ChaCha20-Poly1305 onder de serversleutel.

Apps en downloadtokens

MethodePadOud padToegangVerzoekAntwoordHandler
GET/api/apps— (hetzelfde)geen (openbaar)—ok, dan per app naam=, versie=, grootte=, sha256=, beschrijving=<url> (1–4), pakket=<url> (0–4); downloadbasis=<url> als tokens aan staan; regels werkplek=/werkplek-tls= voor pc's in het netwerk van een werkplekserverapps::list
GET/api/apps/{name}— (hetzelfde)geenappnaambeschikbaar + de regels van de app, of niet_beschikbaar + de naam (altijd 200)apps::one
POST/api/apps/token— (hetzelfde)pc-token; uit zonder download_key_fileregels app=, versie= (moet de catalogusversie zijn)ok, token=ezdl1.…, verloopt=<unix>, duur=<s>download_token::fetch

Werkplekservers (regelprotocol)

MethodePadOud padToegangVerzoekAntwoordHandler
POST/api/workplace/v1/challenge/api/werkplek/v1/uitdaginggeregistreerde werkpleksleutelsleutel=<64 hex>ok, uitdaging= (60 s, eenmalig)workplace::challenge
POST/api/workplace/v1/sign-in/api/werkplek/v1/aanmeldenhandtekening met de werkpleksleutelhet ondertekende bericht EUZOS-werkplek-aanmelden-v1 (zie boven)ok, werkplek=<id>, token=eze_… (1 uur), verloopt=, servertijd=, downloadsleutel=<kid> <hex> (als tokens aan staan), organisatie= (als gezet)workplace::sign_in
POST/api/workplace/v1/download-token/api/werkplek/v1/downloadtoken?token=eze_…app=, versie=zoals /api/apps/tokenworkplace::download_token
POST/api/workplace/v1/admin-proof/api/werkplek/v1/beheerbewijspc-token van een beheerder; geregistreerde pc; dezelfde organisatiewerkplek=<id>, pcsleutel=<64 hex>ok, naam=, lan=, tls=, dan de regels van het bewijs en handtekening= (10 minuten geldig). Fouten: 404 werkplek_onbekend/pc_onbekend; 403 werkplek_ingetrokken, werkplek_zonder_organisatie, pc_ingetrokken, andere_organisatie, geen_beheerder; 429workplace_admin::proof
GET/api/workplace/v1/admin-list/api/werkplek/v1/beheerlijstpc-token—ok, dan per server werkplek=<id>\t<naam>\t<lan>\t<actief|niet actief>\t<geïnstalleerd door>\t<datum>\t<extern adres>workplace_admin::list
POST/api/workplace/v1/register/api/werkplek/v1/registreerpc-token van een beheerder (uit het serverinstallatieprogramma)sleutel=<64 hex>, naam=, organisatie=<id> (alleen bij meer dan één), extern=<adres> (optioneel)ok, werkplek=<id>, organisatie=<id>, organisatie_naam=; fouten 401 token, 403 geen_beheerder, 409 kies_organisatie (+ regels organisatie=<id>\t<naam>; sinds 28-10-2026 niet voor een serverbeheerder: geregistreerd zonder organisatie, organisatie= leeg + organisatie_kiezen=1), 409 al_geregistreerd, 400 ongeldig, 429 te_vaakworkplace_registration::register

Meldingen: DriverEnricher en BrowserFeedback

MethodePadOud padToegangVerzoekAntwoordHandler
POST/api/driverenricher/report/api/driverenricher/meldingpc-token; uit met reports = nomelding in het regelformaat van DriverEnricher (hoogstens 64 KiB, 128 apparaten; gelezen met euzos_driverenricher::read)ok, nieuw=<n>, apparaten=<n>; 400, 401, 404, 408, 413, 429, 503driverenricher::report
GET/api/driverenricher/v2/list/api/driverenricher/lijstbeheersleutelquery status=, max=JSON-lijst devices (meeste pc's eerst)driverenricher::list
GET/api/driverenricher/v2/device/{id}/api/driverenricher/apparaat/{id}beheersleutel—JSON van één apparaat, met voorbeeld, modellen, after_driver; vrije tekst onder report_text met "source": "onbetrouwbaar"driverenricher::device
POST/api/driverenricher/v2/device/{id}/status/api/driverenricher/apparaat/{id}/statusbeheersleutelJSON {"status": "nieuw|in_behandeling|driver|niet_ondersteund", "version": "v150", "notes": "…"} (version verplicht bij driver)het bijgewerkte apparaatdriverenricher::status
POST/api/browserfeedback/report/api/browserfeedback/meldingpc-token; uit met reports = nokop in regelformaat plus een optionele PNG (≤ 512 KB) (euzos_browserfeedback::read)ok, id=<nummer>browserfeedback::report
GET/api/browserfeedback/v2/list/api/browserfeedback/lijstbeheersleutelquery status=, category= (oud categorie=), max=JSON reports (nieuwste eerst, zonder schermafbeelding)browserfeedback::list
GET/api/browserfeedback/v2/{id}/api/browserfeedback/{id}beheersleutel—JSON van één melding, met image_png_base64 als die er is; address_publicbrowserfeedback::details
GET/api/browserfeedback/v2/{id}/image.png/api/browserfeedback/{id}/afbeelding.pngbeheersleutel—de PNG; 404 als er geen isbrowserfeedback::image
POST/api/browserfeedback/v2/{id}/status/api/browserfeedback/{id}/statusbeheersleutelJSON {"status": "nieuw|in_behandeling|opgelost|niet_op_te_lossen|dubbel", "version": "0.6.1", "notes": "…"} (version verplicht bij opgelost)de bijgewerkte meldingbrowserfeedback::status

JSON-veldnamen van de agents (Engels / oud Nederlands): error/fout, notice/let_op, devices/apparaten, reports/meldingen, report_text/melding_tekst, source/bron, description/omschrijving, sample/voorbeeld, samples/voorbeelden, models/modellen, after_driver/na_driver, id, key/sleutel, kind/soort, pcs, accounts, first/eerste, last/laatste, last_build/laatste_build, status, version/versie, notes/notities, changed/gewijzigd, max, pc, account, time/tijd, build, arch, browser, language/taal, address/adres, address_public/adres_publiek, complete/volledig, category/categorie, viewport_w/viewport_b, viewport_h, zoom, http_status, load_time/laadtijd, render_time/opmaaktijd, bytes, comment/opmerking, errors/fouten, has_image/heeft_afbeelding, image_bytes/afbeelding_bytes, image_png_base64/afbeelding_png_base64 (legacy::AGENT). Dit is de hernoemtabel van de legacy-middleware, geen schema per antwoord; welke van deze velden een bepaald antwoord heeft: (te controleren) per handler.

Telefoon-app (JSON, /api/app/v2/)

MethodePadOud padToegangVerzoekAntwoordHandler
GET/api/app/v2/server/api/app/v1/servergeen—environment, server, key_id, public_key, web_fallback, registration_openapp::server
POST/api/app/v2/sign-in/api/app/v1/aanmeldengeen (afgeremd)user (e-mail; email ook geaccepteerd), passwordtoken (eza_…), expires, user, challenge, environment, server; 401 onjuist, 403 statuscode, 429 te_vaakapp::sign_in
POST/api/app/v2/logout/api/app/v1/afmeldeneza_ (vergeet die aanmelding)—ok (altijd)app::logout
POST/api/app/v2/register/api/app/v1/registreergeen; alleen met registration_openuser (of email), password, display_name?, language?, first_name?, last_name?, city?201 user, status: "niet_geverifieerd"app::register
POST/api/app/v2/verify/api/app/v1/verifieergeen{email, code, password} of {token, password}ok, userapp::verify
POST/api/app/v2/verify/resend/api/app/v1/verifieer/opnieuwgeenemail (of user)ok (altijd)app::verify_resend
POST/api/app/v2/email/api/app/v1/emaileza_newok (mail naar het nieuwe adres)app::email_change
POST/api/app/v2/devices/challenge/api/app/v1/apparaten/uitdagingeza_—challenge (nieuwe koppeluitdaging)app::pair_challenge
POST/api/app/v2/devices/api/app/v1/apparateneza_name, platform (ios|android), public_key (base64 P-256), signature (base64, over EUZOS-koppelen-v1), attestation? (base64, ≤ 8 KiB)201 device, device_token (ezd_…), environment, server; hoogstens 10 apparatenapp::pair
GET/api/app/v2/devices/api/app/v1/apparateneza_ of ezd_—devices: [{device, name, platform, created, last, revoked, this_device}]app::devices
DELETE/api/app/v2/devices/{id}/api/app/v1/apparaten/{id}eza_ (elk eigen apparaat) of ezd_ (alleen zichzelf: ontkoppelen)—okapp::revoke
GET/api/app/v2/session/{id}/api/app/v1/sessie/{id}ezd_—session, environment, server, pc, pc_ip, phone_ip, same_network, code, preference, created, expires, challenge, device, user, profiles [{kind, name, display_name, color}]; 410 verlopenapp::session
POST/api/app/v2/session/{id}/confirm/api/app/v1/sessie/{id}/bevestigezd_ + chiphandtekeningprofile, time, signature (base64, over EUZOS-inloggen-v1)ok, pc_ip, profileapp::confirm
POST/api/app/v2/session/{id}/reject/api/app/v1/sessie/{id}/weigerezd_—okapp::reject
GET/api/app/v2/pc-sessions/api/app/v1/pcsessieseza_ of ezd_—pc_sessions: [{ref, kind, pc_ip, device, created, expires, logged_out, method}]app::pc_sessions
POST/api/app/v2/pc-sessions/{ref}/logout/api/app/v1/pcsessies/{ref}/afmeldeneza_ of ezd_—ok (die pc op afstand afmelden; trekt ook zijn offline-kluisje in)app::pc_logout
POST/api/app/v2/vault/wipe—eza_ (aangemeld met wachtwoord){email?, profile?, confirm}{ok, deleted}: de kluis (ook opslag-sleutel) van één profiel of beide wissen; alleen de eigenaar of een beheerder van de organisatie van het account; 400 bevestig/ongeldig, 401, 403 geen_recht, 404 (kluis uit), 429vault::wipe_vault
GET/api/app/v2/admin/{id}/api/app/v1/beheer/{id}ezd_—kind: "beheer", session, environment, server, user, admin_ip, phone_ip, same_network, text, code, created, expires, challenge, device; 410 verlopenadmin_page::app::request
POST/api/app/v2/admin/{id}/confirm/api/app/v1/beheer/{id}/bevestigezd_ + chiphandtekeningtime, signature (base64, over EUZOS-beheer-v1)ok, admin_ipadmin_page::app::confirm
POST/api/app/v2/admin/{id}/reject/api/app/v1/beheer/{id}/weigerezd_—okadmin_page::app::reject

Oude JSON-veldnamen van de app-API (legacy::APP): error/fout, environment/omgeving, key_id/sleutel_id, public_key/publieke_sleutel, web_fallback/web_terugval, registration_open/registratie_open, expires/verloopt, user/gebruiker, password/wachtwoord, display_name/weergavenaam, language/taal, first_name/voornaam, last_name/achternaam, city/woonplaats, new/nieuw, challenge/uitdaging, name/naam, signature/handtekening, attestation/attestatie, device/apparaat, device_token/apparaat_token, devices/apparaten, this_device/dit_apparaat, created/gemaakt, last/laatst, revoked/ingetrokken, session/sessie, phone_ip/telefoon_ip, same_network/zelfde_netwerk, preference/voorkeur, profiles/profielen, profile/profiel, kind/soort, color/kleur, time/tijd, pc_sessions/pcsessies, logged_out/afgemeld, method/methode, admin_ip/beheer_ip, text/tekst. Ongewijzigd: code, ok, server, token, email, status, platform, pc, pc_ip, ref.

Webpagina's (HTML; paden die gebruikers zien, blijven zoals ze zijn)

MethodePadToegangVerzoekWatHandler
GET/geen—startpaginaweb::begin
GET/l/{id}geen—de telefoonpagina van een QR-login zonder de app (alleen met web_fallback)web::phone_page
POST/l/{id}/aanmeldengeenformulier user, passwordaanmelden op de webpaginaweb::sign_in
POST/l/{id}/bevestigwebcookieformulier action=login|reject, profile=zakelijk|privede pc-login goedkeuren of weigerenweb::confirm
POST/uitwebcookieformulier backafmelden op de telefoonpaginaweb::logout
GET/v/{token}link uit de mail—bevestigingspagina van het e-mailadresweb::verification_page
POST/v/{token}link uit de mailformulier passwordhet adres bevestigenweb::verify
GET/registreergeen—registratieformulier (of "gesloten")web::register_page
POST/registreergeen; registration_openformulier first_name, last_name, city, email, password, repeatregistreren (dezelfde stappen als de app)web::register
GET/.well-known/apple-app-site-associationgeen—iOS universal links (/l/*, /v/* openen de app)web::apple
GET/.well-known/assetlinks.jsongeen—Android app linksweb::android

Beheerpagina (HTML, alleen op het beheerdomein)

Zie Beheerpagina. Sessiecookie __Host-euzos_beheer (15 minuten zonder klik, hoogstens 4 uur, gebonden aan het IP), CSRF-token in elk formulier, POST alleen vanaf de eigen site.

MethodePadWatHandler
GET/beheer, /beheer/inlogformulier (velden email, password, csrf) of dashboardadmin_page::fetch_begin
GET/beheer/{pagina}pagina's: accounts (?q= zoeken), accounts/<id>, pcsessies, telefoons, apps, downloadtokens, log, statusadmin_page::fetch → pages::show
POST/beheer/inloggeninloggen met e-mail en wachtwoord, dan de QR/bevestiging in de appadmin_page::login::login
POST/beheer/annuleereen wachtende login annulerenadmin_page::login::cancel
POST/beheer/uitafmeldenadmin_page::send_core
POST/beheer/accounts/nieuween account aanmakenpages::account_new
POST/beheer/accounts/<id>/<actie>blokkeer, deblokkeer, wachtwoord, email, beheer, wis, wis-bevestig (verwijderen in twee stappen, 5 minuten)pages::account_action
POST/beheer/pcsessies/afmeldeneen pc afmelden (ref, back)pages::pc_logout
POST/beheer/telefoons/intrekeen telefoon intrekken (id, back)pages::phone_revoke
POST/beheer/apps/zeteen catalogusregel toevoegen/vervangenpages::app_set
POST/beheer/apps/wiseen app weghalen (name)pages::app_delete
POST/beheer/downloadtokens/intrekeen downloadtoken intrekken (jti, comment)pages::token_revoke
GET/b/{id}de link in de QR-code van de beheerlogin (opent de EUZOS-app)admin_page::login::link_page

Downloadserver (download.euzos.eu)

server/download (euzos-download) draait op localhost achter forward_auth van Caddy. Caddy vraagt het bij elk verzoek en geeft X-Forwarded-Method, X-Forwarded-Uri, Authorization en X-Forwarded-For door; bij 200 levert Caddy het bestand.

MethodePad (zoals doorgegeven)ToegangAntwoord
GET, HEAD/<app>/<versie>/<bestand>Authorization: Bearer ezdl1.…200 toegestaan; anders fout\nreden=<code>\n: 401 geen_token, handtekening, verlopen; 403 ingetrokken, ander_pad; 404 pad (andere methode of ander pad)

Een token is geldig als zijn kid bekend is (publieke sleutels in het sleutelbestand), de handtekening klopt, app en versie gelijk zijn aan het pad, het niet verlopen is en niet te ver in de toekomst geldig is, en zijn jti niet op de zwarte lijst staat (euzos_download::check).

Oude routes (oud → nieuw)

Beleid (docs/ENGLISH.md, regel 3): de API van de profielserver heeft Engelse routes en JSON-velden; de oude Nederlandse routes houden hun precieze oude draadformaat in legacy.rs tot elke productie-pc, werkplekserver en de telefoon-app over is. Het regelprotocol is op beide byte voor byte gelijk; de JSON-API's zijn dezelfde handlers met vertaalde veldnamen. Gecontroleerd tegen legacy::router:

MethodeOudNieuw
GET/api/sessie/{id}/api/session/{id}
GET/api/bestanden/api/files
GET/api/status/api/status (hetzelfde, geen oude route)
GET/api/afmelden/api/logout
POST/api/pc/inloggen/api/pc/login
POST/api/pc/entra/api/pc/entra (hetzelfde, geen oude route)
POST/api/pc/herverbind/api/pc/reconnect
POST/api/pc/registreer/api/pc/register
POST/api/pc/verifieer/api/pc/verify
POST/api/pc/opnieuw/api/pc/resend
POST/api/profiel/instellingen/api/profile/settings
GET/api/kluis/api/vault
PUT/GET/DELETE/api/kluis/{soort}/api/vault/{kind}
GET/POST/api/apps, /api/apps/token, /api/apps/{naam}hetzelfde (geen oude route)
POST/api/werkplek/v1/uitdaging/api/workplace/v1/challenge
POST/api/werkplek/v1/aanmelden/api/workplace/v1/sign-in
POST/api/werkplek/v1/downloadtoken/api/workplace/v1/download-token
POST/api/werkplek/v1/beheerbewijs/api/workplace/v1/admin-proof
GET/api/werkplek/v1/beheerlijst/api/workplace/v1/admin-list
POST/api/werkplek/v1/registreer/api/workplace/v1/register
POST/api/driverenricher/melding/api/driverenricher/report
GET/api/driverenricher/lijst/api/driverenricher/v2/list
GET/api/driverenricher/apparaat/{id}/api/driverenricher/v2/device/{id}
POST/api/driverenricher/apparaat/{id}/status/api/driverenricher/v2/device/{id}/status
POST/api/browserfeedback/melding/api/browserfeedback/report
GET/api/browserfeedback/lijst/api/browserfeedback/v2/list
GET/api/browserfeedback/{id}/api/browserfeedback/v2/{id}
GET/api/browserfeedback/{id}/afbeelding.png/api/browserfeedback/v2/{id}/image.png
POST/api/browserfeedback/{id}/status/api/browserfeedback/v2/{id}/status
GET/api/voorkeur/{id}/api/preference/{id}
GET/api/app/v1/server/api/app/v2/server
POST/api/app/v1/aanmelden/api/app/v2/sign-in
POST/api/app/v1/afmelden/api/app/v2/logout
POST/api/app/v1/registreer/api/app/v2/register
POST/api/app/v1/verifieer/api/app/v2/verify
POST/api/app/v1/verifieer/opnieuw/api/app/v2/verify/resend
POST/api/app/v1/email/api/app/v2/email
GET/POST/api/app/v1/apparaten/api/app/v2/devices
POST/api/app/v1/apparaten/uitdaging/api/app/v2/devices/challenge
DELETE/api/app/v1/apparaten/{id}/api/app/v2/devices/{id}
GET/api/app/v1/sessie/{id}/api/app/v2/session/{id}
POST/api/app/v1/sessie/{id}/bevestig/api/app/v2/session/{id}/confirm
POST/api/app/v1/sessie/{id}/weiger/api/app/v2/session/{id}/reject
GET/api/app/v1/pcsessies/api/app/v2/pc-sessions
POST/api/app/v1/pcsessies/{ref}/afmelden/api/app/v2/pc-sessions/{ref}/logout
GET/api/app/v1/beheer/{id}/api/app/v2/admin/{id}
POST/api/app/v1/beheer/{id}/bevestig/api/app/v2/admin/{id}/confirm
POST/api/app/v1/beheer/{id}/weiger/api/app/v2/admin/{id}/reject

De kernel roept nog de oude routes aan (/api/sessie/, /api/profiel/instellingen, /api/driverenricher/melding, /api/browserfeedback/melding, /api/werkplek/v1/…; docs/ENGLISH.md).

Zie ook

  • CLI · Pc-login · Telefoon-app · Apps en downloads · Beheerpagina
  • docs/PROFILE-PROTOCOL.md (het volledige protocol)
  • docs/WORKPLACE-PROTOCOL.md · docs/WORKPLACE.md
  • docs/DRIVERENRICHER.md · docs/BROWSERFEEDBACK.md
  • docs/DOWNLOADSERVER.md · docs/OFFLINE-LOGIN.md · docs/WORK-LOGIN.md
  • docs/ENGLISH.md ("Profile server API")