API van de profielserver
FAQ › Profielserver › API · English
Wat is het?
De profielserver (server/profile, axum) beantwoordt HTTP-verzoeken van vier soorten clients:
- De EUZOS-pc (de kernel): een regelprotocol in platte tekst (regels
sleutel=waarde, de eerste regel een statuswoord), met een ondertekend profiel. - De EUZOS-app op de telefoon: JSON onder
/api/app/v2/, met bearer-tokens. - Werkplekservers (EUZOS Server): het regelprotocol onder
/api/workplace/v1/. - 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 ofreden=<code>),wacht(wacht op de telefoon),verlopen(metreden=),afgemeld(metreden=),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 ouderefout\n<tekst>\n), met codes zoalste_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 zoalste_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
| Bericht | Ondertekend door | Regels |
|---|---|---|
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 telefoon | omgeving=, server=, sessie=, pc=, pcip=, profiel=, tijd=, uitdaging=, apparaat= |
EUZOS-beheer-v1 (login op de beheerpagina) | chipsleutel van de telefoon | omgeving=, 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-v2 | ondertekensleutel van de server (Ed25519) | het ondertekende profiel hierboven |
EUZOS-werkplek-aanmelden-v1 | werkpleksleutel (Ed25519) | omgeving=, server=, sleutel=, uitdaging=, tijd=, lan=, tls=, naam=, handtekening= |
EUZOS-downloadtoken-v1 | downloadsleutel (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-Lengthwordt geweigerd vóór het lezen). - CSRF (
lib::same_site): elk verzoek anders dan GET/HEAD/OPTIONS metSec-Fetch-Siteanders dansame-origin/none, of een vreemdeOrigin, wordt geweigerd met 403fout\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-headerX-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.
| Gebied | Grens (uit de code) |
|---|---|
| Sessiepolls | 60/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) |
| Instellingen | 30 per 5 minuten per pc-token |
| Pc-login met wachtwoord | per 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 app | 10 mislukte per 15 minuten per IP en per gebruikersnaam |
| Kluis | 30 per 5 minuten per pc-token, 60 per account |
| Appcatalogus | 30/min per netwerk |
| Downloadtokens | 20/uur per account, 60/uur per netwerk |
| Entra-login | 30/min per netwerk |
| Offline herverbinden | 120/min per netwerk, 10 per token |
| Werkplek | 30/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 beheerpagina | 10 per netwerk en 5 per account per 15 minuten |
| 1/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)
| Methode | Pad | Oud pad | Toegang | Verzoek | Antwoord | Handler |
|---|---|---|---|---|---|---|
| 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, 503 | pc::session |
| GET | /api/files | /api/bestanden | pc-token (?token=) | — | ok + item=-regels; 401 ongeldig token | pc::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/afmelden | pc-token | — | altijd ok | pc::logout |
| POST | /api/pc/login | /api/pc/inloggen | geen (afgeremd); uit met pc_password = no | regels 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, database | pc_login::login |
| POST | /api/pc/entra | — (hetzelfde) | ID-token van Microsoft; uit zonder entra_client_id | regels 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, druk | entra::login |
| POST | /api/pc/reconnect | /api/pc/herverbind | offline-token | regels 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, 503 | offline::reconnect |
| POST | /api/pc/register | /api/pc/registreer | geen; alleen met registration_open | regels 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 druk | pc_registration::register |
| POST | /api/pc/verify | /api/pc/verifieer | geen | regels email=, code= (6 cijfers), wachtwoord= | 200 ok; 400 code_onjuist; 401 wachtwoord_onjuist; 409 email_in_gebruik; 429; 503 | pc_registration::verify |
| POST | /api/pc/resend | /api/pc/opnieuw | geen | regel email= | altijd 200 ok; 400 ongeldig; 429 te_vaak | pc_registration::resend |
| GET | /api/preference/{id} | /api/voorkeur/{id} | geen | sessie-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)
| Methode | Pad | Oud pad | Toegang | Verzoek | Antwoord | Handler |
|---|---|---|---|---|---|---|
| POST | /api/profile/settings | /api/profiel/instellingen | pc-token | instellingsregels sleutel=waarde (toegestane lijst) | ok; 400 fout\n<reden>; 401; 413 te groot; 429; 503 | pc::settings |
| GET | /api/profile/background | — | pc-token; uit zonder vault_key_file | — | ok + id=, size=, changed= als dit profiel een afbeelding heeft | background::info |
| PUT | /api/profile/background/{id} | — | pc-token | de 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, 503 | background::put |
| GET | /api/profile/background/{id} | — | pc-token | — | 200 de blob als application/octet-stream, of 204 niets | background::fetch |
| DELETE | /api/profile/background | — | pc-token | — | ok (ook als er niets was) | background::delete |
| GET | /api/vault | /api/kluis | pc-token; uit zonder vault_key_file | — | ok + soort=<soort> per geheim (geen inhoud) | vault::list |
| PUT | /api/vault/{kind} | /api/kluis/{kind} | pc-token | ruwe bytes = het geheim | ok; 400, 401, 403 (opslag-sleutel alleen door de server), 404, 409 (te veel, of lager: een lagere generatie), 413, 429, 503 | vault::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 gemaakt | vault::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
| Methode | Pad | Oud pad | Toegang | Verzoek | Antwoord | Handler |
|---|---|---|---|---|---|---|
| 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 werkplekserver | apps::list |
| GET | /api/apps/{name} | — (hetzelfde) | geen | appnaam | beschikbaar + 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_file | regels app=, versie= (moet de catalogusversie zijn) | ok, token=ezdl1.…, verloopt=<unix>, duur=<s> | download_token::fetch |
Werkplekservers (regelprotocol)
| Methode | Pad | Oud pad | Toegang | Verzoek | Antwoord | Handler |
|---|---|---|---|---|---|---|
| POST | /api/workplace/v1/challenge | /api/werkplek/v1/uitdaging | geregistreerde werkpleksleutel | sleutel=<64 hex> | ok, uitdaging= (60 s, eenmalig) | workplace::challenge |
| POST | /api/workplace/v1/sign-in | /api/werkplek/v1/aanmelden | handtekening met de werkpleksleutel | het 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/token | workplace::download_token |
| POST | /api/workplace/v1/admin-proof | /api/werkplek/v1/beheerbewijs | pc-token van een beheerder; geregistreerde pc; dezelfde organisatie | werkplek=<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; 429 | workplace_admin::proof |
| GET | /api/workplace/v1/admin-list | /api/werkplek/v1/beheerlijst | pc-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/registreer | pc-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_vaak | workplace_registration::register |
Meldingen: DriverEnricher en BrowserFeedback
| Methode | Pad | Oud pad | Toegang | Verzoek | Antwoord | Handler |
|---|---|---|---|---|---|---|
| POST | /api/driverenricher/report | /api/driverenricher/melding | pc-token; uit met reports = no | melding 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, 503 | driverenricher::report |
| GET | /api/driverenricher/v2/list | /api/driverenricher/lijst | beheersleutel | query 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}/status | beheersleutel | JSON {"status": "nieuw|in_behandeling|driver|niet_ondersteund", "version": "v150", "notes": "…"} (version verplicht bij driver) | het bijgewerkte apparaat | driverenricher::status |
| POST | /api/browserfeedback/report | /api/browserfeedback/melding | pc-token; uit met reports = no | kop in regelformaat plus een optionele PNG (≤ 512 KB) (euzos_browserfeedback::read) | ok, id=<nummer> | browserfeedback::report |
| GET | /api/browserfeedback/v2/list | /api/browserfeedback/lijst | beheersleutel | query 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_public | browserfeedback::details |
| GET | /api/browserfeedback/v2/{id}/image.png | /api/browserfeedback/{id}/afbeelding.png | beheersleutel | — | de PNG; 404 als er geen is | browserfeedback::image |
| POST | /api/browserfeedback/v2/{id}/status | /api/browserfeedback/{id}/status | beheersleutel | JSON {"status": "nieuw|in_behandeling|opgelost|niet_op_te_lossen|dubbel", "version": "0.6.1", "notes": "…"} (version verplicht bij opgelost) | de bijgewerkte melding | browserfeedback::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/)
| Methode | Pad | Oud pad | Toegang | Verzoek | Antwoord | Handler |
|---|---|---|---|---|---|---|
| GET | /api/app/v2/server | /api/app/v1/server | geen | — | environment, server, key_id, public_key, web_fallback, registration_open | app::server |
| POST | /api/app/v2/sign-in | /api/app/v1/aanmelden | geen (afgeremd) | user (e-mail; email ook geaccepteerd), password | token (eza_…), expires, user, challenge, environment, server; 401 onjuist, 403 statuscode, 429 te_vaak | app::sign_in |
| POST | /api/app/v2/logout | /api/app/v1/afmelden | eza_ (vergeet die aanmelding) | — | ok (altijd) | app::logout |
| POST | /api/app/v2/register | /api/app/v1/registreer | geen; alleen met registration_open | user (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/verifieer | geen | {email, code, password} of {token, password} | ok, user | app::verify |
| POST | /api/app/v2/verify/resend | /api/app/v1/verifieer/opnieuw | geen | email (of user) | ok (altijd) | app::verify_resend |
| POST | /api/app/v2/email | /api/app/v1/email | eza_ | new | ok (mail naar het nieuwe adres) | app::email_change |
| POST | /api/app/v2/devices/challenge | /api/app/v1/apparaten/uitdaging | eza_ | — | challenge (nieuwe koppeluitdaging) | app::pair_challenge |
| POST | /api/app/v2/devices | /api/app/v1/apparaten | eza_ | 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 apparaten | app::pair |
| GET | /api/app/v2/devices | /api/app/v1/apparaten | eza_ 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) | — | ok | app::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 verlopen | app::session |
| POST | /api/app/v2/session/{id}/confirm | /api/app/v1/sessie/{id}/bevestig | ezd_ + chiphandtekening | profile, time, signature (base64, over EUZOS-inloggen-v1) | ok, pc_ip, profile | app::confirm |
| POST | /api/app/v2/session/{id}/reject | /api/app/v1/sessie/{id}/weiger | ezd_ | — | ok | app::reject |
| GET | /api/app/v2/pc-sessions | /api/app/v1/pcsessies | eza_ 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}/afmelden | eza_ 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), 429 | vault::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 verlopen | admin_page::app::request |
| POST | /api/app/v2/admin/{id}/confirm | /api/app/v1/beheer/{id}/bevestig | ezd_ + chiphandtekening | time, signature (base64, over EUZOS-beheer-v1) | ok, admin_ip | admin_page::app::confirm |
| POST | /api/app/v2/admin/{id}/reject | /api/app/v1/beheer/{id}/weiger | ezd_ | — | ok | admin_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)
| Methode | Pad | Toegang | Verzoek | Wat | Handler |
|---|---|---|---|---|---|
| GET | / | geen | — | startpagina | web::begin |
| GET | /l/{id} | geen | — | de telefoonpagina van een QR-login zonder de app (alleen met web_fallback) | web::phone_page |
| POST | /l/{id}/aanmelden | geen | formulier user, password | aanmelden op de webpagina | web::sign_in |
| POST | /l/{id}/bevestig | webcookie | formulier action=login|reject, profile=zakelijk|prive | de pc-login goedkeuren of weigeren | web::confirm |
| POST | /uit | webcookie | formulier back | afmelden op de telefoonpagina | web::logout |
| GET | /v/{token} | link uit de mail | — | bevestigingspagina van het e-mailadres | web::verification_page |
| POST | /v/{token} | link uit de mail | formulier password | het adres bevestigen | web::verify |
| GET | /registreer | geen | — | registratieformulier (of "gesloten") | web::register_page |
| POST | /registreer | geen; registration_open | formulier first_name, last_name, city, email, password, repeat | registreren (dezelfde stappen als de app) | web::register |
| GET | /.well-known/apple-app-site-association | geen | — | iOS universal links (/l/*, /v/* openen de app) | web::apple |
| GET | /.well-known/assetlinks.json | geen | — | Android app links | web::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.
| Methode | Pad | Wat | Handler |
|---|---|---|---|
| GET | /beheer, /beheer/ | inlogformulier (velden email, password, csrf) of dashboard | admin_page::fetch_begin |
| GET | /beheer/{pagina} | pagina's: accounts (?q= zoeken), accounts/<id>, pcsessies, telefoons, apps, downloadtokens, log, status | admin_page::fetch → pages::show |
| POST | /beheer/inloggen | inloggen met e-mail en wachtwoord, dan de QR/bevestiging in de app | admin_page::login::login |
| POST | /beheer/annuleer | een wachtende login annuleren | admin_page::login::cancel |
| POST | /beheer/uit | afmelden | admin_page::send_core |
| POST | /beheer/accounts/nieuw | een account aanmaken | pages::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/afmelden | een pc afmelden (ref, back) | pages::pc_logout |
| POST | /beheer/telefoons/intrek | een telefoon intrekken (id, back) | pages::phone_revoke |
| POST | /beheer/apps/zet | een catalogusregel toevoegen/vervangen | pages::app_set |
| POST | /beheer/apps/wis | een app weghalen (name) | pages::app_delete |
| POST | /beheer/downloadtokens/intrek | een 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.
| Methode | Pad (zoals doorgegeven) | Toegang | Antwoord |
|---|---|---|---|
| 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:
| Methode | Oud | Nieuw |
|---|---|---|
| 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")
EUZOS