3.6 Ontvangen launch context
Aanbiedermodule ontvangt van de Browser een verzoek voor de digitale activiteit, met hierin de Launch code. De Aanbiedermodule (AM) haalt de SMART on FHIR configuratie en launch context op bij de DVA door middel van de SMART on FHIR standaard. In dit proces checkt de DVA het Authenticatie cookie. Het proces tussen DVA en AM gebruikt het SMART on FHIR App Launch Protocol as beschreven op App Launch: Launch and Authorization - SMART App Launch v2.2.0 en GitHub - HL7/smart-app-launch: SMART on FHIR App Launch Protocol · GitHub.
Hierna, zoals beschreven in 3.7 en 3.8, haalt de Aanbiedermodule de Taak of Activiteit op en presenteert de Taak in de Browser van de Persoon.
Message en proces sequence diagram
Hieronder staat het Process en Message Sequence diagram. De eerste stap is de laatste stap uit de vorige flow “Starten Aanbieder Module”, en hoort strikt genomen niet bij deze flow, maar is opgenomen om context te geven.
Uitgangssituatie
De DVA heeft van de DVP het MedMij_verzamelen_token ontvangen, heeft een Auhtentication cookie in de Browser gezet, en heeft daarmee de identificatie en authenticatie van de Browser veiliggesteld.
De DVP heeft de Launch code en het end-point van de Aanbiedermodule ontvangen van de DVA en deze doorgeven aan de Browser.
De Browser heeft een verzoek naar het endpoint-van de Aanbiedermodule gestuurd met de Launch code om de Aanbiedermodule te starten.
De Aanbiedermodule gaat dit verzoek behandelen.
De Persoon hoeft op dit punt niets te doen; deze wacht op het verschijnen van de eerste webpagina van de Aanbiedermodule, tenzij natuurlijk een Alternatieve of Exception (error) flow zou starten
Proces sequencediagram
Hieronder het UML Sequence diagram van het ontvangen en uitvoeren van de launch context.

