Zorgaanbiederauthenticatie en -autorisatie
0.1.0 - prototype
Publish Box goes here
Clientauthenticatie stelt vast welke organisatie een token aanvraagt. Autorisatie beantwoordt een andere vraag: tot welke resource van welke organisatie wordt voor welk doel toegang gevraagd en verleend?
Het clientsysteem stuurt de autorisatiedetails als losse
authorization_details-parameter:
{
"type": "nl-gis-v1",
"purpose_of_use": "http://terminology.hl7.org/CodeSystem/v3-ActReason|TREAT",
"locations": [
"https://fhir.example.org/fhir/bgz"
],
"locations_organization_id": "2.16.528.1.1007.3.3.22222222"
}
De velden hebben elk een eigen betekenis:
| Veld | Betekenis |
|---|---|
type |
overeengekomen structuur en semantiek van de autorisatiedetails |
purpose_of_use |
verklaard gebruiksdoel waarop de server beleid toepast |
locations |
exacte resource-URI's waarvoor toegang wordt gevraagd |
locations_organization_id |
geregistreerde organisatie die de resources beheert |
Deze uitwerking vereist één aangevraagde locatie en de volgende gelijkheid:
tokenrequest resource
== authorization_details.locations[0]
== access token aud
== uiteindelijke FHIR-request-URI
Daarnaast moet locations_organization_id overeenkomen met de doelorganisatie
waaruit het endpoint via vertrouwde discovery is afgeleid.
Profielregel: de authorization server mag geen token uitgeven als
RAR-type, gebruiksdoel, locatie, doelorganisatie en resource niet gezamenlijk
door haar beleid worden geaccepteerd.
Referentiekeuze: nl-gis-v1, precies één locatie en alleen TREAT zijn de
huidige, bewust kleine policy van de code. Meer gebruiksdoelen of locaties
vereisen expliciete semantiek en governance; zij zijn niet automatisch
verboden door OAuth of RAR zelf.
De RAR is geen claim in de client assertion. De mTLS-verbinding beschermt de losse formparameter tijdens het tokenverzoek. De authorization server:
Het clientsysteem mag daarom niet aannemen dat de uitgegeven autorisatie gelijk is aan de aanvraag. Het controleert de getekende uitkomst.
Een geaccepteerd token bevat in deze profieluitwerking:
{
"iss": "https://as.example.org",
"sub": "2.16.528.1.1007.3.3.11111111",
"client_id": "2.16.528.1.1007.3.3.11111111",
"aud": ["https://fhir.example.org/fhir/bgz"],
"iat": 1784275200,
"exp": 1784275500,
"jti": "unieke-tokenwaarde",
"authorization_details": [{
"type": "nl-gis-v1",
"purpose_of_use": "http://terminology.hl7.org/CodeSystem/v3-ActReason|TREAT",
"locations": ["https://fhir.example.org/fhir/bgz"],
"locations_organization_id": "2.16.528.1.1007.3.3.22222222"
}],
"cnf": {
"jkt": "publieke-JWK-thumbprint"
}
}
cnf.jkt bindt het token aan de publieke DPoP-key. De betekenis daarvan staat
op DPoP en transport.
Vóór de resource-aanroep controleert het clientsysteem:
iss tegen de geregistreerde issuer;sub en client_id tegen de eigen organisatie-identificatie;aud tegen de exacte gekozen resource;iat en exp;authorization_details;cnf.jkt.Profielregel: bij een ontbrekende of tegenstrijdige claim stopt het clientsysteem vóór de FHIR-aanroep.
Deze client-side inspectie is een bewuste Nederlandse profieltoevoeging en staat op gespannen voet met OAuth-profielen waarin het access token voor de client opaque blijft. De profielpagina beschrijft deze keuze expliciet.
De resource server vertrouwt niet op de eerdere clientcontrole. Zij valideert het token opnieuw tegen haar eigen issuerkey en verwacht dezelfde client, audience, doelorganisatie, location en purpose. Daarna controleert zij de requestspecifieke DPoP-proof.
Ontbrekende autorisatiedetails, afwijkende audience, ander doel-URA, verlopen
token, onbetrouwbare signing key of ontbrekende cnf.jkt leidt tot een
veilige stop.