Gestion du Contexte

Gestion du contexte d’appel

Toutes transactions vers le DMP se fait en précisant un DMPCContext et une requête spécifique en argument d’une méthode du DMPCClient.

Le DMPCContext contient les informations permettant de définir :

  • L’auteur de la transaction,
  • Le code de confidentialité de la transaction (connexion secrète, invisible aux représentants légaux du patient).

À ce DMPCContext est associé un autre argument dépendant de la transaction réalisée.

En authentification directe (depuis version 3.1)

En authentification directe, l’utilisateur personnel de santé est authentifié par sa carte CPS/CPE, ces informations sont récupérées lors de la lecture de la carte CPS.

Cas particulier des cartes CPE non nominatives, où le nom du service est demandé : context.author.service.nom (cf. authentification indirecte)

En authentification indirecte (depuis version 1.0)

En authentification indirecte, seule la structure de santé (par son certificat serveur) est authentifiée.

L’auteur de la requête, c’est à dire le personnel de santé utilisateur (DMPCPersonnelSante), doit donc être authentifié soit localement soit par son rpps/adeli. L’information du service au sein d’un établissement doit être donné (aucune vérification mais doit être présent).

Exemple Java :

DMPCContext context = new DMPCContext();
DMPCPersonnelSante ps = new DMPCPersonnelSante();
// ps.setInternalId("1234567890");
ps.setRpps("899700433153");
ps.setNom("MEDECIN RPPS 123");
ps.setPrenom("Virginie");
ps.setRole("10"); // Médecin  dans la nomenclature DMPCCode.JeuxValeursDMP.SUBJECT_ROLE      
ps.setSpecialite("G15_10/SM30"); // G15_10/SM30 Néphrologie  dans la nomenclature DMPCCode.JeuxValeursDMP.AUTHOR_SPECIALITY
ps.setSecteurActivite("SA01");  // Etablissement public de santé dans la nomenclature DMPCCode.JeuxValeursDMP.HEALTH_CARE_FACILITY_TYPE_CODE
ps.getService().setNom("Service néprhologie");  // nom du service au sein d'un établissement.
context.setAuthor(ps);

Exemple curl :

curl --request POST '/dmp/tdxxxx' \
--data-raw '{
    "context": {
         "author" : {
            "rpps" : "899700433156",
            "nom" : "MEDECIN RPPS0043315",
            "prenom" : "VIRGINIE",
            "role" : "10",
            "specialite" : "G15_10/SM26",
            "secteurActivite" : "SA07",
            "structureSante" : {
                "idNational" : "499700433156004",
                "nom" : "CABINET MME MEDECIN0043315"
            },
            "service" : {
               "nom" : "Service pédiatrie"
             }
         },
        "modeAcces": {
            "acces": "NORMAL"
        }
    },
    "request": {
        ...
    }
}'

Remarque: l’idNational de la structureSante est déduite du certificat si non renseigné. Le renseigner peurt avoir un impact et mettre en œuvre le mode EJ/EG.

Mode EJ/EG en authentification indirecte

En fonction du déploiement, nous pouvons vouloir authentifier la structure Juridique de l’établissement pour un établissement géographique ou encore déployer que des certificats liés au FINESS Géographique. Le tableau ci-dessous reprend l’ensemble des exigences du GIE Sesam-Vitale en la matière

EJ_EG récapitulatif

Pour vous cet intégration sera toute simple,

Mode EG : Vous utilisez un certificat EG (Établissement Géographique) pour vous connecter, toutes les informations de l’établissement (DMPCStructureSante) pour l’alimentation du DMP et l’authentification (VIHF) seront déduites du certificat.

Mode EJ/EG (assouplissement): Vous utilisez un certificat EJ (Établissement Juridique) pour vous connecter et vous précisez dans le contexte d’appel, l’identifiant Finess Géographique de la structure du professionnel. Alors les différents identifiants (celui de l’EJ dans le certificat, et celui de l’EG donné dans le contexte) seront utilisés à bon escient dans les différents champs des transactions (VIHF, Soumission XDS, Document XDS, Document CDA, Document de signature XADES.

Passage de l’EG dans le contexte des requêtes :

{
    "author": {
        "structureSante": {
            "idNational": "10B0130811",
            ...
        }
        ...
    }
}

En Authentification Indirecte Renforcee (depuis version 6.0)

Le mode renforcé de l’authentification indirecte se distingue par le fait que l’authentification de l’utilisateur fait en amont respecte les critères précis définis dans le référentien d’exigences du DMP : /6.x/connecteurs/dmp/authentifications/indirecte_renforce/

Il se traduit techniquement dans la DevBox-santé DMP par l’ajout de deux informations supplémentaires dans le contexte :


{
    "context" : {
        "author": {
            ...
        },
        "authentificationIndirecteRenforcee" : true,
        "samlAuthnContext" : "urn:oasis:names:tc:SAML:2.0:ac:classes:Password"
    },
    "request": {
        ...
    }
}

le samlAuthnContext pouvant prendre les valeurs suivantes :


IP_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:InternetProtocol"),
IP_PASSWORD_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:InternetProtocolPassword"),
KERBEROS_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:Kerberos"),
MOFU_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:MobileOneFactorUnregistered"),
MTFU_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:MobileTwoFactorUnregistered"),
MOFC_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:MobileOneFactorContract"),
MTFC_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:MobileTwoFactorContract"),
PASSWORD_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:Password"),
PPT_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"),
PREVIOUS_SESSION_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:PreviousSession"),
X509_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:X509"),
PGP_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:PGP"),
SPKI_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:SPKI"),
XML_DSIG_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:XMLDSig"),
SMARTCARD_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:Smartcard"),
SMARTCARD_PKI_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:SmartcardPKI"),
SOFTWARE_PKI_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:SoftwarePKI"),
TELEPHONY_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:Telephony"),
NOMAD_TELEPHONY_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:NomadTelephony"),
PERSONAL_TELEPHONY_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:PersonalTelephony"),
AUTHENTICATED_TELEPHONY_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:AuthenticatedTelephony"),
SRP_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:SecureRemotePassword"),
TLS_CLIENT_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:TLSClient"),
TIME_SYNC_TOKEN_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken"),
UNSPECIFIED_AUTHN_CTX("urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified"),;

En fonction de l’authentification réalisée en amont.