Einde diagram.
Processtappen
Het starten van de Taak volgt de HL7 Smart App Launch v2.2.0 standaard (https://hl7.org/fhir/smart-app-launch/ ).
App launch is beschreven in https://build.fhir.org/ig/HL7/smart-app-launch/app-launch.html#launch-app-ehr-launch .
Het ophalen van de configuratie: https://build.fhir.org/ig/HL7/smart-app-launch/app-launch.html#launch-app-ehr-launch
Het ophalen van de launch context is ingepakt in een Authorization Code Flow (RFC6749) zoals beschreven in https://build.fhir.org/ig/HL7/smart-app-launch/app-launch.html#launch-app-ehr-launch .
Het ophalen van Taak/Activiteit voldoet aan het MedMij Afsprakenstelsel.
Hieronder zijn de stappen beschreven.
Processtap | Toelichting | |
|---|---|---|
| De Aanbiedermodule ontvangt van de PGO de HTTP GET op de launch-url. De URL bevat 2 query parameters. De Aanbiedermodule MOET de parameter
| |
Query Parameter | Waarde | |
| de FHIR Base URL: Dit is het EHR's FHIR endpoint, en dat is in het MedMij Afsprakenstelsel de DVA. | |
| Launch code zoals ontvangen in Token Response van DVA aan DVP. | |
| Het opvragen en toesturen van de smart-configuration gebeurt volgens de beschrijving App Launch: Launch and Authorization - SMART App Launch v2.2.0. De AM stuurt een HTTP GET request naar de DVA. De aanbiedermodule MOET de waarde van De aanbiedermodule MOET de waarde van | |
| De DVA verstrekt de file | |
Parameter | Waarde | |
| URL van endpoint om Authorization Code Flow te starten Voorbeeld: | |
| URL van endpoint om het access_token via Token Exchange op te vragen te verversen. Bijvoorbeeld: | |
|
| |
| De Aanbiedermodule stuurt Browser door naar het De AM MOET de redirect URL opgeven waarvan de FQDN naar zichzelf verwijst. De Browser stuurt hiermee een RFC6749 Authorization Request naar de DVA. De URL bevat de query parameter De DVA MOET checken of deze redirect naar de AM verwijst, en MOET deze exacte URL gebruiken voor de latere redirect. In het verzoek op AM heeft resource scopes als ‘clinial scopes’ De DVA ontvangt met dit Authorization request automatisch het | |
Query Parameter | Waarde | |
| de Launch code die verwijst naar launch context; ontvangen in 3.4 | |
|
Ter informatie: Een
| |
|
| |
| de URL verwijst naar callback op AM, waar de Browser naar toe moet na het ontvangen van een positief Authorisation Response Bijvoorbeeld: | |
|
| |
| random waarde per SMART App Launch standaard | |
| PKCE challenge per RFC7636; AM moet een random value code_verifier genereren, bewaren en in Token Request meesturen. Bijvoorbeeld: | |
|
| |
| random value, als per RFC. De AM controleert of dit in het token terugkomt in het | |
| audience - dit is dezelfde waarde als de iss parameter in de SMART launch URL (DVA doet hier gewoonlijk niets mee, en logt dit). | |
| De Browser stuurt automatisch een GET met een Authorization Request door middel van het volgen van de redirect URL uit de vorige stap. Dit start de RFC6749 Authorization Code Flow. Het mechanisme van de Browser, stuurt automatisch het Authentication cookie, gezet eerder in het proces, mee met het verzoek. Dit ligt vast in de HTTP standaard. | |
| De DVA voert de Authenticatie uit. Optie Authentication cookie: De DVA MOET het Authentication cookie checkten tegen de volgende voorwaarden:
Voldoet het cookie aan deze checks, dan:
Een DigiD login proces door de DVA valt buiten scope van dit S.D. | |
| Na succesvolle authenticatie en toestemming stuurt de DVA naar de Browser een positief RFC6749 Authorization Response, met payload volgens de HL7 SMART App Launch standaard. Dit response bevat een redirect naar de Aanbiedermodule ten behoeve van de AM-DVA Token Exchange, met de autorisatie code. De DVA moet de redirect URL ontvangen van de AM gebruiken en controleren of deze bij de AM hoort, zie aldaar. Bij een succesvolle authenticatie, stuurt de DVA een positief Authorization Response. Faalt de authenticatie, dan stuurt de DVA een negatief Authentication Response, HTTP 400 Bad Request Response, als beschreven in RFC 6749 - The OAuth 2.0 Authorization Framework, section 4.1.2.1. Error Response. | |
(Query) Parameter | Waarde | |
HTTP response code en text | 302 Found | |
| de URL uit | |
| random waarde, ter controle bij aanvraag Token Request Bijvoorbeeld: | |
| waarde zoals ontvangen in Authorization Request | |
| zelfde als in Authorization Request; DVA MAG besluiten minder scopes toe te kennen als het hiervoor een goede reden heeft. Bijvoorbeeld: | |
| Browser volgt automatisch met een GET de juist verkregen URL uit de 302 Found response. | |
| Het uitwisselen van de launch context is het tweede deel van de Authorization code flow en gebeurt met een RFC6749 Access Token Request en Response, opnieuw met payload volgens de HL7 SMART App Launch standaard. De Aanbiedermodule stuurt een Access Token Request met een Omwisselen van code voor context gebeurt met een OIDC Token Request bij de opgegeven issuer. De AM en DVA MOETEN op basis van RFC8705, Mutual TLS, authenticeren. AM MOET method POST gebruiken. | |
(Query) Parameter | Waarde | |
method |
| |
| authorization_code | |
| random waarde zoals ontvangen van DVA in Authorization Response, en doorgestuurd door Browser als query parameter | |
| endpoint om Browser naar toe te sturen na Token Exchange Response. Bijvoorbeeld: | |
| PKCE die hoort bij het Authorization Request Bijvoorbeeld: | |
| De AM valideert het verzoek tegen de volgende condities:
Faalt deze validatie, dan MOET de DVA het Token Request afwijzen. | |
| Token response bevat de launch_context met de parameters in JSON formaat in de HTTP body. Na ontvangst van de token-response MOET de aanbiedermodule controleren dat de waarde van Let op:
Heeft de validatie van het tokenverzoek gefaalt, dan stuurt de DVA een Error Reponse, als beschreven in RFC 6749 OAuth 2.0 Sectie 5.2 Error Response. | |
(Query) Parameter | Waarde | |
method |
| |
| random waarde Let op: Op tokens is verantwoordelijkheid core.autorisatie.205 van toepassing. | |
| vaste waarde, | |
| geldigheidsduur van het token: Zie ook voor geldigheidsduur paragraaf 3.8. | |
|
| |
| de resource waar het over gaat Bijvoorbeeld: | |
| de url waar de gebruiker terug gestuurd kan worden. DVA MOET FQDN van De DVA MAG ALLEEN de Bijvoorbeeld: | |
| identiteitstoken van de gebruiker; is een JWT token. Bevat onder meer het volgende:
n.n.t.b. | |
| zoals in Authorization Reponse (of Token Request?) Bijvoorbeeld: | |
| uit de scope | |
| De AM gebruikt het | |
| Heeft de AM de Taak ontvangen, dan kan de AM een response met een webpagina naar de Browser sturen om deze Taak te tonen en te laten uitvoeren. De layout, parameters en verdere implementatie is de verantwoordelijkheid van de AM. | |
Het wijzigen taakstatus, na het uitvoeren van de taak, is te vinden in 3.7, en het terugsturen van de Browser naar de PGO applicatie in 3.8. Daarna kan de Persoon middels de Browser via de PGO applicatie de update van de Taken verzamelen.
Smart Configuration file
De Smart Configuration File bevat in ieder geval authorization_endpoint, token_endpoint, token_endpoint_auth_methods_supported. Welke andere velden met welke waarden de smart configuration MOET gaan supporten, gaat Team Jupiter bepalen in Beta.
Uitzonderingscondities
Breekt de uitvoering van de redirect naar Aanbiedermodule voortijdig af, of treedt er een fout op in de aanvraag, dan volgt een error-respons als beschreven in RFC 6749 OAuth 2.0 Error Response.
Overige uitzonderingscondities zoals errors zal de Beta versie beschrijven.
Procesdialogen
De Procesdialogen zijn ter illustratie. Alleen de essentie is weergegeven. Zo zijn uitgebreide headers van HTTP vrijwel altijd weggelaten. Sommige waarden zijn fixed, andere variable. De variable parameters hebben een voorbeeld waarde gekregen.
Ontvangen Browser Request
Hier volgt een voorbeeld.
GET https://aanbiedermodule.example.org/web/api/smartonfhir/launch?
iss=https://dva-aanbiedersmodules.test.medmij.nl/fhir-proxy&
launch=47618365135e450480bdca5a72719709 HTTP/1.1
Opvragen smart-configuration
Hier volgt een voorbeeld.
GET https://dva-aanbiedersmodules.test.medmij.nl/fhir-proxy/.well-known/smart-configuration HTTP/1.1
User-Agent: DVAAanbiedersModules
Verstrekken smart-configuration
SMART App Launch Discovery response, is een HTTP response van DVA naar Aanbiedermodule, voor het ontvangen van discovery document .well-known/smart-configuration. Hier volgt een voorbeeld.
HTTP/1.1 200 OK
Content-Type: application/json
SmartConfiguration: {
"authorization_endpoint": "https://dva-aanbiedersmodules.test.medmij.nl/identity/connect/authorize",
"capabilities": [
"launch-ehr",
"client-public",
"sso-openid-connect",
"context-ehr-patient",
"permission-patient"
],
"code_challenge_methods_supported": [
"S256"
],
"grant_types_supported": [
"authorization_code",
],
"introspection_endpoint": "https://dva-aanbiedersmodules.test.medmij.nl/identity/connect/introspect",
"issuer": "https://dva-aanbiedersmodules.test.medmij.nl/identity",
"jwks_uri": "https://dva-aanbiedersmodules.test.medmij.nl/identity/.well-known/openid-configuration/jwks",
"response_types_supported": [
"code"
],
"revocation_endpoint": "https://dva-aanbiedersmodules.test.medmij.nl/identity/connect/revocation",
"scopes_supported": [
"openid",
"profile",
"launch",
"launch/patient"
"system/Task.*"
"patient/Patient.read"
],
"token_endpoint": "https://dva-aanbiedersmodules.test.medmij.nl/identity/connect/token",
"token_endpoint_auth_methods_supported": [
"tls_client_auth"
]
}
Note: the value "token_endpoint_auth_methods_supported": ["tls_client_auth" ] is defined in RFC8705 2.1.1.
Doorsturen Browser naar DVA authorization end-point
Hier volgt een voorbeeld.
HTTP/1.1 302 Found
Location: https://dva-aanbiedersmodules.test.medmij.nl/identity/connect/authorize?
client_id=dvaaanbiedersmodulesweb&
redirect_uri=https://module.5im.nl/web/api/smartonfhir/callback&
response_type=code&
scope=system/Task.*+patient/Patient.read+openid+fhirUser+launch+launch/patient&
state=4d05af083b4ccaf9ece3ce5221e8d310cf4ac1c8bcc15ad3c217922b1dbebbde&
code_challenge=2ZgbO_-Qzwo5ly4ylWKgnxKLDXqeWlkJEFoTWw1lDNU&
code_challenge_method=S256&
nonce=4042f14830f363a51412bc36face3a2d4b006565fbe98d776d4aee440254d27d&
aud=https://dva-aanbiedersmodules.test.medmij.nl/fhir-proxy&
launch=47618365135e450480bdca5a72719709
Verzoeken om Autorisatie
Van Browser naar DVA. Hier volgt een voorbeeld.
GET https://dva-aanbiedersmodules.test.medmij.nl/identity/connect/authorize?
client_id=dvaaanbiedersmodulesweb&
redirect_uri=https://module.5im.nl/web/api/smartonfhir/callback&
response_type=code&
scope=system/Task.*+patient/Patient.read+openid+fhirUser+launch+launch/patient&
state=4d05af083b4ccaf9ece3ce5221e8d310cf4ac1c8bcc15ad3c217922b1dbebbde&
code_challenge=2ZgbO_-Qzwo5ly4ylWKgnxKLDXqeWlkJEFoTWw1lDNU&
code_challenge_method=S256&
nonce=4042f14830f363a51412bc36face3a2d4b006565fbe98d776d4aee440254d27d&
aud=https://dva-aanbiedersmodules.test.medmij.nl/fhir-proxy&
launch=47618365135e450480bdca5a72719709 HTTP/1.1
Toekennen (of afwijzen) authenticatie en doorsturen Browser naar AM token endpoint
Hier volgt een voorbeeld.
HTTP/1.1 302 Found
Location: https://module.5im.nl/web/api/smartonfhir/callback?
code=A970E84A8878AD542902D49B1A537EA6A730BA15735E2582F2A3A1933BB6BFBE-1&
state=4d05af083b4ccaf9ece3ce5221e8d310cf4ac1c8bcc15ad3c217922b1dbebbde&
scope=system/Task.*+patient/Patient.read+openid+fhirUser+launch+launch/patient
Uitvoeren redirect naar Aanbiedermodule
Hier volgt een voorbeeld.
GET https://module.5im.nl/web/api/smartonfhir/callback?
code=A970E84A8878AD542902D49B1A537EA6A730BA15735E2582F2A3A1933BB6BFBE-1&
state=4d05af083b4ccaf9ece3ce5221e8d310cf4ac1c8bcc15ad3c217922b1dbebbde&
scope=system/Task.*+patient/Patient.read+openid+fhirUser+launch+launch/patient HTTP/1.1
Opvragen access_token met launch context
De AM stuurt een RFC6749 Token Exchange Request. Hier volgt een voorbeeld.
POST https://dva-aanbiedersmodules.test.medmij.nl/identity/connect/token
Accept: application/json
Authorization: Basic ZHZhYWFuYmllZGVyc21vZHVsZXN3ZWI6
User-Agent: DVAAanbiedersModules
Content-Type: application/x-www-form-urlencoded
grant_type = authorization_code
code = A970E84A8878AD542902D49B1A537EA6A730BA15735E2582F2A3A1933BB6BFBE-1
redirect_uri = https://module.5im.nl/web/api/smartonfhir/callback
code_verifier = 0bcuhhET_MCknrc-Rxd-IfHlRdFfWpaNF_0C_xPfXVM
Toekennen access_token en launch context
De DVA stuurt aan AM een RFC6749 Token Exchange Response. De headers zijn weggelaten. De payload is in JSON format. Hier volgt een voorbeeld.
HTTP/1.1 200 OK
{
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjMzNThDQTM1RTM1RDc2Njc…",
"access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjMzNThDQTM1RTM1RDc2Njc…",
"expires_in": 3600,
"token_type": "Bearer",
"scope": "system/Task.* patient/Patient.read openid fhirUser launch launch/patient",
"resource": "Task/ProviderModule-SubTask-Meetopdracht-Bloeddrukmeting-13",
"intent": "startmodule",
"return_url": "https://pgo-aanbiedersmodules.test.medmij.nl/web?dvaname=medrie",
"patient": "ProviderModule-Patient-Van-Duinen"
}
Het id_token is een JWT, en bevat ook de nonce.
Dit is het einde van de dialoogvoorbeelden.