Services EDC / MsSanté
@startuml
!include https://bitbucket.org/devbox-sante/plantuml/raw/current/themes/theme-devbox-sante.puml
rectangle "Application cliente" as AppCli {
rectangle "Front Application" as Front #E3F2FD
rectangle "Backend Application" as Backend #E1F5FE
}
rectangle "Proxy eSanté DevBox\n(IdP)" as Proxy #FFF3E0
rectangle "Pro Santé Connect\n(PSC)" as PSC #F3E5F5
rectangle "MS Santé" as MSSANTE #FBE9E7
rectangle "Service Espace de confiance" as TrustService #FBE9E7
' --- Liaisons principales ---
Front -[#green]-> Backend : 1 - Appel MsSanté\navec Bearer Token Keycloak
Backend -[#green]-> Proxy : 2 - Echange Token Keycloak → Token PSC
Proxy -[#green]-> PSC : 3 - Validation / Refresh du token PSC
PSC -[#green,dashed]-> Proxy : 4 -Renvoie Token PSC
Proxy -[#green,dashed]-> Backend : 5 -Renvoie Token PSC
Backend -[#green]-> MSSANTE : 6 - Appel MsSanté\navec Token PSC
Front -[#blue]-> Backend : 7 - Appel API EDC\navec Bearer Token Keycloak
Backend -[#blue]-> Proxy : 8 - Appel Api EDC \navec Bearer Token Keycloak
Proxy -[#blue]-> PSC : 9 - Echange Token PSC -> Token EDC
PSC -[#blue,dashed]-> Proxy : 10 -Renvoie Token EDC
Proxy -[#blue]-> TrustService : 11 - Appel Api EDC \navec Token EDC
' --- Légende ---
legend bottom
== Légende ==
#vert : Appel MSSanté
#bleu : Appel Api EDC
endlegend
@enduml
Proxy <-> Keycloak <-> Platine
Afin de tester le proxy 2 routes ont été configurées (par la suite ces routes seront configurables via une interface)
- backend-insi: /send/insi/{endpoint}
- backend-mockApiPsc: /send/apipsc/{endpoint}
Le backend INSI est un service pour l’instant mocké tant que nous n’avons pas accès à l’environnement de test
Le mockApiPsc est un service de test accessible via les tests platines, l’url de ce dernier change à chaque lancement de la VM sur platine. Vous devez lancer le test Mock Service et récupérer son url. Il faut donc relancer le docker avec la nouvelle url à chaque fois:
- BACKEND_MOCK_API
Attention le certificat p12 utilisé pour lancer le Mock Service doit correspondre au certificat du client que vous utilisez. L’IP configuré doit aussi correspondre à celle du proxy.


Pour les clients type LGC, le proxy est configuré pour le POC par défaut avec 2 clients ans-odc-lps1-edc-bas et ans-odc-lps2-edc-bas (par la suite ces clients seront configurables via une interface) Ces 2 clients ont besoin d’un certificat p12 et d’un secret
- PSC_CLIENT_LPS1_SECRET
- PSC_CLIENT_LPS1_CERT
- PSC_CLIENT_LPS2_SECRET
- PSC_CLIENT_LPS2_CERT Il faut monter un volume afin d’accéder à ces certificats sur le file system.
Exemple
docker run -d --name -p 443:8443 \
-e 'SPRING_PROFILES_ACTIVE=IDP' \
-e 'OAUTH2_SERVER_ISSUER=https://eproxy-test.devbox-sante.fr/' \
-e 'SERVER_PORT=8443' \
-e 'MONGO_DB_URI=mongodb://mongodb:27017/eProxy' \
-e 'BACKEND_MOCK_API=https://9055c231-6447-4691-8eab-89588651b9ab.mockservice.platines.esante.gouv.fr' \
-v /opt/certificat:/certificat
-e 'PSC_CLIENT_LPS1_SECRET=secret' \
-e 'PSC_CLIENT_LPS1_CERT=/certificat/lps1.p12' \
-e 'PSC_CLIENT_LPS2_SECRET=secret' \
-e 'PSC_CLIENT_LPS2_CERT=/certificat/lps2.p12' \
eproxy repo.dev.coop/eproxy/eproxy-idp-poc:latest
https
Le proxy peut être configuré en SSL
- SSl_ENABLED: true/false (par défaut false)
- KEYSTORE_CERTIFICAT_PATH
- KEYSTORE_KEY_PATH
- SERVER_DOMAIN pour la génération du certificat autosigné ou via let’s encrypt
Exemple en partageant un volume:
-e 'SSl_ENABLED=true' -v /etc/ssl/eproxy-test:/etc/ssl/eproxy-test -e 'KEYSTORE_KEY_PATH=/etc/ssl/eproxy-test/privkey.pem' -e 'KEYSTORE_CERTIFICAT_PATH=/etc/ssl/eproxy-test/fullchain.crt' -e 'SERVER_DOMAIN=eproxy-test.devbox-sante.fr'
Si les certificats ne sont pas présents, le proxy génère des certificats auto-signés.
Si votre fournisseur de nom de domaine est compatible avec ACME, il est également possible de générer les certificats avec Let’s Encrypt en ajoutant aux précédents paramètres la configuration acme:
-e 'SPRING_PROFILES_ACTIVE=IDP,letsEncrypt' -e 'GANDI_KEY=$GANDI_KEY'
Backend LGC <-> Proxy
Token exchange
Afin d’obtenir le token de PSC pour notamment la MSS, le proxy dispose du service suivant:
GET /token
Host: mon-proxy.com
Authorisation: Bearer Keycloak token
Réponse:
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"id_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
Si le token est expiré, le service effectue automatiquement le refresh afin d’envoyer la réponse
Appel service Espace de confiance
Les services de l’EDC sont définis dans la configuration
Exemple:
- id: backend-mockApiPsc
uri: ${BACKEND_MOCK_API:https://9055c231-6447-4691-8eab-89588651b9ab.mockservice.platines.esante.gouv.fr}
predicates:
- Path=/send/apipsc/{endpoint}
filters:
- SetPath=/mockservice/apipsc/{endpoint}
Ainsi pour appeler ce service, il faut utiliser le path défini:
POST/GET /send/apipsc/{endpoint}
Host: mon-proxy.com
Authorisation: Bearer Keycloak token
ce qui aura pour effet d’appeler:
https://9055c231-6447-4691-8eab-89588651b9ab.mockservice.platines.esante.gouv.fr/mockservice/apipsc/{endpoint}
avec le token obtenu par le proxy à partir du token PSC.
Scalabilité / Redis
Afin de pouvoir déployer plusieurs proxy, la session du proxy doit pouvoir être partagé entre les différentes instances. Redis a été mis en place pour partager les sessions.
Pour activer redis:
- SPRING_PROFILES_ACTIVE: redis
- REDIS_HOST: localhost par défaut
- REDIS_PORT: 6379 par défaut
Exemple :
-e 'SPRING_PROFILES_ACTIVE=IDP,redis' -e 'REDIS_HOST=localhost' -e 'REDIS_PORT=6379'