Dossiers patients informatisés-12 minutes de lecture

Lancement de l'application SMART on FHIR : lancement du DSE par rapport aux applications autonomes, iss, aud et PKCE

Implémentez SMART App Launch 2.2.0 contre Epic et d'autres DSE : lancement de DSE par rapport à autonome, iss et aud, le jeton de lancement, PKCE S256, et pourquoi le bac à sable Epic n'est pas en production.

Ala Ben Aicha

Lancement de l'application SMART on FHIR : lancement du DSE par rapport aux applications autonomes, iss, aud et PKCE

Réponse directe

Le lancement du DSE passe par iss et un jeton de lancement opaque ; autonome ne le fait pas. Autoriser avec aud égal à la base FHIR et PKCE S256. Traitez le bac à sable Epic par rapport à la production comme une matrice de test, et non comme un SLA.

Mappage du mode de lancement

Fixez la version de Lancement de l'application SMART 2.2.0 (STU 2.2, paquet hl7.fhir.uv.smart-app-launch#2.2.0, généré le 30 avril 2024, sur FHIR R4). L'IG prend en charge quatre cas d'utilisation : patient autonome, lancement du portail patient, fournisseur autonome, lancement du portail fournisseur. Cette page est la poignée de main de lancement et de jeton, et non un didacticiel FHIR ressource par ressource - cela reste le Guide d'intégration FHIR. La saveur du fournisseur par rapport à Cerner/Oracle Health est la Comparaison Epic vs Cerner.

Mode Comment démarre l'application Paramètres de lancement Autoriser les extras Contexte du jeton
Lancement du DSE L'utilisateur se trouve déjà dans un graphique ou un portail ; DSE ouvre l'URL de lancement enregistrée iss = URL de base FHIR ; launch = poignée opaque Portée launch plus launch={token}; aud est égal que iss Fournitures DSE patient / encounter de la session en cours
Lancement autonome L'utilisateur ouvre l'application en dehors du DSE Aucun Portée launch/patient (et/ou launch/encounter); aud = la base FHIR que vous comptez appeler Le serveur d'autorisation collecte le contexte (souvent un sélecteur de patients)

La découverte est GET {iss}/.well-known/smart-configuration (Lancement du DSE) ou GET {fhir-base}/.well-known/smart-configuration (autonome). Vous avez besoin authorization_endpoint, token_endpoint, et code_challenge_methods_supported y compris S256.

Autoriser (minimum) :

Paramètre Lancement du DSE Autonome
response_type code code
client_id enregistré enregistré
redirect_uri URI enregistré exact URI enregistré exact
scope launch + scopes cliniques + optionnel openid fhirUser launch/patient + périmètres cliniques
state imprévisible, lié à la session pareil
aud Base de ressources FHIR (pareil que iss) Base de ressources FHIR que vous appellerez
launch faire écho au jeton opaque omettre
code_challenge / code_challenge_method S256 PKCE S256 PKCE

Toutes les applications SMART DEVRAIENT prendre en charge PKCE. Les serveurs DEVRAIENT prendre en charge S256 et NE DEVRA PAS prendre en charge plain. POST d'échange de jetons grant_type=authorization_code, le code, pareil redirect_uri, et code_verifier. Les applications publiques ne peuvent pas protéger un secret client ; les applications confidentielles devraient préférer l’authentification client asymétrique lorsque le DSE la propose.

aud existe donc un véritable jeton de porteur n'est pas envoyé à un serveur de ressources contrefait. Le serveur de ressources doit vérifier que le jeton a été émis pour c'est Base FHIR. Si aud ≠ le serveur que vous appelez, attendez-vous à un jeton rejeté même lorsque l'échange de code a réussi.

Pièges d'identification

Piège Qu'est-ce qui casse Corriger
iss hôte ≠ aud hôte Le jeton fonctionne en découverte, 401 sur Patient lu Lancement du DSE : aud c'est le lancement iss. Ne réécrivez pas le nom d’hôte sur un « joli » proxy
Jeton de lancement non répercuté EHR ne peut pas lier la requête OAuth au graphique Portée launch et requête launch= avec la même valeur opaque
ID client Sandbox en production Problème Epic (et autres) deux identifiants clients ID de non-production par rapport au bac à sable ; ID de production uniquement après « prêt pour la production »
Vérificateur PKCE perdu lors de la redirection invalid_grant Magasin code_verifier dans le stockage spécifique à l'application, saisi par state, pas dans un cookie lisible par tous
redirect_uri dérive à barre oblique finale Autorisation refusée Correspondance octet par octet avec enregistrement
Suite à un reference vers un autre hôte FHIR avec le même porteur Vol de jetons/mauvais public Nouvelle autorisation pour cela aud; ne pas transmettre le jeton

