Skip to main content

Cerner Adapter

A Source Custom node that polls a Cerner FHIR endpoint on an interval and pushes every matching resource downstream as JSON.

Part of the Linkiir Adapters package — see requesting the package.

What it does

On each interval the node discovers Cerner's token endpoint from the published SMART configuration, obtains an access token for the scopes you requested, runs your FHIR search, and pushes one message per resource returned. The token is cached and reused until it nears expiry.

Cerner FHIR endpoint → Cerner Adapter → your next node

Before you start

Register a System Account on CernerCentral as a backend services client, and collect:

  • The client ID.
  • An RSA keypair, with the public half published as a JWKS.
  • The Key ID (kid) identifying which key in that JWKS Cerner should verify against.
  • The base URL of the Cerner FHIR endpoint for your tenant.

If you do not already have a keypair, generate one:

openssl genrsa -out cerner_private.pem 2048
openssl rsa -in cerner_private.pem -pubout -out cerner_public.pem
FileWhat to do with it
cerner_public.pemPublish it as part of a JWKS on the CernerCentral System Account
cerner_private.pemPut it on the machine running the Linkiir Runtime, readable only by the account the Runtime runs as

The node stores the key's path, not its contents, so the key never enters the project or an export.

Set it up

  1. Open the Cerner FHIR Adapter node in the Workflow Builder and click Edit.

  2. Fill in the connection fields:

    FieldValue
    Base URLThe Cerner FHIR root for your tenant
    Client IDThe client ID from the System Account
    Private Key PathAbsolute path to cerner_private.pem
    Key IDThe kid of the matching public key in your JWKS
    ScopesThe scopes your integration needs, space-separated
  3. Say what to fetch with Resource Type and Search Query.

  4. Set Live Mode off, then Save.

  5. Connect a downstream node and start the workflow. Authentication still runs, so this first pass proves the client ID, key, and kid line up.

  6. Turn Live Mode on. The log reports how many resources were pushed.

Configuration reference

FieldTypeDefaultPurpose
Intervalnumber60000Milliseconds between polls
Base URLstring(empty)Root of the Cerner FHIR endpoint. A trailing slash is added if missing
Client IDstring(empty)OAuth client identifier from the CernerCentral System Account
Private Key Pathfile path(empty)PEM RSA private key used to sign the token request
Key IDstring(empty)The kid identifying which public key in your JWKS Cerner verifies against
Scopesstringsystem/Patient.readSMART on FHIR scopes requested on the token exchange
Resource TypestringPatientFHIR resource type to search each poll
Search Querystring(example)Search parameters as a URL query string
Live ModebooltrueOff simulates the FHIR calls. Authentication is always live
Verify TLSbooltrueVerify Cerner's TLS certificate. Turn off only for a local test proxy

Verify it worked

  • With Live Mode off, the node starts clean and logs that no request was sent.
  • With Live Mode on, the log reports a count of pushed resources and the downstream node receives that many messages.
  • Each message is a single FHIR resource as JSON.

If it didn't work

Symptom in the logCauseFix
CONFIG_ERROR naming a fieldThat field is empty, or a file path cannot be readFill the field; check the Runtime account can read the key
AUTH_FAILED mentioning the assertion or signatureThe Key ID does not match the published JWKS, or the private key is not the pair of the published public keyRe-check the kid, and republish the JWKS if needed
AUTH_FAILED mentioning scopesThe System Account is not approved for a requested scopeReduce Scopes to what the account is granted
HTTP_401 after a successful tokenThe token does not carry the scope the search needsAdd the scope, then restart the node
HTTP_404Wrong Base URL for the tenant, or a misspelled Resource TypeCorrect the URL or resource type
Live Mode is off and nothing is pushedWorking as configuredTurn Live Mode on
No error, but nothing pushedThe search matched nothingWiden the Search Query

Next