Skip to main content

Authentication

Under Development

Authentication features are under active development. Configuration options and APIs may change.

Ignixa supports multiple authentication mechanisms for securing FHIR endpoints.

Overview

MethodUse CaseSpecification
SMART on FHIRHealthcare appsHL7 SMART
OAuth 2.0 / OIDCEnterprise SSORFC 6749, OIDC
API KeysServer-to-serverCustom
mTLSHigh securityRFC 5246

SMART on FHIR

SMART on FHIR is the recommended authentication method for healthcare applications.

Configuration

{
"SmartOnFhir": {
"Enabled": true,
"Authority": "https://login.example.org",
"ClientId": "ignixa-fhir",
"Scopes": {
"Launch": ["launch", "launch/patient"],
"Clinical": ["patient/*.read", "patient/*.write"],
"User": ["user/*.read", "user/*.write"],
"System": ["system/*.read", "system/*.write"]
}
}
}

Well-Known Endpoints

SMART on FHIR discovery:

GET /.well-known/smart-configuration

Response:

{
"authorization_endpoint": "https://login.example.org/authorize",
"token_endpoint": "https://login.example.org/token",
"capabilities": [
"launch-ehr",
"launch-standalone",
"client-public",
"client-confidential-symmetric",
"context-ehr-patient",
"sso-openid-connect"
],
"scopes_supported": [
"openid",
"profile",
"launch",
"patient/*.read",
"patient/*.write"
]
}

Scopes

SMART scopes control access:

ScopeAccess
patient/*.readRead patient compartment
patient/*.writeWrite patient compartment
user/*.readUser-level read access
user/*.writeUser-level write access
system/*.readSystem-level read (backend)
system/*.writeSystem-level write (backend)

Launch Context

For EHR-launched apps:

{
"patient": "Patient/123",
"encounter": "Encounter/456",
"need_patient_banner": true,
"smart_style_url": "https://ehr.example.org/smart-style.json"
}

OAuth 2.0 / OpenID Connect

Ignixa supports any standard OIDC-compliant identity provider including Azure AD, Okta, Auth0, Keycloak, and others.

Configuration

Configure any OIDC provider in appsettings.json:

{
"Authentication": {
"Authority": "https://login.microsoftonline.com/{tenant-id}",
"ClientId": "{client-id}"
}
}

The implementation automatically handles:

  • OIDC discovery (.well-known/openid-configuration)
  • JWT signature validation
  • Token expiration checks
  • Issuer validation

Supported Providers

  • Azure AD - Authority: https://login.microsoftonline.com/{tenant-id}
  • Okta - Authority: https://{domain}.okta.com
  • Auth0 - Authority: https://{domain}.auth0.com
  • Keycloak - Authority: https://keycloak.example.org/auth/realms/{realm}
  • Generic OIDC - Any OIDC-compliant provider

Token Validation

Configurable JWT validation:

{
"Authentication": {
"Authority": "https://auth.example.org",
"ValidateIssuer": true,
"ValidateAudience": true,
"ValidAudiences": ["api://ignixa-fhir"],
"ValidateLifetime": true,
"ClockSkew": "00:05:00"
}
}

Request Headers

Required Headers

HeaderDescription
AuthorizationBearer token (required when Authorization:RequireAuthentication is true)

Example Request

curl -X GET http://localhost:8080/Patient \
-H "Authorization: Bearer eyJhbGciOiJS..." \
-H "Accept: application/fhir+json"

Error Responses

401 Unauthorized

{
"resourceType": "OperationOutcome",
"issue": [{
"severity": "error",
"code": "login",
"diagnostics": "Authentication required"
}]
}

403 Forbidden

{
"resourceType": "OperationOutcome",
"issue": [{
"severity": "error",
"code": "forbidden",
"diagnostics": "Insufficient scope: requires patient/*.read"
}]
}