02 - Helsepersonell innlogget i eksternt system
Løsningskomponenter og informasjonsflyt
Sekvensen er som følger:
Helsepersonell logger på systemet (Web-server applikasjon) ved å benytte HelseID (OpenID Connect flyt)
Systemet får et ID-token (som gir informasjon om pålogget bruker)
Når systemet trenger å benytte et API på Helsenorge eller i PVK, gjør systemet et back-end kall mot Helsenorge Sikkerhetstjeneste
Helsenorge Sikkerhetstjeneste autentiserer klienten (her Web-server applikasjon back-end)
Helsenorge Sikkerhetstjeneste sjekker hvilke autorisasjoner den aktuelle system har (eventuelt i context av innlogget bruker). Sikkerhetstjenesten gir ut et AcsessToken som representerer hvilke rettigheter systemet/innlogget bruker har.
Web-server applikasjon kaller et Helsenorge API-endepunkt og ber om tilgang til ressurs, AcsessToken er med i requesten
Helsenorge API-tjeneste kontrollerer at de rettigheter som trengs er representert av AcsessTokenet.
Ressurs returneres til Web-server back-end og kan inngå i dennes respons til pålogget bruker.
Teknologi og forutsetninger
Helsenorge sikkerhetstjeneste er eksponert i et endepunkt der den representerer en STS - Secure Token Service
Det benyttes TokenExchange flyt i henhold til draft 19: OAuth 2.0 Token Exchange - https://tools.ietf.org/html/draft-ietf-oauth-token-exchange-19
ID-token utstedt av HelseID (med web-server side applikasjonens klient ID hos HelseID som "audience" sendes med som det token som ønskes vekslet inn)
Det kreves at klienten er "Confidential client", dvs. at den kan beskytte en hemmelighet
Klienten identifiserer seg mot STS gjennom "HTTP Basic authentication scheme" (RFC2617)
Hvordan benytte Helsenorge Sikkerhetstjeneste
Hvert miljø har sin egen STS og tokenet som returneres fra denne gir kun tilgang til API kall mot samme miljø.
https://[BaseURL]/sts/Token
Base URL til endepunktene i de forskjellige miljøene finner du her: https://helsenorge.atlassian.net/wiki/spaces/HELSENORGE/pages/1552384092
HTTP metode: POST
Request
Headers
Key | Value |
---|---|
Content-Type | application/x-www-form-urlencoded eller application/json |
Body
Key | Value | Kommentar |
---|---|---|
grant_type | urn:ietf:params:oauth:grant-type:token-exchange | |
client_id | En GUID som identifiserer klienten | Utstedes av NHN |
client_secret | Tilhørende passord til klienten | Utstedes av NHN |
HelseIdToken | ID-token utstedt fra HelseID til klienten og som representerer innlogget bruker. | Mottatt av HelseID ifm pålogging av bruker |
Response
Vellykket response
Parameter | Verdi | Kommentar |
---|---|---|
access_token | Generert referanse JWT | Er av type JWT med claims for klient id og referanse token. Benyttes videre for kall til andre API'er til Helsenorge. |
expires_in | 30 minutter i sekunder | |
token_type | bearer |
Feil response
Parameter | Verdi |
---|---|
code | Tallkode for referanse til type feil internt i Helsenorge |
message | Eventuell beskrivelse relatert til feilen |
errorCategory | Feilkategori |
statusCode | Samsvarer med HttpStatusCode til responsen |
korrelasjonsId | En GUID for referanse til logger internt i Helsenorge |
Eksempel
CURL kommandoer kan benyttes for å teste integrasjonen. Erstatt <tekst> med reelle verdier.
Request
Form urlencoded
curl -X POST \
-H 'Content-Type=application/x-www-form-urlencoded' \
-d 'grant_type=client_credentials&client_id=<Client Id (GUID)>&client_secret=<Client Secret>&HelseIdToken=<HelseID IdToken>' \
<URL> (Test eller produksjon, se over)
JSON
curl -X POST \
-H "Content-Type: application/json" \
-d '{"grant_type": "client_credentials", "client_id": "<Client Id (GUID)>", "client_secret": "<Client Secret>, "HelseIdToken":<HelseID IdToken>' \
<URL> (Test eller produksjon, se over)
Response
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsInZlciI6MSwidHlwXzIiOiJyZWYifQ.eyJqdGkiOiJlNjJmNGExYS1hYmZiLTQ3OGYtYjUwOS0xMzZlM
zhkYTVhYzIiLCJjbGllbnRfaWQiOiI1ZDRmNzlhNS00NTliLTQyOWEtOTcwYS03ZWRjMjQzMjk2MGMiLCJjbGllbnRfbmFtZSI6IkVrc3Rlcm4gdGVzd
GtsaWVudCIsInJlZl90b2tlbiI6IlZhNEhId2xjc1l6aTlZN1k3bEp5akw1V2dZbXVQaHVZakNDblp5bUdGRm8iLCJyZWZfdG9rZW5fdHlwZSI6IkZ1b
GwiLCJ6b25lIjoiZWtzdGVybl9pbnRlcm5ldHQiLCJuYmYiOjE1NTQxMDE4NTMsImV4cCI6MTU1NDEwMzY1MywiaWF0IjoxNTU0MTAxODUzLCJpc3MiO
iJzaWtrZXJoZXQuaGVsc2Vub3JnZS5ubyJ9.hZvCrBx2yNiMzP3_dx0tYBxCookFFQ8EDWtPp3PfUCQ",
"expires_in": 1800,
"token_type": "bearer"
}