Autentiseringsflyt

Før EPJ kan opprette en sesjon i Kjernejournals innloggingsløsning må den ha en aktiv sesjon med DPoP, se HelseID sin dokumentasjon på bruk av DPoP. Alle backendkall mot Kjernejournal innlogging krever autentisering med DPoP.

API'et krever at DPoP-bevisene inneholder en jti som er en Base64Url enkoding av minst 96 pseudorandom bits, etter anbefalingen i RFC 9449. Vi anbefaler å bruke f.eks. en UUID som grunnlag, i java kan dette gjøres med f.eks. biblioteket Nimbus:

import java.util.UUID;
import com.nimbusds.jose.util.Base64URL;

Base64URL jti = Base64URL.encode(UUID.randomUUID().toString());

Denne siden beskriver autentiseringsflyten. Den består av følgende deler:

  • Opprettelse av sesjon
  • Vedlikehold av sesjon
  • Avslutte sesjon
  • Bytte av pasient

Helseindikator

Hvis man ønsker å vise helseindikator, så kan man gjøre det i kombinasjon med flyten definert under. Merk at det er et helt uavhengig steg som man valgfritt kan gjøre. Se egen dokumentasjon.

Krav for alle endepunkter i innloggingstjenesten

Dette er krav som gjelder for endepunktene session/create, session/refresh og session/end

HelseID Access token

Tjenesten krever et brukerbasert HelseID-token med følgende claims:

ClaimBeskrivelse
audnhn:kjernejournal
scopenhn:kjernejournal/innlogging, nhn:kjernejournal/tillitsrammeverk

Headere

Alle endepunktene krever følgende headere:

Navn Beskrivelse Påkrevd
Authorization DPoP HelseID Access token Ja
DPoP DPoP-bevis Ja
X-SOURCE-SYSTEM Navn og versjonsnummer til EPJ-systemet, 3-512 tegn. Godkjente tegn er .,()- i tillegg til mellomrom, bokstaver og tall. Ja
X-EVENT-ID Unik identifikator for å spore requesten, maks 128 tegn. Godkjente tegn er bindestrek i tillegg til bokstaver og tall. Nei

Opprettelse av Kjernejournal Innlogging-sesjon

For å åpne Kjernejournal portal med tillitsrammeverket til HelseID, så må EPJ:

  • Hente access token fra HelseID
  • Opprett Kjernejournal Innlogging-sesjon ved å sende access token til Kjernejournal Innlogging
    • Man får en kode tilbake
  • Åpne Kjernejournal Portal med koden

Begreper:

  • HelseID-tokens
    • EPJ ber om access tokens med tillitsrammeverket
    • De kobler sammen brukeren og hvilken relasjon brukeren har til pasienten
  • Kjernejournal Innlogging-sesjon
    • Innlogging-sesjonen krever et HelseID access-token, en pasient-id og et samtykkegrunnlag (access_basis)
    • Innlogging-sesjonen brukes for åpne en websesjon mot Kjernejournal Portal

Detaljert flyt

sequenceDiagram autonumber title Opprettelse av Kjernejournal Innlogging-sesjon participant EPJ participant HelseID participant KJ as Kjernejournal rect gray Note over EPJ: Hent tokens med tillitsrammeverk EPJ ->> HelseID: Hent HelseID-tokens HelseID -->> EPJ: Access og refresh tokens end EPJ -> EPJ: Generer par av ehr_code_challenge, ehr_code_verifier EPJ ->> KJ: POST Innlogging-API/api/session/create (accessToken,ehr_code_challenge,patient_identifier,access_basis) KJ -->> EPJ: sessionId, code EPJ ->> KJ: GET hentpasient.html?code=code&ehr_code_verifier=ehr_code_verifier KJ -->> EPJ: Vis Kjernejournal Portal

Her følger en detaljert forklaring, med henvisning til tallene i sekvensdiagrammet over.

  1. Hent HelseID-tokens med tillitsrammeverk
  2. Access token med tillitsrammeverk-claim
  3. Generer par av ehr_code_challenge, ehr_code_verifier
    • For å koble Innlogging-sesjonen til en websesjon i Kjernejournal Portal så brukes et challenge og verifier-par.
    • Det følger Proof Key for Code Exchange-standarden fra OAuth (RFC 7636).
    • ehr_code_verifier skal være en kryptografisk tilfeldig streng med fra 43 til 128 karakterer, bestående av A-Z, a-z, 0-9, i tillegg til karakterene -._~ (bindestrek, punktum, understrek, og tilde). Denne skal sendes som en queryparameter ved kall i nettleser.
    • ehr_code_challenge skal være en Base64-URL-encodet streng av SHA256 hashen til ehr_code_verifier. Denne skal sendes ved opprettelse av sesjonen.

