OZO FHIR implementation guide
0.9.0 - ci-build
OZO FHIR implementation guide - Local Development build (v0.9.0) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions
The primary assumption of providing access to practitioners is that they share the same identity provider as the OZO platform does. The secondary assumption is that the application that identifies the practitioner is a health care application and is part of the OZO network as a trusted participant. As the platforms share the same source of trust, the NutsEmployeeCredential can be leveraged to pass the user identity from the healthcare provider to the OZO platform. The credentials involved in connecting practitioners are:
X509Credential, signed by the private key of a UZI certificate.NutsOrganizationCredential, matching the URA number of the X509CredentialNutsEmployeeCredential for each logged in practitioner.In order to act on behalf of a health care organization in the OZO network, a health care provider needs to identify themselves by an UZI server certificate. This certificate can be used to self-sign and issue an X509Credential. This credential is loaded in the organization wallet and is used to proof the UZI number ownership to the OZO network.
A tool on generating the UZI VC can be found at the Golang did:x509 and X509Credential Toolkit
The second stage of the onboarding is the NutsOrganizationCredential, this credential is issued by OZO in order to welcome the health care organization in the OZO network.
Explanation of the Diagram
Actors and Components
Actors:
user: Represents the end user initiating actions in the system.Controls:
client_administrator: The primary control that interacts with different components to facilitate credential issuance and storage.x509_toolkit: A control used for issuing X509 credentials.client_nuts: A control used for managing credential-related actions, such as creating subjects and storing credentials.client_app: Represents the user-facing entry point into the client system.Boundary:
ozo_administrator: An administrative boundary involved in issuing the NutsOrganizationCredential.Control (Specific to OZO):
ozo_nuts: A special control within the ozo_administrator.Workflow 1: Self-sign X509Credential
Overview:
This workflow demonstrates the process of creating, signing, and storing an X509 credential.
client_administrator sends a request to client_nuts to create a subject.client_nuts responds by sending back a did:web to the client_administrator.client_administrator uses the x509_toolkit to request issuance of a Verifiable Credential (VC), which includes:
did:webx509_toolkit returns the signed X509Credential to the client_administrator.client_administrator sends the signed X509Credential to client_nuts for storage.Workflow 2: Request NutsOrganizationCredential
Overview:
This workflow focuses on requesting, issuing, and storing the NutsOrganizationCredential.
client_administrator requests the ozo_administrator to issue a NutsOrganizationCredential, providing a URA number as input.ozo_administrator forwards this request to client_nuts to create the NutsOrganizationCredential.client_nuts returns the created credential back to the ozo_administrator.ozo_administrator sends the NutsOrganizationCredential to the client_administrator.client_administrator stores the NutsOrganizationCredential in client_nuts.The trust is between OZO and the client application scoped at both organization and Practitioner level. For each organization the following must be arranged:
X509Credential signed by the private key of the UZI server certificate.NutsOrganizationCredential linked to the X509Credential with the URA number.Practitioner in both the OZO platform and the client application.Practitioner must be known in both the client application and the OZO platform.The X509Credential and NutsOrganizationCredential reside in the wallet of the organization in the NUTS node.
The procedure of getting access to the OZO api starts with a request towards the NUTS node for an access credential. The Practitioner must be logged in to the application with the IdP of the Organization. To request an access_token, the client application needs to initiate the token request with a self-signed NutsEmployeeCredential that contains the id_token or SAML assertion of the IdP. The NUTS node starts a negotiation with the NUTS node of the OZO platform. As soon as the NUTS node of the client has presented the right Verifiable Credentials in de form of signed Verifiable Presentations, the NUTS node of OZO provides an access_token. The client application uses the access_token to access the OZO API. The OZO Api introspects the access_token and uses the information in the introspection result to apply search narrowing. Furthermore, the OZO Api must check the id_token or SAML assertion with the known IdP for the domain and must check if the URA number of the X509Credential matches the NutsOrganizationCredential
The diagram illustrates a sequence of interactions between several entities to manage login, token acquisition, and secure API usage. The interactions are grouped into three key stages: Login, Get access_token, and Use access_token.
Actors and Components
Process Breakdown
1. Login
2. Get access_token
dpop_kid (key ID) are returned to the Client App via Client NUTS.3. Use access_token
Get DPoP token
Make API Request
GET /api/messages) to OZO API. The request includes:
Authorization: DPoP access_tokenDPoP: dpop_tokenValidate access_token
access_token by forwarding it to NUTS OZO for validation.200 OK and the requested data.Access tokens are short-lived (about 15 minutes). Within that window the same access token can be reused for multiple requests; only a fresh DPoP header must be requested per request. When the token expires, the client's NUTS node can request a new access token at any time without user interaction — the NutsEmployeeCredential is self-attested by the client application. The limiting factor is the validity of the embedded id_token or SAML assertion, which the OZO platform validates against the organization's IdP.
The NUTS node does not implement OAuth2 refresh tokens. To perform requests without an active user session — for example pulling changes after a subscription notification — the user context is kept alive at the IdP level instead:
offline_access scope (or the SAML equivalent) and stores the IdP refresh token per practitioner.id_token from the IdP.id_token is wrapped in a new self-issued NutsEmployeeCredential and a new access token is requested through the client's NUTS node, as described above.This pattern keeps access scoped to the individual practitioner (the AAA proxy search narrowing keeps working), keeps the NEN7510 audit trail attributed to the practitioner on whose behalf the platform is acting, and automatically revokes background access when the practitioner is deactivated at the IdP — the refresh grant will simply fail.
The OZO platform accepts assertions obtained through a refresh grant under the following conditions:
auth_time claim); the maximum age is agreed upon per connected platform.