Zorgaanbiederauthenticatie en -autorisatie
0.1.0 - prototype
Publish Box goes here
De repository maakt het profiel uitvoerbaar en inspecteerbaar. Zij toont één mogelijke architectuur, geen voorgeschreven productopdeling. Andere implementaties mogen componenten combineren of anders deployen zolang dezelfde vertrouwensgrenzen, bewijzen en controles aantoonbaar blijven.
| Module | Verantwoordelijkheid | Onafhankelijk van |
|---|---|---|
protocol-core |
organisatie- en resource-identifiers, trustmodel, RAR, policy, events en poorten | Ktor, HAPI, Nimbus, bestanden en runtimeconfiguratie |
protocol-jose |
client assertions, access tokens, JWKS-verificatie, DPoP en JOSE-decoding | HTTP-server, UI en FHIR-payload |
app |
uitvoerbare Ktor-rollen, mTLS, demo-PKI, trustservices, FHIR-server, flowregie en web-API | browserweergave |
ui |
stapsgewijze weergave van protocolgebeurtenissen, wirebeelden, claims, controles en FHIR-resultaat | private keys en directe toegang tot mTLS-endpoints |
ig |
technisch profiel, rationale, implementatiecriteria en referentiemapping | runtime-uitvoering |
De demo start afzonderlijke lokale HTTPS-rollen:
| Rol | Code | Lokaal endpoint |
|---|---|---|
| Vertrouwensvoorziening | app/src/main/kotlin/nl/cumuluz/auth/app/trust/TrustServices.kt |
https://localhost:9443 |
| Authorization server | app/src/main/kotlin/nl/cumuluz/auth/app/oauth/AuthorizationServer.kt |
https://localhost:9444 |
| FHIR resource server | app/src/main/kotlin/nl/cumuluz/auth/app/fhir/FhirServer.kt |
https://localhost:9445 |
| Clientsysteem en flowregie | app/src/main/kotlin/nl/cumuluz/auth/app/adapter/ReceivingAdapter.kt |
interne mTLS-client |
| Onderwijs-API en statische UI | app/src/main/kotlin/nl/cumuluz/auth/app/web/WebApi.kt |
http://localhost:9080 |
De browser spreekt alleen met de onderwijs-API. ReceivingAdapter voert de
echte mTLS-token- en FHIR-requests uit. Daardoor komen clientcertificaat en
private protocolkeys niet in browsercode terecht.
| UI-stap | Protocolfase | Actor | Soort | Belangrijkste code | Gecontroleerde foutproeven |
|---|---|---|---|---|---|
select |
use-case kiezen | clientsysteem | lokaal | DemoController, Scenario |
geen; securityflow blijft gelijk |
discover |
vertrouwde discovery | clientsysteem ↔ trust | netwerk | TrustServiceClient.organization, TrustServiceClient.certificateStatus |
onbekende registratie of ingetrokken broncertificaat stopt de flow; onbetrouwbare JWKS wordt later zichtbaar |
assert |
client assertion maken | clientsysteem | lokaal | ClientAssertionService.create |
verlopen assertion, assertion replay en ongeldige assertiontypewaarde worden bij token-request afgewezen |
rar |
autorisatieverzoek maken | clientsysteem | lokaal | AuthorizationDetails, AuthorizationPolicy |
resource/location-mismatch, verkeerde doel-URA, onjuist purpose |
token-request |
client-, RAR- en DPoP-controle; tokenuitgifte | clientsysteem ↔ authorization server | netwerk | AuthorizationServer, ClientAssertionService.validate, DpopService.validate, AccessTokenService.issue |
assertionfouten, ingetrokken certificaat, RAR-fouten |
token-validate |
uitgegeven token controleren | clientsysteem | lokaal plus JWKS-ophaling | AccessTokenService.validateForClient |
onbetrouwbare JWKS, ontbrekende RAR, uitgeschakelde controle, verlopen token |
fhir-request |
beveiligde resourceaanroep | clientsysteem ↔ resource server | netwerk | ReceivingAdapter, DpopService.createProof |
verkeerde DPoP-key en Bearer-downgrade worden door server beoordeeld |
fhir-validate |
token-, policy- en proofcontrole | resource server | lokaal | FhirServer, AccessTokenService.validateForClient, DpopService.validate |
key mismatch, DPoP replay, Bearer-downgrade |
fhir-response |
geautoriseerde payload terugsturen | resource server ↔ clientsysteem | netwerk | FhirServer, FixtureRepository |
alleen bereikbaar na alle controles |
audit |
gescheiden verantwoording | URA-A en URA-B | lokaal | ReceivingAdapter.audit, FlowResult |
afgewezen flows krijgen eveneens een audituitkomst |
De toelichtende UI-tekst staat in ui/src/stepContent.ts.
SequenceLanes.tsx toont actor en richting; StepInspector.tsx toont gewone
taal, technische context, beslisregels, gesanitiseerde wirebeelden, publieke
claims en standaardverwijzingen.
De UI noemt de gecombineerde trustlane Gedeelde vertrouwenslaag en toont daar Registratie + status. Dit is een visuele groepering: de organisatieregistratie en broncertificaatstatus worden bij discovery afzonderlijk gecontroleerd; de authorization server controleert later afzonderlijk de certificaatstatus van de client.
De referentie gebruikt:
DemoPki schrijft lokale PKCS#12-stores onder app/build/demo-pki/. De
wachtwoorden blijven alleen in het proces. kid is in de demo de
SHA-256-thumbprint van het bijbehorende certificaat. Deze constructie maakt de
conceptuele certificaatbinding en het TLS-gedrag testbaar, maar schrijft geen
productie-PKI, certificaatprofiel of sleutelbeheer voor.
WireSanitizer verwijdert Authorization- en DPoP-inhoud en redigeert compacte
assertions. De workbench toont wel:
Deze onderwijsweergave is geen packet capture en geen productie-auditlog.
Bouw eerst de IG en start daarna de complete runtime:
cd ig
npm ci
./_genonce.sh
cd ..
GRADLE_USER_HOME=$PWD/.gradle ./gradlew :app:run --no-daemon
Open:
http://localhost:9080;http://localhost:9080/ig/.Kies een use-case en gebruik Volgende stap om de werkelijk uitgevoerde flow stapsgewijs te openen. De foutselector laat zien bij welke actor een tegenstrijdig of onbetrouwbaar bewijs wordt afgewezen.
De tests voor protocol-core en protocol-jose controleren policy en
cryptografie. De app-tests controleren end-to-end flow, fouten, echte mTLS en
web-API. UI-tests controleren de uitleg en interactie. De IG-build controleert
conformanceartefacten, links en publicatie.
Geen van deze suites bewijst productiehardening, beschikbaarheid van landelijke voorzieningen of inhoudelijke conformiteit van de klinische voorbeelden.