Sujet de test spécifique à Epic, pas une promesse de livraison : Epic sur FHIR documente un bac à sable actuel à https://fhir.epic.com/interconnect-fhir-oauth/ et des bases distinctes de membres de la communauté de production. Backend OAuth est un JWT vers le point de terminaison du jeton (SMART Backend Services, avec des différences Epic). Le bac à sable mappe automatiquement votre client à un utilisateur ; un membre de la communauté Epic en production a besoin d'un ECSA pour mapper l'ID client à un utilisateur d'audit avant un jeton backend est émis. Capacité, étendues et sélection des patients différer entre le bac à sable et ce membre. Mettez ces deltas sur la matrice de test. N'inventez pas un SLA « App Orchard de 8 semaines » – App Orchard est retiré, et aucune durée ici n'est une citation.

Jeux de données de test

Désidentifié. Ces URL et jetons sont des formes et non des informations d'identification.

URL de lancement du DSE que le DSE ouvre :

https://app.example.org/launch?iss=https%3A%2F%2Fehr.example.org%2Ffhir&launch=xyz123

Autoriser (sauts de ligne pour la lecture) :

https://ehr.example.org/authorize?
  response_type=code&
  client_id=growth-chart-example&
  redirect_uri=https%3A%2F%2Fapp.example.org%2Fafter-auth&
  launch=xyz123&
  scope=launch%20patient%2FPatient.rs%20patient%2FObservation.rs%20openid%20fhirUser&
  state=98wrghuwuogerg97&
  aud=https%3A%2F%2Fehr.example.org%2Ffhir&
  code_challenge=YPXe7B8ghKrj8PsT4L6ltupgI12NQJ5vblB07F4rGaw&
  code_challenge_method=S256

Omissions autonomes launch et utilise scope=launch/patient patient/Patient.rs ... avec le même aud discipline.

Tests minimaux :

  1. Lancement du DSE : iss capturé, launch fait écho, aud == iss, PKCE aller-retour, patient sur la réponse symbolique.
  2. Autonome : sélecteur de patients, launch/patient accordé, pas de reste launch paramètre.
  3. Faux aud (jeton demandé pour le serveur A, appelez le serveur B) – doit échouer.
  4. La relecture d'un code d'autorisation doit échouer.
  5. Epic (ou analogique) : ID client sandbox par rapport au sandbox ; ID client de production par rapport à une base membre FHIR ; documenter la première portée qui existe dans l’un et pas dans l’autre.

Ne commettez jamais de vrais secrets client, JWK ou jetons d’accès. Faites pivoter tout ce qui a été dans une capture d'écran.

Modes de défaillance et restauration

Échec Détection Restauration
Utilisateur bloqué sur l'autorisation Manquant state cookies tiers aller-retour ou bloqués dans une iframe DSE Sortez de l'iframe si le DSE l'exige ; ne jamais laisser tomber state
Jeton pour le mauvais patient patient sur le jeton ≠ contexte graphique Contexte du jeton de confiance, pas un identifiant Patient de l'application mise en cache depuis le dernier lancement
Actualiser après la déconnexion online_access contre offline_access confusion Le lancement du DSE nécessite généralement un accès en ligne ; ne faites pas de demande hors ligne, sauf si le produit nécessite réellement un accès sans surveillance
Portées Sandbox uniquement dans une version client Première production 403 Matrice de portée : bac à sable × un membre non-prod × prod ; expédier l'intersection
Secret confidentiel dans un SPA public Secret client extractible Public + PKCE, ou un BFF qui détient le secret

Désactivez une application qui se comporte mal en révoquant le client au niveau du DSE et en tournant les clés. Il n'y a pas d'« annulation de lancement » autre que le rejet du jeton et le renvoi de l'utilisateur au graphique.

Service associé

Si vous avez besoin d'un lancement SMART orienté vers Epic (fournisseur intégré, patient autonome ou matrice de test par rapport au bac à sable par rapport à un membre), c'est-à-dire Intégration Epic. Pour un pic de lancement limité, utilisez formulaire de contact projet.

Cette page n'est pas une liste d'Epic Showroom, ni une adhésion aux services des fournisseurs, ni une évaluation de sécurité, ni une chronologie. Services backend JWT vs patient vs fournisseur SMART est le Epic FHIR pour les startups HealthTech page de décision.

SMART on FHIROAuth 2.0PKCEÉpiqueLancement de l'applicationFHIREHRInteropérabilité

Lectures et services associés

Poursuivons la conversation

Vous avez des questions sur ce sujet ? J'aimerais avoir de vos nouvelles.