Considerations for Testing with Inferno ONC
Mandatory software components & configurations
Mandatory software components
Aidbox minimum installation consists of two mandatory components:
- 1.PostreSQL relations database management system as data persistence layer
- 2.Aidbox itself configured working to the
PostgreSQL
PostgreSQL
As an Aidboxdb docker container can be got here
. It has all necessary extensions on board.
Aidbox
The powerful FHIR-server
. It also supports SMART on FHIR authorization flow.
Aidbox is distributed as a Docker container:
Mandatory software configurations
Aidbox
Main configuration aspects:
- S3 account & bucket should be prepared as Aidbox uploads exported data to the bucket
- Aidbox should be configured as a zen-project
TLS for HTTP
ONC Inferno requires certain TLS version usage over HTTP requests. The allowed versions are v1.2+.
Technical requirements and attributes necessary for registration
confidential and public applications
There are two types of the applications using SMART on FHIR API:
confidentialapps are able to protect issued secretspublicones are not able to do it
confidential application
PUT /Client/inferno-g10-client
content-type: text/yaml
accept: text/yaml
id: inferno-g10-client
resourceType: Client
secret: some-very-secret
grant_types:
- authorization_code
- basic # used to exchange authorization_code for access_token
auth:
authorization_code:
pkce: false # no PKCE allowed
audience:
- https://cmpl.aidbox.app/smart
redirect_uri: https://inferno.healthit.gov/suites/custom/smart/redirect
refresh_token: true
secret_required: true # secret is allowed
access_token_expiration: 3600 # 1 hour
smart:
launch_uri: https://inferno.healthit.gov/suites/custom/smart/launch
public application
public, which don't have backend service and are not able to keep secret securely, shouldn't have secret, basic grant type and auth.authorization_code.secret_required should be disabled. Example:
PUT /Client/inferno-g10-client
content-type: text/yaml
accept: text/yaml
id: inferno-g10-client
resourceType: Client
grant_types:
- authorization_code
auth:
authorization_code:
pkce: true # PKCE is activated
audience:
- https://cmpl.aidbox.app/smart
redirect_uri: https://inferno.healthit.gov/suites/custom/smart/redirect
refresh_token: true
secret_required: false # secret is disabled
access_token_expiration: 3600 # 1 hour
smart:
launch_uri: https://inferno.healthit.gov/suites/custom/smart/launch
bulk client for back-end application
Client example for bulk application.
PUT /Client/inferno-g10-bulk-client
content-type: text/yaml
accept: text/yaml
id: inferno-g10-bulk-client
resourceType: Client
type: bulk
grant_types:
- client_credentials
auth:
client_credentials:
client_assertion_types:
- urn:ietf:params:oauth:client-assertion-type:jwt-bearer
access_token_expiration: 300 # 5 minutes
scope:
- system/*.read
jwks_uri: https://inferno.healthit.gov/suites/custom/g10_certification/.well-known/jwks.json
Expanding scope
scope are used to let SMART on FHIR know what resources an application needs to have access to. scope can be defined in two ways:
- 1.Exact resource name like
patient/Device.read. In this casereadaccess to theDeviceis requested - 2.Wildcard definition like
patient/*.readsaysallthe patients resourcesreadaccess requested
How Aidbox expands wildcard * scope
patient/*.read expands to:
patient/Patient.readpatient/AllergyIntolerance.readpatient/CarePlan.readpatient/CareTeam.readpatient/Condition.readpatient/Device.readpatient/DiagnosticReport.readpatient/DocumentReference.readpatient/Goal.readpatient/Encounter.readpatient/Immunization.readpatient/MedicationRequest.readpatient/Observation.readpatient/Procedure.readpatient/Provenance.readpatient/Practitioner.readpatient/Organization.readpatient/Location.read
user/*.read expands to:
user/Patient.readuser/AllergyIntolerance.readuser/CarePlan.readuser/CareTeam.readuser/Condition.readuser/Device.readuser/DiagnosticReport.readuser/DocumentReference.readuser/Goal.readuser/Encounter.readuser/Immunization.readuser/MedicationRequest.readuser/Observation.readuser/Procedure.readuser/Provenance.readuser/Practitioner.readuser/Organization.readuser/Location.read
system/*.read expands to:
system/Patient.readsystem/AllergyIntolerance.readsystem/CarePlan.readsystem/CareTeam.readsystem/Condition.readsystem/Device.readsystem/DiagnosticReport.readsystem/DocumentReference.readsystem/Goal.readsystem/Encounter.readsystem/Immunization.readsystem/MedicationRequest.readsystem/Observation.readsystem/Procedure.readsystem/Provenance.readsystem/Practitioner.readsystem/Organization.readsystem/Location.read