Her er eksempel på hvordan man kan generere verdiene med Nimbus-biblioteket i Java.

import com.nimbusds.oauth2.sdk.pkce.CodeChallenge;
import com.nimbusds.oauth2.sdk.pkce.CodeChallengeMethod;
import com.nimbusds.oauth2.sdk.pkce.CodeVerifier;

CodeVerifier ehrCodeVerifier=new CodeVerifier();
CodeChallenge ehrCodeChallenge=CodeChallenge.compute(CodeChallengeMethod.S256,ehrCodeVerifier);
  1. Opprett Kjernejournal Innlogging-sesjon
    • Før man kan åpne Kjernejournal Portal, så må man opprette en sesjon i Kjernejournal Innlogging.
  • Header: Authorization
    • HelseID DPoP Access token fra steg 2
  • Header: DPoP
    • DPoP-signatur, se HelseID
    • Merk at DPoP-signaturen har kort levetid, så sørg for at klokken på maskinen som genererer signaturen er i synk.
  • Header: X-SOURCE-SYSTEM
    • Påkrevd header
    • Fritektsfelt for å identifiere kildesystemet i logger
  • Body: patient_identifier
    • Pasientens fødselsnummer eller D-nummer
    • Se tabell under
  • Body: access_basis
    • Grunnlag for tilgang til helseopplysninger i nasjonal kjernejournal
    • Se tabell under
  • Body: practitioner_authorization
    • Gjeldende autorisasjon for helsepersonellet. Valideres mot Helsepersonellregisteret.
    • Dersom authorization er til stede i attest, må den være lik practitioner_authorization
    • Se tabell under

Grunnlag (access_basis)

Access basis indikerer grunnlag for tilgang til helseopplysninger i nasjonal kjernejournal. Hvilke regler som gjelder er definert i kjernejournalforskriften

Dersom unntak av samtykke for brukeren ikke kan direkte avledes under oppretting av innlogging-sesjon, så må brukeren presenteres med et valg av samtykke i EPJen ved åpning av Kjernejournal.

Type kodeverk System Autorativ kilde Aksepterte verdier
Grunnlag Kjernejournal urn:oid:2.16.578.1.12.4.5.11.1 https://nhn.no SAMTYKKE, AKUTT, UNNTAK

Beskrivelse av samtykke-verdier

Verdi Bruksområde Beskrivelse
SAMTYKKE Brukeren har fått samtykke fra pasienten Ifølge pasientjournalloven må et helsepersonell ha samtykke fra pasient før man kan åpne Kjernejournal. Merk at det er noen unntak spesifisert i kjernejournalforskriften
AKUTT Til bruk i akuttsituasjoner hvor pasienten ikke er i stand til å gi samtykke Kjernejournalforskriften regulerer krav til samtykke i en akuttsituasjon.
UNNTAK For brukere er unntatt krav til samtykke Se kjernejournalforskriften for hvem som har unntak.

Her er eksempel på hvordan man kan presentere valg av samtykke i EPJ til brukeren før man åpner Kjernejournal:

Samtykke i Kjernejournal

Pasientidentifikator (patient_identifier)

Pasientens identifikator kan representeres gjennom ulike systemer med forskjellige autorative kilder.

Type identitet System Autorativ kilde
Fødselsnummer urn:oid:2.16.578.1.12.4.1.4.1 https://www.skatteetaten.no
D-nummer urn:oid:2.16.578.1.12.4.1.4.2 https://www.skatteetaten.no

Autorisasjon (practitioner_authorization)

Gjeldende autorisajon for helsepersonellet, denne valideres mot Helsepersonellregisteret.

Type kodeverk System Autorativ kilde Aksepterte verdier
Kategori helsepersonell urn:oid:2.16.578.1.12.4.1.1.9060 https://www.helsedirektoratet.no/ Se Volven.no

Dette er et eksempel på en request:

POST /api/session/create
Authorization: DPoP eyJhbGciOiJSUzI1NiIsImtpZCI6IkE4...
DPoP: aseqwe231asSD...
X-SOURCE-SYSTEM: EPJ-System, (v1.2.3-RC)
Content-Type: application/json

