Solution 1

Proxy en tant que Identity Provider (IDP) pour Keycloak

@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 : keycloak_idp.png

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 : keycloak_idp_mapper.png

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 :

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 keycloak_client_scope.png

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