3.4 Ophalen Launch code en Authentication cookie
Besluit een gebruiker een Taak te starten door het klikken van een Start-knop, dan stuurt de PGO de gebruiker naar de aanbiedermodule. De aanbieder heeft een Launch code en access_token nodig. De Launch code verwijst naar de launch context. In de launch context staat informatie over welke taak voor welke patiënt de aanbiedermodule moet uitvoeren. Om het access_token af te geven, heeft de DVA een Authentication cookie nodig van de Browser. De DVP en Browser halen Launch code en Authication cookie op bij de DVA, door middel van een PAR (RFC9216), een Authorization Code Flow (RFC6749) met een Token Exchange (RFC8693), beveiligd met PKCE (RFC7636).
Message en Process Sequence diagram
Hieronder staat het Process en Message Sequence diagram. De eerste stap “Start Taak…” hoort strikt genomen niet bij deze flow, en is opgenomen om context te geven.
Uitgangssituatie
De Persoon (niet weergegeven) bedient de User Agent. Dit is doorgaans een web Browser, en deze sectie gebruikt User Agent en Browser door elkaar.
De Browser is reeds ingelogd op een PGO.
De PGO heeft reeds alle Persoonsgegevens, inclusief Taken verzameld.
De Persoon heeft voldoende lange toestemming gegeven om deze flow mogelijk te maken. Loopt de toestemming eerder af, dan zal de Persoon opnieuw toestemming moeten geven en begint de flow van voren af aan. Dit is niet weergegeven.
Opmerking: We spreken over ‘voldoende lange toestemming’ omdat dit S.D. geen controle heeft over hoeveel tijd er zit tussen het inloggen met DigiD en het starten van de Taak. De Persoon zou een eenmalige toestemming kunnen geven, en 14 minuten wachten alvorens te kiezen de taak te starten. Zelfs als de Taak maar 2 minuten in beslag neemt, dan loopt de tijd over het maximum heen. Met deze situatie houdt het S.D. geen rekening, en het S.D. gaat uit ervan uit dat er voldoende tijd is of dat er langdurige toestemming is gegeven.
Opmerking: Deze paragraaf gebruikt de termen DVP en de daarop draaiende PGO Applicatie door elkaar, hoewel dit in de praktijd twee afzonderlijke met elkaar verweven systemen kunnen zijn.
Proces sequencediagram
Hieronder volgt het diagram met alle bericht uitwisselingen tussen de Browser, DVP en DVA.
Processtappen
Gebruiker bezoekt de aanbiedermodule met een Launch code dat verwijst naar een context bij DVA. Deze launch-context vastleggen gebeurt in OAuth2 met Token exchange-interface.
Met een PAR (Pushed Authentication Request) toont de DVP aan de DVA te beschikken over het MedMijVerzamelen Token van de Persoon. De DVA geeft hierop een RequestUri met een random waarde terug.
Met de RequestUri vervolgt de Browser een Authorization Code Flow (ACF), en krijgt hiervoor een code en een Authentication cookie, dat Browser later gebruikt bij het starten van de Taak module om te bewijzen dat de Persoon van de Browser dezelfde is als degene die de Taak verzamelt heeft.
Met de code in een Token Exchange vraagt de DVP bij de DVA een Launch code op, die de Browser later zal gebruiken om de Taak module te starten.
De PAR voldoet aan RFC9216. De ACF voldoet aan RFC6749. ACF gebruikt Token Exchange (RFC8693) in plaats van de Token Request/Response in RFC6749.
Let op: voor sommige statussen willen we de gebruiker niet doorsturen naar de aanbiedermodule. De definitieve statussen die bepalen of je wel of niet naar de module leverancier gaat wordt later in 3.7 Wijzigen Task Status Module verder uitgewerkt. We hebben ter illustratie entered-in-erroruitgewerkt.
Dit is een verantwoordelijkheid voor PGO maar ook DVA. Zie toelichting en advies voor Dienstverleneraanbieder.
Processtap | Toelichting |
|---|---|
1. Persoon start taak | Persoon start Taak. Dit S.D. vermeldt deze stap om de context duidelijk te maken. De Browser stuurt een HTTP message naar de DVP/PGO applicatie. De methode en inhoud van het bericht valt onder de verantwoordelijk van de PGO leverancier en buiten dit S.D. De PGO MOET de persoon erop wijzen dat de Taak opent buiten controle van de PGO. |
| DVP stuurt RFC9216 Pushed Authorization Request. De DVP MOET een POST gebruiken voor dit Request. De DVP MOET het Request beveiligen met PKCE (RFC7636). Deze komt terug bij de Token Exchange Request. Dit MedMij verzamelen access token wordt gevalideerd door DVA of deze geldig en niet verlopen is. Het token bevat een |
| DVA stuurt DVP een Authorization Response. De volgende stap gebruikt de URI inclusief code om een de autorisatie aan te vragen. |
| De DVP redirects de Browser naar de DVA voor Authorization Code Flow. |
| De Browser stuurt n.a.v. de redirect een Authorization Request naar het DVA /authorize endpoint. |
| De DVA genereert een Authentication cookie. De DVA koppelt dit aan:
De DVA noteert dat het cookie nog niet actief is, wat betekent dat wanneer het cookie nu gebruikt zou worden, de DVA het als ongeldig beschouwd. De DVA MOET het cookie vernietigen als het het cookie terugontvangt voordat de het actief is.
|
| De DVA stuurt een redirect naar de Browser, met daarin het Authentication cookie en de redirect URL, inclusief |
| Browser volgt zojuist ontvangen redirect. |
| De DVP gebruikt de informatie van de Browser op het callback endpoint, en stuurt een Token Exchange Request volgens RFC8693. subject_token bevat MedMij Verzamelen Token De DVA MOET de geldigheid van het MedMij Verzamelen Token valideren. Waarom? Taken bedoeld in de context van aanbiedermodules zijn gebonden aan aanbiedermodules-applicaties waar PGO geen directe communicatie mee heeft. Deze applicaties communiceren in het domein van Zorgaanbieder en vallen onder verwerkersverantwoordelijkheid van de Zorgaanbieder. Met het aanvragen van een Launch code voor Persoon geeft DVP een context mee aan DVA: Om welke persoon gaat het, welke taak wil deze uitvoeren en met welke PGO werkt de persoon? Deze informatie wordt gelogd, geverifiëerd en als nodig kan DVA op basis van de context vragen om aanvullende identificatie, toestemmingen die passen bij interactie op taak tussen Persoon en aanbiedermodule-applicatie. |
| DVA valideert het request, tegen de volgende parameters
De DVA genereeert een Launch code en onthoudt dat deze code bij het Authentication cookie hoort. De DVA activeert het Authentication cookie, wat inhoudt dat vanaf nu het cookie gebruikt mag worden. |
| DVA stuurt een Token Exchange Response met de Launch code in het veld Bij een fout, wijst de DVA de aanvraag voor een Launch code af met een fout, volgens de sectie parameters. De PGO applicatie toont een foutscherm, zie weergaverichtlijn. |
| De DVP stuurt een 302 Found redirect response op de Browser call_back, met Taak module endpoint en Launch code. De DVP/PGO MOET de de query parameter De DVP/PGO MOET het endpoint uit de acitvity definition gebruiken als launch-URL voor het starten van de Aanbiedermodule. Het endpoint is de value van het element De DVP/PGO MOET de de query parameter Zoals gezegd in de paragraaf https://medmij.atlassian.net/wiki/spaces/Toolbox1/pages/854065173, MOET de PGO ook duidelijk maken dat de Persoon naar een andere vertrouwensomgeving gaat. |
Parameters
Pushed Authentication Request (PAR: RFC9216) parameters
PAR Request parameters
Parameter | Waarde | ||||
|---|---|---|---|---|---|
|
| ||||
| module | ||||
|
| ||||
|
Zodat DVA weet dat dit request voor een Aanbiedermodule Launch code ophalen process. | ||||
| random waarde met een entropie van 128-bit. Gebruikt zoals voorgeschreven in de OAuth 2.0 RFC. | ||||
| DVP | ||||
| Volledige URL verwijzend naar de endpoint waar de Browser naar toe moet voor de Token Exchange. Bijvoorbeeld | ||||
| Voor welke DVA dit PAR bestemd is. Dit is de naam van de Zorgaanbieder uit de ZAL (maar dan zonder @medmij.nl suffix). Bijvoorbeeld: | ||||
| Lijst met twee waarden
| ||||
|
Zodat DVA weet dat dit request voor een Aanbiedermodule Launch code ophalen process. |
PAR Response Parameter
Parameter | Waarde |
|---|---|
HTTP response code en text |
|
|
Bijvoorbeeld: |
|
|
ACF Authorization
302 Found redirect en /authorize HTTP Authorisatie Request door Browser
De DVP haalt het /authorize endpoint, net als het /token endpoint uit de ZAL. Method is GET.
Query Parameter | Waarde | |
|---|---|---|
| <dvp_client_id> zoals gebruikt in PAR Request | |
| waarde verkregen in PAR Response. Bijvoorbeeld:
| |
| Deze waarde is gelijk aan de waarde in het PAR request. De DVA MOET het request afwijzen als de waardes ongelijk zijn. Bijvoorbeeld:
|
Authorization Response
Parameter | Waarde |
|---|---|
HTTP response code en text | 302 Found |
| De Bijvoorbeeld: Note: nu is er nog slechts 1 redirect URI in de lijst, mogelijk extra toevoegen. |
| een random waarde met een entropie van 128-bit. Gebruiken als per RFC. Bijvoorbeeld: |
| de waarde uit het request. Bijvoorbeeld: |
Token Exchange
Token Exchange Request
Parameters volgens https://www.rfc-editor.org/rfc/rfc8693.html#name-request sectie 2.1.
Method is POST. Het Token endpoint komt uit de ZAL.
Parameter | Waarde |
|---|---|
| Context heeft drie parameter in JSON formaat, zodat de DVA deze informatie weet bij het starten van de Taak. Context Bijvoorbeeld:
CODE
De FQDN van de De DVA MOET verifiëren dat FQDN van de |
|
|
| <MEDMIJ_VERZAMELEN_TOKEN>: het access_token van de Persoon die op dit moment de PGO applicatie gebruikt. De DVA registreert dat dit token bij de launch context hoort. |
|
|
| de opaque authorization code: de waarde uit het ACF Authorization Response. Bijvoorbeeld: |
|
|
|
|
| dezelfde waarde als in het PAR request en ACF Authorization Request |
| het |
| Voor welke DVA dit Token Request bestemd is. Dit is de naam van de Zorgaanbieder uit de ZAL (maar dan zonder @medmij.nl suffix), gelijk aan scope in gebruik voor Verzamelen. Zie ook https://afsprakenstelsel.medmij.nl/asverplicht/mmverplicht/token-interface. Voorbeeld: |
| een random waarde met een entropie van 128-bit. Dit om te testen tegen de eerder ontvangen PKCE, zoals gebruikelijk in Authorization Code Flow. Bijvoorbeeld: |
|
|
Token Exchange Response
Parameters volgens https://www.rfc-editor.org/rfc/rfc8693.html#name-successful-response.
Parameter | Waarde |
|---|---|
HTTP response code |
|
| Dit is de Launch code, een random waarde met een entropie van 128-bit. Bijvoorbeeld: Let op: Deze parameter moet volgens de RFC |
|
|
|
|
| zelfde als uit Request |
|
|
| De volledige URL van FHIR interface van de DVA verwijst. De aanbiedermodule MOET deze URL gebruiken voor de constructie van de SMART on FHIR configuratie discovery-URL door Bijvoorbeeld: |
Token Exchange Error Response - Fouten afhandelen
Parameters volgens https://www.rfc-editor.org/rfc/rfc8693.html#name-error-response.
DVA wijst de Launch code aanvraag af bij een fout, volgens https://www.rfc-editor.org/rfc/rfc6749#section-5.2, en stuurt een van de volgende codes:
error=invalid_requesterror=invalid_clienterror=unauthorized_clienterror=unsupported_grant_typeerror=invalid_scope
Dienstverlenerpersoon (DVP, PGO Applicatie) toont een foutscherm, zie weergaverichtlijn.
Response van DVP naar Browser met redirect URL naar Taak module
Parameter | Waarde |
|---|---|
HTTP Response code en text | 302 Found |
| endpoint naar Aanbiedermodule; deze komt uit de FHIR endpoint resource |
Query Parameter | Waarde |
| het endpoint van de DVA Resource Server; door DVP uit |
| de Launch code, die waarde van |
De parameter intent
Het is nog nader te bepalen of verschillende partijen de module zouden kunnen aanroepen. Dit onderscheid willen we maken met intent. De waarde voor dit S.D. is startmodule.
Random waarden
Op verschillende plaatsen eist dit S.D. een random waarde met een entropie van 128-bit, vergelijkbaar met verantwoordelijkheid core.autorisatie.205. Volledig uitgeschreven luidt deze eis:
Iedere random waarde MOET ten minste 128 bits aan entropie bieden (dat wil zeggen: de kans dat een aanvaller de waarde correct raadt, is kleiner dan 2⁻¹²⁸. De waarden zijn per definitie opaque.
Gebruik bijvoorbeeld een CSPRNG volgens erkende standaarden zoals NIST SP 800-90A met minimaal 128 bit seed-entropie en zonder seed of state hergebruik, zoals CTR_DRBG (AES-256), ChaCha20, en platformfuncties zoals getrandom(), BCryptGenRandom(), SecRandomCopyBytes().
Voor praktische implementatie MOET de random waarde maximaal 1024 bit lang zijn.
Procesdiagram voor uitzonderingen
Onderstaande diagram geeft Exception aan.
Procesdialogen
De procesdialogen gelden als voorbeelden. Feitelijke waarden, zoals eenmalige tokens, kunnen afwijken.
Validatie geldig access_token op DVP
PAR Request van DVP naar DVA. Hier volgt een voorbeeld.
POST https://dva-aanbiedersmodules.test.medmij.nl/identity/connect/par
Accept: application/json
Authorization: Basic cGdvLWFhbmJpZWRlcnNtb2R1bGVzOg==
User-Agent: pgo-aanbiedermodules
Content-Type: application/x-www-form-urlencoded
subject_token = eyJhbGciOiJSUzI1NiIsImtpZCI6IjMzNThDQTM1RTM1RDc2Nj…
audience = dvaaanbiedersmodulesweb
MedMij-Request-ID = 1ed9420a19164225a888f40c882686b7
X-Correlation-ID = 493cf744272740379d514dea8c621af8
client_id = pgo-aanbiedersmodules
response_type = code
scope = dvaaanbiedersmodules
redirect_uri = https://pgo-aanbiedersmodules.test.medmij.nl/web/api/dvamod/launch-callback
state = 8dce3d3396989c1a86c419cafee480157c47180743f342442c966e6ee3ff2889
nonce = f62a87adf40d95782c89ecd3587e8ddabbd625b58d07d3af78a7cf8ad13d38d8
acr_values = urn:medmij:oauth2:acr-value:launch-authorization
code_challenge = oNOg7WgyImvOh2QmsYD1blNrfu4TL6kTL5_C9OqZtTk
code_challenge_method = S256
Validatie response
Van DVA naar DVP. Hier volgt een voorbeeld.
201 CREATED PAR request successful
RequestUri: urn:ietf:params:oauth:request_uri:B02D0740E140AD2AB131610F5428E43BE1FFBBD35BDA3ED2CF0DD863EDF1C19D
ExpiresIn: 600s
Autorization Request door Browser
Authorization Code Flow Authorization Request van Browser naar DVA. Hier volgt een voorbeeld.
GET: https://dva-aanbiedersmodules.test.medmij.nl/identity/connect/authorize?
client_id=pgo-aanbiedersmodules&
request_uri=urn:ietf:params:oauth:request_uri:B02D0740E140AD2AB131610F5428E43BE1FFBBD35BDA3ED2CF0DD863EDF1C19D&
state=8dce3d3396989c1a86c419cafee480157c47180743f342442c966e6ee3ff2889
Authorization response, toesturen cookie en redirect naar Token Exchange
Hier volgt een voorbeeld.
HTTP/1.1 302 Found
Location: https://pgo-aanbiedersmodules.test.medmij.nl/web/api/dvamod/launch-callback?
code=b756ad1809264cd182b1c4a8c7951caf&
state=8dce3d3396989c1a86c419cafee480157c47180743f342442c966e6ee3ff2889
Set-Cookie: AuthenticationCookie=0ba0ae18ea6eab46fb61145e0f1d4db463c6aa277b581fcb23e90b88a8ea9ea3;
Max-Age=60;Secure;HttpOnly;SameSite=Strict
Browser request DVP met authorization code
Hier volgt een voorbeeld.
zie hierboven toesturen Cookie
Opvragen Launch code
Het opvragen Launch code met behulp van een Token Exchange Request. Hier volgt een voorbeeld.
POST https://dva-aanbiedersmodules.test.medmij.nl/identity/connect/token
Accept: application/json
Authorization: Basic cGdvLWFhbmJpZWRlcnNtb2R1bGVzOg==
User-Agent: pgo-aanbiedermodules
Content-Type: application/x-www-form-urlencoded
smart_launch_context = {
"resource": "Task/ProviderModule-SubTask-Meetopdracht-Bloeddrukmeting-13",
"intent": "startmodule",
"return_url": "https://pgo-aanbiedersmodules.test.medmij.nl/web?dvaname=medrie"
}
grant_type = urn:ietf:params:oauth:grant-type:token-exchange
subject_token = eyJhbGciOiJSUzI1NiIsImtpZCI6IjMzNThDQTM1RTM1RDc2Nj…
subject_token_type = urn:ietf:params:oauth:token-type:access_token
actor_token = b756ad1809264cd182b1c4a8c7951caf
actor_token_type = urn:medmij:token-type:authorization_code
audience = dvaaanbiedersmodulesweb
scope = dvaaanbiedersmodules
requested_token_type = urn:medmij:token-type:launch-code
code_verifier = 0bcuhhET_MCknrc-Rxd-IfHlRdFfWpaNF_0C_xPfXVM
PS: deze code_verifier hoort bij de code_challenge uit het PAR request te passen. In het voorbeeld klopt dit niet, dus in het voorbeeld kan men de SHA256 niet controleren.
Uitgeven Launch code
Hier volgt een voorbeeld. Merk op dat de afgegeven Launch code (urn:medmij:token-type:launch-code) hier van het token_type N_A is, niet Bearer.
HTTP/1.1 200 OK
{
"access_token": "47618365135e450480bdca5a72719709",
"expires_in": 180,
"token_type": "N_A",
"scope": "dvaaanbiedersmodules",
"issued_token_type": "urn:medmij:token-type:launch-code",
"fhir_base_url": "https://dva-aanbiedersmodules.test.medmij.nl/fhir-proxy"
}
Response met redirect naar Taak module
Response van DVP naar Browse met Launch code zojuist verkregen van DVA. Hier volgt een voorbeeld. Het endpoint in Location komt uit de key address in het FHIR endpoint resource.
HTTP/1.1 302 Found
Location: https://module.5im.nl/web/api/smartonfhir/launch?
iss=https://dva-aanbiedersmodules.test.medmij.nl/fhir-proxy&
launch=47618365135e450480bdca5a72719709
Error Respones voor Token Response
Zie RFC6749 voor error-respons.
400 Bad Request
{
"error": "invalid_request",
"error_description": "Onjuiste aanvraag"
}
400 Bad Request
{
"error": "invalid_request",
"error_description": "Algemene fout in verzoek: log en toon foutmelding"
}
//Taakstatus is bv in entered-in-error
400 Bad Request
{
"error": "invalid_request",
"error_description": "Taakstatus staat het aanvragen van een Launch code niet toe."
}
Aanvullende uitleg
In het functioneel ontwerp onderscheiden wij verschillende typen aanbiedermodules. Het technisch ontwerp beperkt zich voor nu tot use cases waarbij Persoon een module start op uitnodiging van zorgverlener (taak). Deze uitnodiging kan een patiënt op verschillende manieren bereiken, bijvoorbeeld in een e-mail, brief of een persoonlijk gesprek. Kiest de patiënt er voor om taken van een zorgaanbieder in te zien en te gebruiken vanaf een PGO, dan kan de DVP de persoon naar de aanbiedermodule-applicatie sturen met de context: “Om welke persoon gaat het, welke taak wil deze uitvoeren en met welke PGO werkt de persoon?” Deze informatie wordt gelogd, geverifiëerd en als nodig kan DVA op basis van de context vragen om aanvullende identificatie, toestemmingen die passen bij interactie op taak tussen Persoon en aanbiedermodule-applicatie.