{
  "ehr_code_challenge": <Verdien av challenge generert i steg 3>,
  "claims": {
    "patient_identifier": {
      "id": <fødselsnummer>,
      "system": "urn:oid:2.16.578.1.12.4.1.4.1",
      "authority": "https://www.skatteetaten.no"
    },
    "access_basis": {
      "code": "AKUTT",
      "system": "urn:oid:2.16.578.1.12.4.5.11.1",
      "assigner": "https://nhn.no"
    }
    "practitioner_authorization": {
      "code": "LE",
      "system": "urn:oid:2.16.578.1.12.4.1.1.9060",
      "assigner": "https://www.helsedirektoratet.no/"
    }
  }
}
  1. Opprett sesjon-respons

    • Ved suksess, så får man en respons tilbake som inneholder en code og en sessionId
    • sessionId trengs for å kunne vedlikeholde og avslutte Kjernejournal Innlogging-sesjonen (se senere kapittel)
    • code trengs i neste steg, for å åpne Kjernejournal Portal-siden
  2. Åpne nettside hentpasient

  3. Sesjonen har blitt opprettet og Kjernejournal portal kan vises i nettleseren

Vedlikehold Kjernejournal Innlogging-sesjon

Før HelseID-access tokenet utløper må EPJ hente nytt token fra HelseID og sende det til Kjernejournal Innlogging-tjenesten. Tokenet vil bli brukt for å autentisere helsepersonellets aktivitet i kjernejournal. Konsekvensen av å ikke fornye tokenet i tide er at sesjonen i kjernejournal blir avsluttet.

For å sørge for en god brukeropplevelse for helsepersonell bør innsendt token ha et stort nok overlapp med forrige token ved å fornye tokenet før det forrige tokenet går ut. Vi anbefaler at dette overlappet er konfigurertbart fra EPJ og er på minst 5 sekunder. Konsekvensen av for kort overlapp er at helsepersonellet kan oppleve ustabilitet.

Detaljert flyt

sequenceDiagram autonumber title Vedlikehold av Kjernejournal Innlogging-sesjon participant EPJ participant HelseID participant KJ as Kjernejournal EPJ ->> HelseID: Hent nye tokens med refresh-token HelseID -->> EPJ: Access + refresh token EPJ ->> KJ: POST KJ-Innlogging/api/session/refresh (Nytt access token) KJ -->> EPJ: 200 OK
  1. Send det oppdaterte access-tokenet fra HelseID til Kjernejournal Innlogging-tjenesten. Merk at refresh-tokenet fra HelseID skal EPJ beholde selv.
POST /api/session/refresh
Authorization: DPoP eyJhbGciOiJSUzI1NiIsImtpZCI6IkE4...
DPoP: aseqwe231asSD...
X-SOURCE-SYSTEM: EPJ-System, (v1.2.3-RC)
Content-Type: application/json

{
  "sessionId": "<mottatt ved opprettelse av sesjon>"
}

Avslutt Kjernejournal Innlogging-sesjon

Det er to tilfeller hvor Innlogging-sesjonen må avsluttes av EPJ.

  • Brukersesjon i EPJ avsluttes av bruker
  • Brukersesjon i EPJ timer ut

Når det skjer, så må Kjernejournal Innlogging-sesjonen eksplisitt avsluttes.

sequenceDiagram autonumber title Avslutte sesjon participant EPJ participant KJ as Kjernejournal EPJ ->> KJ: POST KJ-Innlogging/api/session/end KJ -->> EPJ: 200 OK
  1. Request for å avslutte Kjernejournal Innlogging-sesjonen:
POST /api/session/end
Authorization: DPoP eyJhbGciOiJSUzI1NiIsImtpZCI6IkE4...
DPoP: aseqwe231asSD...
X-SOURCE-SYSTEM: EPJ-System, (v1.2.3-RC)
Content-Type: application/json

{
  "sessionId": "<mottatt ved opprettelse av sesjon>"
}

Bytte pasient

Når bruker bytter pasient, så må eksisterende sesjon avsluttes hvis den er aktiv. I tillegg må en ny sesjon opprettes for den nye pasienten. Det betyr at EPJ må be om nytt access token fra HelseID og opprette ny sesjon i Kjernejournal Innlogging.

sequenceDiagram autonumber title Bytte pasient participant EPJ participant KJ as Kjernejournal rect gray Note over EPJ: Hvis brukeren har en aktiv sesjon EPJ ->> KJ: POST KJ-Innlogging/api/session/end KJ -->> EPJ: 200 OK end EPJ ->> EPJ: Start ny sesjon mot Kjernejournal
  1. Å starte en ny sesjon innebærer å be om nytt access token fra HelseID og opprette en ny Kjernejournal Innlogging-sesjon som beskrevet i seksjonen over