Questa pagina descrive come utilizzare le risorse FHIR Consent per determinare l'accesso ai dati degli archivi FHIR nell'API Cloud Healthcare.
Configura un archivio con controllo dell'accesso dell'accesso attivato
Per configurare un archivio FHIR con l'applicazione del consenso, completa i seguenti passaggi:
Crea un archivio FHIR se non ne hai già uno.
Imposta i seguenti parametri
ConsentConfig
del datastore FHIR per attivare l'applicazione del consenso:version
: specifica la versione dell'applicazione del consenso utilizzata per il datastore FHIR. Questo valore può essere impostato una sola volta daCreateFhirStore
oUpdateFhirStore
. Una volta impostata, devi chiamareApplyConsents
oApplyAdminConsents
per modificare la versione.access_enforced
: se viene impostata l'opzionetrue
, quando si accede alle risorse FHIR, le intestazioni di consenso fornite vengono verificate in base alle direttive di consenso fornite dai consumatori.consent_header_handling
: Se impostato suPERMIT_EMPTY_SCOPE
(impostazione predefinita), il server consente richieste senza intestazioneX-Consent-Scope
(o vuota). Se impostato suREQUIRED_ON_READ
eaccess_enforced
=true
, il server rifiuta tutte le richieste senza (o vuota) intestazioneX-Consent-Scope
.
Configura un nuovo datastore FHIR con ConsentConfig
curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json" \ --data "{ 'version': 'R4', 'enableUpdateCreate': true, 'consentConfig': { 'version': 'V1', 'accessEnforced': true } }" "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores?fhirStoreId=FHIR_STORE_ID"
Dovresti ricevere una risposta JSON simile alla seguente:
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID", "version": "R4", "enableUpdateCreate": true, "consentConfig": { "version": "V1" } }
Se hai già un negozio, utilizza UpdateFhirStore
per impostare
ConsentConfig
con l'applicazione del consenso version
come
V1
e imposta accessEnforced
su true
.
curl -X PATCH \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json" \ --data "{ 'consentConfig': { 'version': 'V1', 'accessEnforced': true } }" "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?update_mask=consentConfig"
Definisci le norme utilizzando la risorsa consenso
I criteri sono rappresentati tramite la risorsa consenso. Lo scopo e l'utilizzo dei campi delle risorse sono descritti nella documentazione del modello di dati.
Ecco un esempio di tutte le risorse che possono essere create per questo particolare esempio.
Creare risorse FHIR
Il seguente esempio mostra come eseguire un [bundle FHIR](/healthcare-api/docs/how-tos/fhir-bundles) per popolare le seguenti risorse:
- Una risorsa Practitioner con il nome Jeffrey Brown
- Una risorsa Patient con il nome Darcy Smith
- Una risorsa Observation che mostra la misurazione dell'emoglobina di Darcy
(LOINC
718-7
) raccolta dall'ospedale Happy Hospital - Una risorsa Observation che mostra la misurazione del glucosio di Darcy
(LOINC
15074-8
). - Un consenso di Darcy per consentire a Jeffrey Brown di utilizzare l'applicazione
App/123
per accedere ai suoi dati raccolti da Happy Hospital - Un consenso di Darcy per consentire a Jeffrey Brown di accedere a tutti i suoi dati per
trattamento di emergenza
(
ETREAT
) - Un consenso dell'Happy Hospital per consentire a Jeffrey Brown di accedere a tutti i dati
durante la ricerca biomedica (
BIORCH
) con l'applicazioneApp/golden
cat > bundle.json << 'EOF' { "resourceType": "Bundle", "type": "transaction", "entry": [ { "request": {"method": "PUT", "url": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"}, "resource": { "active": true, "birthDate": "1970-05-23", "gender": "male", "id": "12942879-f89f-41ae-aa80-0b911b649833", "name": [{ "family": "Brown", "given": ["Jeffrey"], "use": "official" }], "resourceType": "Practitioner" } }, { "request": {"method": "PUT", "url": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"}, "resource": { "active": true, "birthDate": "1990-01-01", "gender": "female", "id": "3c6aa096-c054-4c22-b2b4-1e4a4d203de2", "name": [{ "family": "Smith", "given": ["Darcy"], "use": "official" }], "meta": { "tag": [{ "system": "http://terminology.hl7.org/CodeSystem/common-tags", "code": "employee" }] }, "resourceType": "Patient" } }, { "request": {"method": "PUT", "url": "Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"}, "resource": { "id": "7473784b-46a8-470c-b9a6-fe38a01025aa", "meta": {"source": "http://example.com/HappyHospital"}, "code": { "coding": [{ "code": "718-7", "system": "http://loinc.org", "display": "Hemoglobin [Mass/volume] in Blood" }] }, "effectivePeriod": {"start": "2021-12-10T05:30:10+01:00"}, "issued": "2021-12-10T13:30:10+01:00", "resourceType": "Observation", "status": "final", "subject": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"}, "valueQuantity": { "code": "g/dL", "system": "http://unitsofmeasure.org", "unit": "g/dl", "value": 7.2 } } }, { "request": {"method": "PUT", "url": "Observation/68583624-9921-4158-8754-2a306c689abd"}, "resource": { "id": "68583624-9921-4158-8754-2a306c689abd", "code": { "coding": [{ "code": "15074-8", "system": "http://loinc.org", "display": "Glucose [Moles/volume] in Blood" }] }, "effectivePeriod": {"start": "2021-12-01T05:30:10+01:00"}, "issued": "2021-12-01T13:30:10+01:00", "resourceType": "Observation", "status": "final", "subject": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"}, "valueQuantity": { "code": "mmol/L", "system": "http://unitsofmeasure.org", "unit": "mmol/l", "value": 6.3 } } }, { "request": {"method": "PUT", "url": "Consent/10998b60-a252-405f-aa47-0702554ddc8e"}, "resource": { "category": [{ "coding": [{ "code": "59284-0", "system": "http://terminology.hl7.org/CodeSystem/consentcategorycodes" }] }], "id": "10998b60-a252-405f-aa47-0702554ddc8e", "patient": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"}, "policyRule": { "coding": [{ "code": "OPTIN", "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode" }] }, "provision": { "actor": [ { "reference": {"reference": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"}, "role": { "coding": [{ "code": "GRANTEE", "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode" }] } } ], "extension": [ { "url": "https://g.co/fhir/medicalrecords/Environment", "valueCodeableConcept": { "coding": [{ "code": "123", "system": "App" }] } }, { "url": "https://g.co/fhir/medicalrecords/DataSource", "valueUri": "http://example.com/HappyHospital" } ], "type": "permit" }, "resourceType": "Consent", "scope": { "coding": [{ "code": "patient-privacy", "system": "http://terminology.hl7.org/CodeSystem/consentscope" }] }, "status": "active" } }, { "request": {"method": "PUT", "url": "Consent/73c54e8d-2789-403b-9dee-13085c5d5e34"}, "resource": { "category": [{ "coding": [{ "code": "59284-0", "system": "http://terminology.hl7.org/CodeSystem/consentcategorycodes" }] }], "id": "73c54e8d-2789-403b-9dee-13085c5d5e34", "patient": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"}, "policyRule": { "coding": [{ "code": "OPTIN", "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode" }] }, "provision": { "actor": [ { "reference": {"reference": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"}, "role": { "coding": [{ "code": "GRANTEE", "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode" }] } } ], "purpose": [{ "code": "ETREAT", "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason" }], "type": "permit" }, "resourceType": "Consent", "scope": { "coding": [{ "code": "patient-privacy", "system": "http://terminology.hl7.org/CodeSystem/consentscope" }] }, "status": "active" } }, { "request": {"method": "PUT", "url": "Consent/5c8e3f8a-9fd5-480d-a08e-f29b89feccde"}, "resource": { "category": [{ "coding": [{ "code": "57017-6", "system": "http://loinc.org" }] }], "id": "5c8e3f8a-9fd5-480d-a08e-f29b89feccde", "patient": {}, "extension": [{ "url": "https://g.co/fhir/medicalrecords/ConsentAdminPolicy" }], "policyRule": { "coding": [{ "code": "OPTIN", "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode" }] }, "provision": { "actor": [ { "reference": {"reference": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"}, "role": { "coding": [{ "code": "GRANTEE", "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode" }] } } ], "purpose": [{ "code": "BIORCH", "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason" }], "extension": [ { "url": "https://g.co/fhir/medicalrecords/Environment", "valueCodeableConcept": { "coding": [{ "code": "golden", "system": "App" }] } } ], "type": "permit" }, "resourceType": "Consent", "scope": {}, "status": "active" } } ] } EOF curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/fhir+json; charset=utf-8" \ --data @bundle.json \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir"
Dovresti ricevere una risposta JSON simile alla seguente:
{ "entry": [ { "response": { "etag": "W/\"VERSION_ID\"", "lastModified": "2022-09-01T17:31:40.423469+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/12942879-f89f-41ae-aa80-0b911b649833/_history/VERSION_ID", "status": "201 Created" } }, { "response": { "etag": "W/\"VERSION_ID\"", "lastModified": "2022-09-01T17:31:40.423469+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2/_history/VERSION_ID", "status": "201 Created" } }, { "response": { "etag": "W/\"VERSION_ID\"", "lastModified": "2022-09-01T17:31:40.423469+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa/_history/VERSION_ID", "status": "201 Created" } }, { "response": { "etag": "W/\"VERSION_ID\"", "lastModified": "2022-09-01T17:31:40.423469+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/68583624-9921-4158-8754-2a306c689abd/_history/VERSION_ID", "status": "201 Created" } }, { "response": { "etag": "W/\"VERSION_ID\"", "lastModified": "2022-09-01T17:31:40.423469+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/10998b60-a252-405f-aa47-0702554ddc8e/_history/VERSION_ID", "status": "201 Created" } }, { "response": { "etag": "W/\"VERSION_ID\"", "lastModified": "2022-09-01T17:31:40.423469+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/73c54e8d-2789-403b-9dee-13085c5d5e34/_history/VERSION_ID", "status": "201 Created" } }, { "response": { "etag": "W/\"VERSION_ID\"", "lastModified": "2022-09-01T17:31:40.423469+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/5c8e3f8a-9fd5-480d-a08e-f29b89feccde/_history/VERSION_ID", "status": "201 Created" } } ], "resourceType": "Bundle", "type": "transaction-response" }
Di seguito sono riportati altri esempi di risorsa Consent R4 che mostrano come possono essere rappresentate le norme complesse.
Esempio di direttiva sul consenso del paziente
{ "resourceType": "Consent", "id": "patient-consent-example", "patient": { "reference": "Patient/f001" }, "category": [ { "coding": [ { "system": "http://loinc.org", "code": "59284-0" } ] } ], "scope": { "coding": [ { "system": "http://terminology.hl7.org/CodeSystem/consentscope", "code": "patient-privacy" } ] }, "policyRule": { "coding": [ { "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", "code": "OPTIN" } ] }, "status": "active", "provision": { "type": "permit", "actor": [ { "reference": { "reference": "Practitioner/f002" }, "role": { "coding": [ { "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", "code": "GRANTEE" } ] } } ], "purpose": [ { "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason", "code": "TREAT" } ], "class": [ { "system": "http://hl7.org/fhir/resource-types", "code": "Encounter" } ], "data": [ { "meaning": "instance", "reference": { "reference": "Encounter/e001" } } ], "extension": [ { "url": "https://g.co/fhir/medicalrecords/Environment", "valueCodeableConcept": { "coding": [ { "system": "iso3166-1", "code": "CA" } ] } }, { "url": "https://g.co/fhir/medicalrecords/DataTag", "valueCoding": { "system": "http://terminology.hl7.org/CodeSystem/common-tags", "code": "actionable" } }, { "url": "https://g.co/fhir/medicalrecords/DataTag", "extension": [ { "url": "https://g.co/fhir/medicalrecords/DataTag", "valueCoding": { "system": "http://example.com/custom-tags", "code": "archived" } }, { "url": "https://g.co/fhir/medicalrecords/DataTag", "valueCoding": { "system": "http://example.com/custom-tags", "code": "insensitive" } } ] }, { "url": "https://g.co/fhir/medicalrecords/DataSource", "valueUri": "http://somesystem.example.org/foo" } ], "securityLabel": [ { "system": "http://terminology.hl7.org/CodeSystem/v3-Confidentiality", "code": "R" }, { "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", "code": "PSY" } ] } }
L'esempio precedente rappresenta una risorsa Consent del paziente in cui un paziente
f001
concede l'autorizzazione a un medico f002
con
lo scopo di fornire un trattamento regolare rappresentato da TREAT
.
Il professionista proviene dalla geolocalizzazione iso3166-1/CA
. Questa
risorsa di consenso consente al medico di accedere ai dati del paziente se i
dati soddisfano tutte le seguenti condizioni.
- È un tipo
Encounter
con l'IDEncounter/e001
. - Proviene dalla fonte
http://somesystem.example.org/foo
. - Soddisfa almeno una delle seguenti condizioni sul tag (le risorse possono essere taggate impostando i campi
system
ecode
di Meta.tag): - Ha il tag (
system
=http://terminology.hl7.org/CodeSystem/common-tags
ecode
=actionable
) - Presenta entrambi i tag (
system
=http://example.com/custom-tags
ecode
=archived
) e (system
=http://example.com/custom-tags
ecode
=insensitive
) - Ha almeno una delle seguenti etichette di sicurezza
system
=http://terminology.hl7.org/CodeSystem/v3-Confidentiality
ecode
è uno dei seguenti valori:R
,N
,M
,L
,U
.system
=http://terminology.hl7.org/CodeSystem/v3-ActCode
ecode
=PSY
.
Esempio di direttiva dei criteri amministrativi
{ "resourceType": "Consent", "id": "admin-policy-example", "patient": {}, "extension": [{ "url": "https://g.co/fhir/medicalrecords/ConsentAdminPolicy" }], "category": [ { "coding": [ { "system": "http://loinc.org", "code": "57017-6" } ] } ], "scope": {}, "policyRule": { "coding": [ { "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", "code": "OPTIN" } ] }, "status": "active", "provision": { "type": "permit", "actor": [ { "reference": { "reference": "Practitioner/f002" }, "role": { "coding": [ { "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", "code": "GRANTEE" } ] } } ], "purpose": [ { "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason", "code": "TREAT" } ], "class": [ { "system": "http://hl7.org/fhir/resource-types", "code": "Encounter" } ], "data": [ { "meaning": "instance", "reference": { "reference": "Encounter/e001" } } ], "extension": [ { "url": "https://g.co/fhir/medicalrecords/Environment", "valueCodeableConcept": { "coding": [ { "system": "iso3166-1", "code": "CA" } ] } }, { "url": "https://g.co/fhir/medicalrecords/DataTag", "valueCoding": { "system": "http://terminology.hl7.org/CodeSystem/common-tags", "code": "actionable" } }, { "url": "https://g.co/fhir/medicalrecords/DataTag", "extension": [ { "url": "https://g.co/fhir/medicalrecords/DataTag", "valueCoding": { "system": "http://example.com/custom-tags", "code": "archived" } }, { "url": "https://g.co/fhir/medicalrecords/DataTag", "valueCoding": { "system": "http://example.com/custom-tags", "code": "insensitive" } } ] }, { "url": "https://g.co/fhir/medicalrecords/DataSource", "valueUri": "http://somesystem.example.org/foo" } ], "securityLabel": [ { "system": "http://terminology.hl7.org/CodeSystem/v3-Confidentiality", "code": "R" }, { "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", "code": "PSY" } ] } }
L'esempio precedente rappresenta una risorsa di consenso per le norme amministrative che concede l'autorizzazione
a un professionista f002
allo scopo di fornire un trattamento
regolare rappresentato da TREAT
. Il professionista proviene dalla
geolocalizzazione iso3166-1/CA
. Questa risorsa di consenso consente al
professionista di accedere ai dati del paziente se i dati soddisfano tutte le
seguenti condizioni:
- È un tipo
Encounter
con l'IDEncounter/e001
. - Proviene dalla fonte
http://somesystem.example.org/foo
. - Soddisfa almeno una delle seguenti condizioni relative al tag:
- Ha il tag (
system
=http://terminology.hl7.org/CodeSystem/common-tags
ecode
=actionable
) - Presenta entrambi i tag (
system
=http://example.com/custom-tags
ecode
=archived
) e (system
=http://example.com/custom-tags
ecode
=insensitive
) - Ha almeno una delle seguenti etichette di sicurezza
system
=http://terminology.hl7.org/CodeSystem/v3-Confidentiality
ecode
è uno dei seguenti valori:R
,N
,M
,L
,U
.system
=http://terminology.hl7.org/CodeSystem/v3-ActCode
ecode
=PSY
.
Esempio di direttiva dei criteri a cascata per l'amministratore
{ "resourceType": "Consent", "id": "admin-cascading-policy-example", "patient": {}, "extension": [ { "url": "https://g.co/fhir/medicalrecords/ConsentAdminPolicy" }, { "url": "https://g.co/fhir/medicalrecords/CascadingPolicy" } ], "category": [ { "coding": [ { "system": "http://loinc.org", "code": "57017-6" } ] } ], "scope": {}, "policyRule": { "coding": [ { "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", "code": "OPTIN" } ] }, "status": "active", "provision": { "type": "permit", "actor": [ { "reference": { "reference": "Practitioner/f002" }, "role": { "coding": [ { "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode", "code": "GRANTEE" } ] } } ], "purpose": [ { "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason", "code": "TREAT" } ], "class": [ { "system": "http://hl7.org/fhir/resource-types", "code": "Patient" } ], "extension": [ { "url": "https://g.co/fhir/medicalrecords/Environment", "valueCodeableConcept": { "coding": [ { "system": "iso3166-1", "code": "CA" } ] } }, { "url": "https://g.co/fhir/medicalrecords/DataTag", "valueCoding": { "system": "http://terminology.hl7.org/CodeSystem/common-tags", "code": "employee" } } ] } }
L'esempio precedente rappresenta una risorsa di consenso della policy a cascata dell'amministratore che concede
l'autorizzazione a un professionista f002
allo scopo di fornire
un trattamento regolare rappresentato da TREAT
. Il professionista proviene dalla
geolocalizzazione iso3166-1/CA
. Questa risorsa di consenso consente al
professionista di accedere ai dati del compartimento dei pazienti con il tag
employee
. Tutti i criteri delle risorse
si applicano solo alle risorse di base del compartimento, ovvero alla risorsa Patient, in quanto
controllano da quali risorse eseguire la propagazione a cascata.
Applicare i consensi dei pazienti o le norme amministrative
Applica i consensi del paziente ApplyConsents
curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json" \ --data "{'validateOnly': false}" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"
Dovresti ricevere una risposta JSON simile alla seguente:
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" }
La risposta contiene il nome di un'operazione. Per monitorare lo stato dell'operazione, puoi utilizzare il [metodo `get` dell'operazione](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get):
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
Al termine dell'operazione, il server restituisce una risposta con lo stato dell'operazione in formato JSON:
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"", "metadata": { "@type": "type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata", "apiMethodName": "google.cloud.healthcare.v1.fhir.FhirStoreService.ApplyConsents", "createTime": "CREATE_TIME", "endTime": "END_TIME", "logsUrl": "https://console.cloud.google.com/logs/query/CLOUD_LOGGING_URL", "counter": { "success": "2", "secondarySuccess": "5" } }, "done": true, "response": { "@type": "type.googleapis.com/google.cloud.healthcare.v1.fhir.ApplyConsentsResponse", "consentApplySuccess": "2", "affectedResources": "5" } }
Questa risposta indicava che il server ha elaborato correttamente 2 consensi e aggiornato l'accesso consensuale di 5 risorse (1 paziente, 2 consensi, 2 osservazioni).
Applica il criterio amministratore entro il giorno ApplyAdminConsents
curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json" \ --data "{ 'validateOnly': false, 'newConsentsList': { 'names': ['projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/5c8e3f8a-9fd5-480d-a08e-f29b89feccde/_history/VERSION_ID'] } }" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyAdminConsents"
Dovresti ricevere una risposta JSON simile alla seguente:
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" }
La risposta contiene il nome di un'operazione. Per monitorare lo stato dell'operazione, puoi utilizzare il [metodo `get` dell'operazione](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get):
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
Al termine dell'operazione, il server restituisce una risposta con lo stato dell'operazione in formato JSON:
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"", "metadata": { "@type": "type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata", "apiMethodName": "google.cloud.healthcare.v1.fhir.FhirStoreService.ApplyAdminConsents", "createTime": "CREATE_TIME", "endTime": "END_TIME", "logsUrl": "https://console.cloud.google.com/logs/query/CLOUD_LOGGING_URL", "counter": { "success": "1", "secondarySuccess": "7" } }, "done": true, "response": { "@type": "type.googleapis.com/google.cloud.healthcare.v1.fhir.ApplyAdminConsentsResponse", "consentApplySuccess": "1", "affectedResources": "7" } }
Questa risposta indicava che il server ha elaborato correttamente una policy di amministrazione e ha aggiornato l'accesso consensuale di 7 risorse (1 operatore sanitario, 1 paziente, 2 osservazioni, 2 consensi del paziente e 1 policy di amministrazione).
L'applicazione dei consensi archiviati in un archivio FHIR non entrerà in vigore
fino a quando non verrà chiamato e completato correttamente ApplyConsents
(per i consensi dei pazienti) o ApplyAdminConsents
(per le norme amministrative e le norme amministrative a cascata). Se
aggiungi, modifichi o rimuovi i consensi dopo aver eseguito ApplyConsents
o
ApplyAdminConsents
, devi eseguirlo di nuovo affinché questi consensi vengano inclusi nel
modello di applicazione.
Le risorse FHIR vengono indicizzate in modo asincrono, pertanto potrebbe esserci un leggero ritardo
tra il momento in cui ApplyConsents
o ApplyAdminConsents
viene completato e il momento in cui
il modello di applicazione viene visualizzato nei risultati di ricerca. Questo ritardo è previsto solo per le richieste di ricerca.
Se è la prima volta che configuri l'applicazione del consenso nell'archivio FHIR, attendi il completamento dell'operazione a lunga esecuzione ApplyConsents
o ApplyAdminConsents
prima di effettuare richieste che tengano conto del consenso.
Per chiamare ApplyConsents
su un sottoinsieme di pazienti, puoi utilizzare i seguenti filtri:
PatientScope
: per eseguireApplyConsents
su un elenco di ID paziente con un massimo di 10.000 pazientiTimeRange
: per eseguireApplyConsent
su un elenco di ID risorsa paziente le cui risorse di consenso vengono aggiornate in un determinato intervallo di tempo
Per chiamare ApplyAdminConsents
, devi fornire l'elenco completo di tutte
le norme che vuoi applicare (non un elenco incrementale). Di conseguenza, un elenco
vuoto annullerà l'applicazione di tutte le norme amministrative dello Store. Ogni criterio
deve essere un nome di versione della risorsa se
l'archivio FHIR
è sottoposto al controllo delle versioni e un nome di risorsa in caso contrario.
Puoi utilizzare operations.get
per recuperare l'ProgressCounter
dell'operazione. Al termine, viene inclusa una ApplyConsentsResponse in
Operation.response
.
I contatori in ProgressCounter
e ApplyConsentsResponse
o
ApplyAdminConsentsResponse
sono descritti nella tabella seguente.
ProgressCounter |
ApplyConsentsResponse o ApplyAdminConsentsResponse |
Descrizione |
---|---|---|
success |
consentApplySuccess |
Il numero di risorse Consent elaborate correttamente dall'operazione. |
failure |
consentApplyFailure |
Il numero di risorse di consenso non supportate o non valide. Puoi visualizzare i log degli errori in Cloud Logging o, quando validateOnly è false , controllare lo stato dell'applicazione del consenso utilizzando CheckConsentEnforcementStatus o CheckPatientConsentEnforcementStatus per recuperare i dettagli dell'errore. |
secondarySuccess |
affectedResources |
Quando validateOnly è false , rappresenta il numero di risorse FHIR che sono state reindicizzate correttamente a causa dell'effetto della modifica del consenso. |
secondaryFailure |
failedResources |
Quando validateOnly è false , rappresenta il numero di risorse FHIR per le quali potrebbe essere stata modificata l'autorizzazione, ma l'indicizzazione non è riuscita. Ciò potrebbe influire sulla ricerca con contesto di consenso, ma non su altri metodi. Per visualizzare i dettagli dell'errore, puoi visualizzare i log degli errori in Cloud Logging. |
Quando vengono elaborate le risorse FHIR Consent, puoi utilizzare le seguenti API per controllare lo stato di applicazione di un singolo consenso o di tutti i consensi di un paziente:
CheckConsentEnforcementStatus
: restituisce una risorsaParameters
(STU3, R4) che elenca i seguenti parametri:id
: rappresenta l'ID risorsa della risorsa ConsentlastUpdated
: rappresenta il momento in cui il consenso è stato applicato l'ultima voltaversionId
: rappresenta l'ID versione utilizzato per l'applicazione del consensoconsent-enforcement-status
: rappresenta lo stato dell'applicazione del consenso
CheckPatientConsentEnforcementStatus
: restituisce unBundle
(STU3, R4) della risorsaParameters
(STU3, R4) che consiste nello stato di applicazione di tutti i consensi di un singolo paziente
Per i criteri amministrativi, CheckConsentEnforcementStatus
può essere utilizzato solo per controllare
lo stato di applicazione forzata di un singolo criterio amministrativo relativo al consenso. In alternativa, puoi
utilizzare fhirStores.get
per visualizzare tutte le norme amministrative attive applicate allo store.
Stato di applicazione del consenso
consent-enforcement-status
può avere uno dei seguenti valori:
OFF
: rappresenta lo stato di applicazione predefinito di una nuova risorsa di consenso in cui la risorsa di consenso non è mai stata elaborata.ENFORCEABLE
: lo stato in cui la risorsa Consent è stata elaborata correttamente.INACTIVE
: uno stato inattivo in cui la risorsa di consenso viene ignorata.UNSUPPORTED
: lo stato di una risorsa di consenso che potrebbe essere conforme alle specifiche FHIR, ma non è applicabile. Ciò è dovuto all'implementazione limitata dell'applicazione del consenso FHIR con l'attuale livello di supporto delle funzionalità.ENFORCEMENT_LIMIT_EXCEEDED
: lo stato in cui il formato della risorsa di consenso FHIR e il livello di supporto della risorsa sono privi di errori, ma una o più delle seguenti condizioni sono vere:Il paziente ha un ampio insieme di risorse di consenso.
La dimensione delle direttive per il consenso in tutti i consensi attivi è maggiore della dimensione massima consentita delle direttive per il consenso per un server FHIR per applicarle.
Ricerca con il contesto del consenso
L'API Cloud Healthcare supporta le ricerche di risorse FHIR in un determinato archivio FHIR con actor
, purpose
e environment
come parametri di ricerca. La
risposta contiene solo le risorse per cui è stato dato il consenso.
Ricerca di risorse FHIR con ambito di consenso
- Il medico Jeffrey Brown (identificato da
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) utilizzando un'applicazione attendibileApp/123
cerca tutte le osservazioni constatus=final
. - Il medico Jeffrey Brown (identificato da
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) che utilizza l'applicazioneApp/123
cerca tutte le osservazioni del paziente Darcy. - Il medico Jeffrey Brown (identificato da
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) che utilizza l'applicazioneApp/123
cerca tutte le osservazioni del paziente Darcy a scopo di trattamento di emergenza. - Il medico Jeffrey Brown (identificato da
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) cerca le osservazioni constatus=final
per due scopi: trattamento e ricerca - Un amministratore IT di un ospedale utilizza
bypass
per cercare tutti i medici dell'ospedale.
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?status=final"
Dovresti ricevere una risposta JSON simile alla seguente:
{ "entry": [ { "fullUrl": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa", "resource": { "code": { "coding": [ { "code": "718-7", "display": "Hemoglobin [Mass/volume] in Blood", "system": "http://loinc.org" } ] }, "effectivePeriod": { "start": "2021-12-10T05:30:10+01:00" }, "id": "7473784b-46a8-470c-b9a6-fe38a01025aa", "issued": "2021-12-10T13:30:10+01:00", "meta": { "lastUpdated": "2022-09-01T17:31:40.423469+00:00", "source": "http://example.com/HappyHospital", "versionId": "VERSION_ID" }, "resourceType": "Observation", "status": "final", "subject": { "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2" }, "valueQuantity": { "code": "g/dL", "system": "http://unitsofmeasure.org", "unit": "g/dl", "value": 7.2 } }, "search": { "mode": "match" } } ], "link": [ { "relation": "search", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final" }, { "relation": "first", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final" }, { "relation": "self", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final" } ], "resourceType": "Bundle", "total": 1, "type": "searchset" }
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?subject:Patient.name=Darcy"
Dovresti ricevere una risposta JSON simile alla seguente:
{ "link": [ { "relation": "search", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy" }, { "relation": "first", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy" }, { "relation": "self", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy" } ], "resourceType": "Bundle", "total": 0, "type": "searchset" }
La query precedente è una ricerca concatenata. Poiché lo scenario di consenso
actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123
nega l'accesso alla risorsa Paziente Darcy (identificata da
Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2
), il server FHIR
non restituisce alcuna osservazione del paziente, come se il paziente non esistesse.
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 purp/v3/ETREAT env/App/123" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?subject:Patient.name=Darcy"
Dovresti ricevere una risposta JSON simile alla seguente:
{ "entry": [ { "fullUrl": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/68583624-9921-4158-8754-2a306c689abd", "resource": { "code": { "coding": [ { "code": "15074-8", "display": "Glucose [Moles/volume] in Blood", "system": "http://loinc.org" } ] }, "effectivePeriod": { "start": "2021-12-01T05:30:10+01:00" }, "id": "68583624-9921-4158-8754-2a306c689abd", "issued": "2021-12-01T13:30:10+01:00", "meta": { "lastUpdated": "2022-09-01T17:31:40.423469+00:00", "versionId": "VERSION_ID" }, "resourceType": "Observation", "status": "final", "subject": { "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2" }, "valueQuantity": { "code": "mmol/L", "system": "http://unitsofmeasure.org", "unit": "mmol/l", "value": 6.3 } }, "search": { "mode": "match" } }, { "fullUrl": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa", "resource": { "code": { "coding": [ { "code": "718-7", "display": "Hemoglobin [Mass/volume] in Blood", "system": "http://loinc.org" } ] }, "effectivePeriod": { "start": "2021-12-10T05:30:10+01:00" }, "id": "7473784b-46a8-470c-b9a6-fe38a01025aa", "issued": "2021-12-10T13:30:10+01:00", "meta": { "lastUpdated": "2022-09-01T17:31:40.423469+00:00", "source": "http://example.com/HappyHospital", "versionId": "VERSION_ID" }, "resourceType": "Observation", "status": "final", "subject": { "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2" }, "valueQuantity": { "code": "g/dL", "system": "http://unitsofmeasure.org", "unit": "g/dl", "value": 7.2 } }, "search": { "mode": "match" } } ], "link": [ { "relation": "search", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy" }, { "relation": "first", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy" }, { "relation": "self", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy" } ], "resourceType": "Bundle", "total": 2, "type": "searchset" }
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 purp/v3/TREAT purp/v3/HRESCH" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?status=final"
Dovresti ricevere una risposta JSON simile alla seguente:
{ "issue": [ { "code": "security", "details": { "text": "permission_denied" }, "diagnostics": "the maximum number of allowed consent purpose scopes is 1, got 2", "severity": "error" } ], "resourceType": "OperationOutcome" }
In questo caso, il professionista Jeffrey Brown deve rimuovere uno scopo non necessario da `X-Consent-Scope` nella richiesta.
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "X-Consent-Scope: bypass actor/Admin/ef0592c9-6724-467e-878d-f879e537cd15 env/net/HappyNet" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner?"
Poiché è stato fornito bypass
, i controlli del consenso sono stati saltati. Dovresti
ricevere una risposta JSON simile alla seguente:
{ "entry": [ { "fullUrl": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/12942879-f89f-41ae-aa80-0b911b649833", "resource": { "active": true, "birthDate": "1970-05-23", "gender": "male", "id": "12942879-f89f-41ae-aa80-0b911b649833", "meta": { "lastUpdated": "2022-09-01T17:31:40.423469+00:00", "versionId": "VERSION_ID" }, "name": [ { "family": "Brown", "given": [ "Jeffrey" ], "use": "official" } ], "resourceType": "Practitioner" }, "search": { "mode": "match" } } ], "link": [ { "relation": "search", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?" }, { "relation": "first", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?" }, { "relation": "self", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?" } ], "resourceType": "Bundle", "total": 1, "type": "searchset" }
Recupera risorsa con contesto di consenso
L'API Cloud Healthcare supporta l'ottenimento di risorse FHIR in un determinato archivio FHIR con actor
, purpose
e environment
come parametri di ricerca. La
risposta contiene solo le risorse per cui è stato dato il consenso.
Recupero di risorse FHIR con ambito di consenso
- Il medico Jeffrey Brown (identificato da
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) che utilizza l'applicazioneApp/123
legge la misurazione dell'emoglobina del paziente (in questo esempio,Observation/7473784b-46a8-470c-b9a6-fe38a01025aa
). - Il medico Jeffrey Brown (identificato da
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) che utilizza l'applicazione sconosciutaApp/unknown
legge la misurazione dell'emoglobina del paziente (in questo esempio,Observation/7473784b-46a8-470c-b9a6-fe38a01025aa
). - Il medico Jeffrey Brown (identificato da
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) che svolge ricerche biomediche utilizzando l'applicazioneApp/golden
legge la data di nascita di Darcy (in questo esempio,Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2
). - Il medico Jeffrey Brown (identificato da
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) richiede l'accesso di emergenza non autorizzato alla cartella di un paziente utilizzando il protocollo "break-the-glass". In questo esempio,Observation/7473784b-46a8-470c-b9a6-fe38a01025aa
.
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"
Poiché al richiedente è stato dato il consenso, la risposta è il contenuto della risorsa Observation.
{ "code": { "coding": [ { "code": "718-7", "display": "Hemoglobin [Mass/volume] in Blood", "system": "http://loinc.org" } ] }, "effectivePeriod": { "start": "2021-12-10T05:30:10+01:00" }, "id": "7473784b-46a8-470c-b9a6-fe38a01025aa", "issued": "2021-12-10T13:30:10+01:00", "meta": { "lastUpdated": "2022-09-01T17:31:40.423469+00:00", "source": "http://example.com/HappyHospital", "versionId": "VERSION_ID" }, "resourceType": "Observation", "status": "final", "subject": { "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2" }, "valueQuantity": { "code": "g/dL", "system": "http://unitsofmeasure.org", "unit": "g/dl", "value": 7.2 } }
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/unknown" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"
Poiché l'accesso al confine del richiedente (`App/unknown`) non è consentito dal consenso del paziente, la richiesta viene rifiutata.
{ "issue": [ { "code": "security", "details": { "text": "permission_denied" }, "diagnostics": "Consent access denied or the resource being accessed does not exist", "severity": "error" } ], "resourceType": "OperationOutcome" }
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 purp/v3/BIORCH env/App/golden" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
Poiché al richiedente è stato dato il consenso, la risposta è il contenuto della risorsa Patient.
{ "active": true, "birthDate": "1990-01-01", "gender": "female", "id": "3c6aa096-c054-4c22-b2b4-1e4a4d203de2", "meta": { "lastUpdated": "2022-09-01T17:31:40.423469+00:00", "versionId": "VERSION_ID", "tag": [{ "system": "http://terminology.hl7.org/CodeSystem/common-tags", "code": "employee" }] }, "name": [ { "family": "Smith", "given": [ "Darcy" ], "use": "official" } ], "resourceType": "Patient" }
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "X-Consent-Scope: btg actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"
Poiché il metodo di autorizzazione del consenso è btg
, il server ignora i controlli del consenso. La risposta è il contenuto della risorsa Observation.
{ "code": { "coding": [ { "code": "718-7", "display": "Hemoglobin [Mass/volume] in Blood", "system": "http://loinc.org" } ] }, "effectivePeriod": { "start": "2021-12-10T05:30:10+01:00" }, "id": "7473784b-46a8-470c-b9a6-fe38a01025aa", "issued": "2021-12-10T13:30:10+01:00", "meta": { "lastUpdated": "2022-09-01T17:31:40.423469+00:00", "source": "http://example.com/HappyHospital", "versionId": "VERSION_ID" }, "resourceType": "Observation", "status": "final", "subject": { "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2" }, "valueQuantity": { "code": "g/dL", "system": "http://unitsofmeasure.org", "unit": "g/dl", "value": 7.2 } }
Configurare l'intestazione del consenso
Le sezioni seguenti descrivono i metodi di applicazione del consenso supportati nell'API Cloud Healthcare e come viene applicato l'accesso alle risorse quando effettui una richiesta consapevole del consenso.
Quando effettui una richiesta, il tuo server di autorizzazione è responsabile della generazione di token di accesso con l'ambito di consenso pertinente.
Imposta intestazione HTTP
Gli ambiti di consenso vengono passati all'API Cloud Healthcare utilizzando l'intestazione HTTP X-Consent-Scope
. L'API Cloud Healthcare utilizza questa intestazione per applicare controllo dell'accesso basato sul consenso ai dati negli archivi FHIR.
Una richiesta FHIR può supportare un numero limitato di ambiti di voci di consenso. In una determinata richiesta FHIR possono essere incluse fino a tre voci di actor
, una di purp
e una di env
.
Per gli ambiti speciali, una richiesta FHIR può supportare uno dei seguenti valori: btg
o
bypass
.
Imposta le intestazioni HTTP per le applicazioni attendibili
Questa sezione è obbligatoria solo se utilizzi un server di autorizzazione controllato dal cliente. In questo caso, devi utilizzare anche un SMARTproxy o un proxy simile.
Alcune applicazioni attendibili possono effettuare chiamate direttamente all'API Cloud Healthcare con gli ambiti di consenso nell'intestazione HTTP specificata. Ciò consente l'applicazione diretta del consenso senza la necessità di un SMARTproxy o di un altro proxy per la conversione tra server di autorizzazione esterni e Google Cloud.
Ad esempio, la tua applicazione potrebbe essere registrata per un sottoinsieme di ambiti, ad esempio un ambito environment
dell'applicazione, oppure l'applicazione potrebbe presentare un widget di selezione per impostare alcune voci dell'ambito, ad esempio purpose
dell'accessor.
Un utente o un'applicazione attendibili potrebbero anche utilizzare
le voci di ambito btg
o bypass
, che sono soggette a
revisioni post-audit.
Configurare il server di autorizzazione per gli ambiti di consenso
L'API Cloud Healthcare fornisce supporto integrato per l'applicazione del consenso FHIR in base agli ambiti di consenso di input. Gli amministratori del datastore FHIR sono responsabili della creazione e della configurazione di un server di autorizzazione al di fuori dell'API Cloud Healthcare che concede ambiti di consenso.
Token di accesso di esempio
Il seguente esempio mostra un token di accesso codificato in base64:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpc3MiOiJjb25zZW50LnRva2VuLm9yZyIsImlhdCI6MTYxMjg4NDA4NSwiZXhwIjoxNjQ0NDIwMDg1LCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJkb2N0b3IuZ2FicmllbGFAZXhhbXBsZS5jb20iLCJzY29wZSI6Im9pZGMgYWN0b3IvUHJhY3RpdGlvbmVyLzEyMyBhY3Rvci9Hcm91cC85OTkgcHVycC92My9UUkVBVCBlbnYvQXBwL2FiYyJ9.fC7ljkVUUx8fwUOrJuONcrqA-WKC-k_Bclzlgds0Cq6H_gEe3nUjPlSOCTQsIdYB
Dopo aver decodificato il token di accesso, puoi vedere che contiene il seguente payload:
{
"iss": "consent.token.org",
"iat": 1612884085,
"exp": 1644420085,
"aud": "www.example.com",
"sub": "doctor.gabriela@example.com",
"scope": "oidc actor/Practitioner/123 actor/Group/999 purp/v3/TREAT env/App/abc"
}
Configurare SMARTProxy
SMARTProxy è un proxy open source di Google che fornisce le seguenti funzionalità:
Consente al server FHIR dell'API Cloud Healthcare di accettare e convalidare i token di accesso consapevoli del consenso.
Consente all'implementazione di FHIR nell'API Cloud Healthcare di includere token di accesso consapevoli del consenso nell'ambito del modello di gestione e autorizzazioni dell'API Cloud Healthcare.
Supporta anche le funzionalità dei token per SMART on FHIR.
Quando effettui una richiesta per recuperare dati dall'API Cloud Healthcare tramite SMARTProxy, si verifica quanto segue:
SMARTProxy accetta una richiesta da un client contenente un token che tiene conto del consenso.
SMARTProxy convalida il token sensibile al consenso tramite un server di autorizzazione JWT di tua proprietà.
SMARTProxy legge gli ambiti dal token sensibile al consenso e li passa all'API Cloud Healthcare tramite l'intestazione HTTP.
L'API Cloud Healthcare riceve le intestazioni e le convalida per applicare le direttive sul consenso alla richiesta. L'API Cloud Healthcare restituisce quindi una risposta al client tramite SMARTProxy.
Configura un Google Cloud service account
Un proxy può avere un solo Google Cloud service account. Se più client utilizzano lo stesso proxy, utilizzeranno lo stessoaccount di serviziot. Fai attenzione quando condividi un account di servizio con più clienti per i seguenti motivi:
Per leggere i dati FHIR nell'API Cloud Healthcare, il account di servizio può essere configurato in modo da disporre di ampie autorizzazioni di lettura e scrittura. Per ulteriori informazioni sulle autorizzazioni, consulta Controllo dell'accesso alle risorse dell'API Cloud Healthcare. Consulta le best practice generali per la configurazione del proxy.
Audit log di Cloud
L'indirizzo email dell'entità è associato al account di servizio.
Ad esempio, se chiami l'API Cloud Healthcare direttamente utilizzando il tuo Account Google per l'autenticazione, Cloud Audit Logs registra il tuo indirizzo email come indirizzo email principale. Quando utilizzi un proxy per chiamare l'API Cloud Healthcare, il proxy utilizza il proprio account di servizio e l'indirizzo email del principal è l'indirizzo email delaccount di serviziot e l'account originale non è definito.
Audit log
I log di controllo vengono generati quando viene effettuata una richiesta di accesso o quando cambiano le regole di accesso alle risorse.
Accedere ai log di controllo
Se gli audit log sono
abilitati
nel datastore FHIR, viene incluso un campo di metadati consentMode
negli audit log disponibili in Cloud Logging. consentMode
può avere uno dei seguenti
valori:
off
: la configurazione del datastore FHIR haconsentConfig.accessEnforced
impostato sufalse
e non consente richieste che tengono conto del consenso.emptyScope
: il datastore FHIR haconsentConfig.accessEnforced
impostato sutrue
, ma non è stata inclusa un'intestazione dell'ambito del consenso. Di conseguenza, i consensi non sono stati applicati.enforced
: il datastore FHIR haconsentConfig.accessEnforced
impostato sutrue
e l'intestazione dell'ambito del consenso era presente. Di conseguenza, i consensi sono stati valutati e applicati alla richiesta.btg
: la richiesta FHIR avevabtg
fornito nell'intestazione dell'ambito del consenso. Di conseguenza, i controlli del consenso sono stati saltati. Questa richiesta è destinata a essere utilizzata per emergenze ed è soggetta solo a revisione post-audit.bypass
: la richiesta FHIR aveva solobypass
fornito nell'intestazione dell'ambito del consenso. Di conseguenza, i controlli del consenso sono stati saltati. Questa richiesta è pensata per essere utilizzata da un flusso di lavoro attendibile (ad esempio un amministratore o un'applicazione attendibile anziché utenti finali), in modo che questo audit log sia diverso dabtg
, che viene utilizzato per i controlli di governance dei dati.
Se vuoi, puoi impostare access_determination_log_config
su VERBOSE
per registrare maggiori informazioni
sul motivo per cui una richiesta viene concessa o rifiutata.
Accedere agli audit log delle modifiche all'applicazione dell'accesso
Quando la risorsa di base del compartimento cambia (ad esempio, rimozione del tag employee
di un paziente): il controllo dell'accesso alla risorsa modificata e al relativo compartimento potrebbe cambiare a causa delle norme a cascata dell'amministratore. Verrà attivata la reindicizzazione di tutte le risorse del compartimento. L'avanzamento della reindicizzazione per ogni aggiornamento della risorsa di base del comparto può essere monitorato in Cloud Logging con il filtro
jsonPayload.@type="type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry"
.
Log di avanzamento della reindicizzazione a cascata di esempio
{ "insertId": "tz2gtza8", "jsonPayload": { "@type": "type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry", "state": "STATE_FINISHED", "affectedResources": "2", "lastUpdated": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ", "compartmentBaseResourceName": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/PATIENT_RESOURCE_ID/_history/PATIENT_RESOURCE_VERSION" }, "resource": { "type": "healthcare_fhir_store", "labels": { "location": "LOCATION", "dataset_id": "DATASET_ID", "fhir_store_id": "FHIR_STORE_ID", "project_id": "PROJECT_ID" } }, "timestamp": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ", "severity": "INFO", "logName": "projects/PROJECT_ID/logs/healthcare.googleapis.com%2Fconsent_cascading_fhir", "receiveTimestamp": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ" }
jsonPayload.state
è lo stato dell'operazione di reindicizzazione, jsonPayload.affectedResources
è il numero di risorse del compartimento reindicizzate e jsonPayload.lastUpdated
è il timestamp dell'aggiornamento della risorsa paziente. Se l'operazione è appena iniziata, jsonPayload.state="STATE_STARTED"
e jsonPayload.affectedResources
non saranno presenti.
Vincoli e limiti
Questa sezione mostra i vincoli e i limiti per FHIR R4, ma gli stessi vincoli e limiti si applicano a FHIR STU3.
Tipo | Vincoli e limiti |
---|---|
Risorsa Single Consent |
|
Modello di applicazione |
|
X-Consent-Scope |
|
Metodi supportati |
|
Prestazioni |
|
Best practice
Le seguenti sezioni descrivono le best practice per l'utilizzo del controllo dell'accesso FHIR.
Best practice generali
Non importare le risorse FHIR e chiamare
ApplyConsents
oApplyAdminConsents
in parallelo. Ti consigliamo di importare prima le risorse FHIR e poi chiamareApplyConsents
oApplyAdminConsents
. Tuttavia, se le risorse da importare non includono risorse Paziente o Consenso, il modello di applicazione non verrà interessato e non è necessario elaborare i consensi o le norme amministrative.Non creare ricerche personalizzate e chiamare
ApplyConsents
in parallelo. Ti consigliamo di eseguirli uno dopo l'altro.Se i tuoi flussi di lavoro richiedono la chiamata di più
ApplyConsents
suPatientScope
disgiunti, possono essere chiamati in parallelo.ApplyAdminConsents
può essere eseguito in parallelo con un numero qualsiasi diApplyConsents
, ma non con un altroApplyAdminConsents
.Quando configuri il proxy, limita l'account di servizio IAM con autorizzazioni di sola lettura per evitare di scrivere i dati di un paziente nei record di un altro paziente.
Non utilizzare il proxy per il consenso durante la creazione o l'aggiornamento dei record.
Convalida tutte le richieste di scrittura per evitare modifiche impreviste dei dati tra pazienti.
Quando vengono applicati i consensi a cascata, le risorse di base del compartimento devono essere importate per prime, seguite dalle risorse rimanenti del compartimento. In alternativa, tutte le risorse del compartimento possono essere incluse in un unico bundle e importate utilizzando
fhir.executeBundle
.
Elimina risorsa Patient
Quando elimini una risorsa Patient, se vuoi rimuovere anche l'applicazione del consenso per quel paziente (soprattutto quando FhirStore.disableReferentialIntegrity
è true), ti consigliamo di seguire questo ordine di operazioni:
Elimina tutte le risorse Consent appartenenti alla risorsa Patient.
Chiama
ApplyConsents
con il filtroPatientScope
.
Configurare un negozio esistente per l'accesso al consenso
Per configurare un negozio esistente per l'accesso al consenso:
Utilizza
UpdateFhirStore
per impostareConsentConfig
con l'applicazione del consensoversion
comeV1
e impostaaccessEnforced
sutrue
.curl -X PATCH \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json" \ --data "{ 'consentConfig': { 'version': 'V1', 'accessEnforced': true } }" "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?update_mask=consentConfig"
Elaborare i consensi dei pazienti o le norme amministrative
ApplyConsents
per i consensi dei pazienti
curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json" \ --data "{'validateOnly': false}" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"
ApplyAdminConsents
per le norme amministrative e le norme amministrative a cascata.
curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json" \ --data "{ 'newConsentsList': { 'names': [ 'projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/RESOURCE_ID_1/_history/VERSION_ID_1', ... 'projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/RESOURCE_ID_N/_history/VERSION_ID_N' ] }, 'validateOnly': false }" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyAdminConsents"
La frequenza di esecuzione di ApplyConsents o ApplyAdminConsents
Quando il campo
ConsentConfig
non è impostato: il campoConsentConfig
non è impostato sia quando viene creato un archivio FHIR sia quando il campoConsentConfig
viene cancellato. Una volta annullato il campoConsentConfig
, devi ripetere la configurazione dello store per l'accesso al consenso prima di effettuare richieste che tengono conto del consenso per evitare di valutare norme di applicazione del consenso obsolete.Quando cambia il modello di applicazione: quando una risorsa Consent viene creata, aggiornata o eliminata, il modello di applicazione cambia. In questi casi, devi chiamare il numero
ApplyConsents
oApplyAdminConsents
affinché le modifiche vengano applicate.Se riesci a tenere traccia delle modifiche apportate ai pazienti con consenso, ti consigliamo di utilizzare il filtro
PatientScope
per evitare di rielaborare l'intero negozio. Questo filtro è utile per aggiornare immediatamente l'applicazione di un piccolo insieme di pazienti.Puoi anche eseguire
ApplyConsents
periodicamente utilizzando il filtroTimeRange
. Questo filtro è utile quando l'aggiornamento immediato non è fondamentale. Ad esempio, la seguente richiesta aggiorna l'applicazione delle modifiche al consenso tra le ore 00:00 UTC del 20/09/2022 e le ore 00:00 UTC del 21/09/2022.curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json" \ --data "{ 'validateOnly': false, 'timeRange': { 'start': '2022-09-20T00:00:00Z', 'end': '2022-09-21T00:00:00Z', } }" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"
Utilizzare la visualizzazione del consenso FHIR
Il visualizzatore del consenso FHIR mostra i criteri di controllo dell'accesso. Fornisce una tabella contenente gli ambiti di consenso per rappresentare le regole di controllo dell'accesso FHIR.
Prima di poter utilizzare il visualizzatore del consenso FHIR, assicurati di quanto segue:
L'impostazione del datastore FHIR
disableResourceVersioning
deve esserefalse
. Questa impostazione non può essere modificata dopo la creazione dell'archivio FHIR. Per creare un nuovo archivio FHIR, consulta la sezione Creare un archivio FHIR.Il datastore FHIR è configurato per l'applicazione del consenso.
Per visualizzare il visualizzatore del consenso FHIR, completa i seguenti passaggi:
Console
Nella console Google Cloud , vai alla pagina Browser.
Seleziona il set di dati contenente il datastore FHIR di cui vuoi visualizzare i criteri di consenso applicati.
Nella pagina Datastore, seleziona l'archivio FHIR di cui vuoi visualizzare i criteri di consenso applicati nell'elenco Datastore.
Nella pagina Dettagli datastore, fai clic sulla scheda Consenso. Vengono visualizzati gli ambiti del consenso.