Services EDC / MsSanté

Services de l’Espace de confiance et la 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.

platine_application.png

platine_test_mockService.png

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'