Solution 1
@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 "Authentification" as Authentification {
rectangle "Keycloak\n(OIDC Server)" as Keycloak #E8F5E9
rectangle "Proxy eSanté DevBox\n(IdP)" as Proxy {
rectangle "2a - Vérification login_hint / ID national" as Step1
rectangle "2b - Si ID National absent, écran de saisie idNat" as Step2
rectangle "2c - Affichage code App e-CPS" as Step3
}
' rectangle "Proxy eSanté DevBox Santé\n(Identity Provider)" as Proxy #FFF3E0
rectangle "Pro Santé Connect\n(PSC)" as PSC #F3E5F5
}
' --- Liaisons principales ---
Front -[#green]-> Keycloak : 1- Authentification OIDC\n(Login / Redirect)
Keycloak -[#blue]-> Step1 : 2 - Délégation d'authentification\n(IdP externe)
Step1 -[#blue]-> Step2
Step2 -[#blue]-> Step3
Step3 -[#blue]-> PSC : 3 - Authentification PSC
PSC -[#blue,dashed]-> Proxy : 4 - Renvoie PSC Token
Proxy -[#blue,dashed]-> Keycloak : 5 - Renvoie PSC Keycloak
Keycloak -[#green,dashed]-> Front : 6 - Renvoie Token Keycloak
@enduml
Configuration de Keycloak
Identity providers
Ajouter un Identity Provider de type OpenID Connect.
- Alias : au choix
- Discovery endpoint : https://{proxy-url}/.well-known/openid-configuration
Keycloak va compléter les urls comme suit :

Pensez à rajouter le Logout URL et modifier l’issuer une fois l’idp enregistré:
- Logout URL : https://{proxy-url}/connect/logout
Pour l’instant nous avons pris le parti de ne faire que proxy pour l’authentification, ainsi le token reçu par keycloak est celui de PSC
Autres paramètres:
- Client authentication : Client secret sent in the request body
- Client ID :
qui doit correspondre à la variable OAUTH2_CLIENT_ID passé au lancement du proxy - Client Secret :
qui doit correspondre à la variable OAUTH2_CLIENT_SECRET passé au lancement du proxy - Pass login_hint : true (variable optionnelle à utiliser pour pré-renseigner l’idNational lors de l’authentification)
- Disable nonce : true (non disponible pour le POC)
Pour l’instant le clientId doit correspondre au AUTH_CLI de votre certificat. Nous n’avons pas reussi à passer le clientId du client keycloak. Il faut donc pour le moment définir un IDP par clientID.
Enregistrer
Puis dans l’onglet Mappers, ajouter psc-session-id :

Clients
Vous pouvez créer un client pour chaque certificat client de l’IGC. Ce client doit être présent dans la configuration du proxy.
La configuration est standard :
- Client ID :
qui doit correspondre à AUTH_CLI de votre certificat: https://pfc.eservices.esante.gouv.fr/pfcng-ihm/authentication.xhtml et devra être enregistré dans le proxy en tant que client autorisé - Authentication flow : Standard flow

La seule spécificité est d’ajouter dans le token généré le proxy_session_id via le client scopes :
- Client scopes -> scope <client_id>-dedicated -> Add Mapper by configuration -> user attributes

Configuration du proxy
Le proxy est packagé avec docker. image: repo.dev.coop/eproxy/eproxy-idp-poc:latest
Un certain nombre de paramètres sont configurables.
Paramètres obligatoires:
- OAUTH2_SERVER_ISSUER : url du serveur IDP utilisé pour .well-known/openid-configuration
- SERVER_PORT
- MONGO_DB_URI (une version ultérieure permettra de tout configurer et logger en file system)
- SPRING_PROFILES_ACTIVE: IDP (possibilité de rajouter SWAGGER)
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' \
eproxy repo.dev.coop/eproxy/eproxy-idp-poc:latest
Configuration EDC
La configuration des clients et des routes vers les API de l’espace de confiance seront disponibles via une interface d’administration
Keycloak
L’utilisation du nonce sera mis en place dans la version finale. Le refresh Token via keycloak et l’harmonisation de la durée de vie des sessions est à faire.
Session/RefreshToken
Un travail doit encore être effectué pour synchroniser les différentes sessions