Questa pagina descrive come utilizzare le risorse per il consenso FHIR per determinare l'accesso ai dati dei datastore FHIR nell'API Cloud Healthcare.
configura un datastore abilitato per il controllo dell'accesso FHIR
Per configurare un datastore FHIR con l'applicazione del consenso, completa i seguenti passaggi:
Crea un datastore FHIR se non ne hai già uno.
Imposta i seguenti parametri
ConsentConfig
del datastore FHIR per abilitare l'applicazione del consenso:version
: specifica la versione di applicazione del consenso utilizzata per il datastore FHIR. Questo valore può essere impostato una sola volta daCreateFhirStore
oUpdateFhirStore
. Dopo averlo impostato, devi chiamareApplyConsents
oApplyAdminConsents
per cambiare la versione.access_enforced
: se il criterio viene impostato sutrue
, quando si accede alle risorse FHIR, le intestazioni del consenso fornite verranno verificate in base alle istruzioni relative al consenso fornite dai consumatori.consent_header_handling
: se impostato suPERMIT_EMPTY_SCOPE
(valore predefinito), il server consente le richieste senza intestazioneX-Consent-Scope
(o vuota). Se impostato suREQUIRED_ON_READ
eaccess_enforced
=true
, il server rifiuta tutte le richieste senza intestazioneX-Consent-Scope
(o vuota).
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/v1beta1/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, usa 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/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?update_mask=consentConfig"
Definisci i criteri utilizzando le risorse di consenso
I criteri sono rappresentati tramite Risorsa per il consenso. Lo scopo e l'utilizzo dei campi delle risorse sono descritti nella documentazione sul modello di dati.
Ecco un esempio di tutte le risorse che possono essere create per questo particolare esempio.
Crea risorse FHIR
L'esempio seguente mostra come eseguire un [pacchetto FHIR](/healthcare-api/docs/how-tos/fhir-bundles) per compilare le seguenti risorse:
- Una risorsa Professionista dal nome Jeffrey Brown
- Una risorsa paziente con nome Darcy Smith
- Una risorsa di osservazione che mostra la misurazione dell'emoglobina di Darcy
(LOINC
718-7
) raccolta dall'Happy Hospital - Una risorsa di osservazione che mostra la misurazione del glucosio di Darcy
(LOINC
15074-8
). - Un consenso di Darcy a permettere a Jeffrey Brown di utilizzare l'applicazione
App/123
per accedere ai suoi dati raccolti dall'Happy Hospital - Un consenso di Darcy a permettere a Jeffrey Brown di accedere a qualsiasi suo dato per scopi di trattamento di emergenza (
ETREAT
) - Un consenso dell'Happy Hospital per consentire a Jeffrey Brown di accedere a tutti i dati quando esegue ricerca biomedica (
BIORCH
) con la richiestaApp/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/v1beta1/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/v1beta1/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/v1beta1/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/v1beta1/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/v1beta1/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/v1beta1/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/v1beta1/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/v1beta1/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 per il consenso R4 che mostra come possono essere rappresentati criteri complessi.
Esempio di direttiva per il consenso dei pazienti
{ "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 di consenso del paziente in cui un paziente f001
concede l'autorizzazione a un professionista f002
allo scopo di fornire un trattamento regolare rappresentato da TREAT
.
Il professionista appartiene alla geolocalizzazione iso3166-1/CA
. Questa risorsa per il consenso consente al professionista di accedere ai dati dei pazienti se questi soddisfano tutte le seguenti condizioni.
- Si tratta di un tipo
Encounter
con IDEncounter/e001
. - Proviene dall'origine
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
) - Ha 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 diR
,N
,M
,L
,U
.system
=http://terminology.hl7.org/CodeSystem/v3-ActCode
ecode
=PSY
.
Istruzione del criterio di amministrazione di esempio
{ "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 il criterio di amministrazione 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 per il consenso consente al professionista di accedere ai dati dei pazienti se soddisfano tutte le seguenti condizioni:
- Si tratta di un tipo
Encounter
con IDEncounter/e001
. - Proviene dall'origine
http://somesystem.example.org/foo
. - Soddisfa almeno una delle seguenti condizioni sul tag:
- Ha il tag (
system
=http://terminology.hl7.org/CodeSystem/common-tags
ecode
=actionable
) - Ha 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 diR
,N
,M
,L
,U
.system
=http://terminology.hl7.org/CodeSystem/v3-ActCode
ecode
=PSY
.
Direttiva di esempio relativa alle norme a cascata dell'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 per il criterio a cascata che concede
l'autorizzazione a un professionista f002
allo scopo di fornire
il trattamento regolare rappresentato da TREAT
. Il professionista proviene dalla geolocalizzazione iso3166-1/CA
. Questa risorsa per il consenso consente al
operatore di accedere ai dati del compartimento dei pazienti con tag
employee
. Tutti i criteri delle risorse
si applicano solo alle risorse di base del compartimento, ovvero alla risorsa Paziente, in quanto
controlla da quali risorse passare a cascata.
Applicare i consensi dei pazienti o i criteri per gli amministratori
Richiedi il consenso del paziente entro il giorno 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/v1beta1/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 tenere traccia dello stato dell'operazione, puoi utilizzare il [metodo dell'operazione "get"](/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/v1beta1/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.v1beta1.OperationMetadata", "apiMethodName": "google.cloud.healthcare.v1beta1.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.v1beta1.fhir.ApplyConsentsResponse", "consentApplySuccess": "2", "affectedResources": "5" } }
Questa risposta indicava che il server ha elaborato correttamente 2 consensi e aggiornato l'accesso consensuale a 5 risorse (1 paziente, 2 consensi, 2 osservazioni).
Applica il criterio di amministrazione 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/v1beta1/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 tenere traccia dello stato dell'operazione, puoi utilizzare il [metodo dell'operazione "get"](/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/v1beta1/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.v1beta1.OperationMetadata", "apiMethodName": "google.cloud.healthcare.v1beta1.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.v1beta1.fhir.ApplyAdminConsentsResponse", "consentApplySuccess": "1", "affectedResources": "7" } }
Questa risposta ha indicato che il server ha elaborato correttamente 1 criterio di amministrazione e ha aggiornato l'accesso consensuale a 7 risorse (1 medico, 1 paziente, 2 osservazioni, 2 consensi dei pazienti e 1 criterio di amministrazione).
L'applicazione dei consensi archiviati all'interno di un datastore FHIR non entrerà in vigore
fino a quando ApplyConsents
(per i consensi dei pazienti) o ApplyAdminConsents
(per
i criteri di amministrazione e i criteri a cascata di amministrazione) non vengono chiamati e vengono completati correttamente. Se
aggiungi, modifichi o rimuovi i consensi dopo aver eseguito ApplyConsents
o
ApplyAdminConsents
, devi eseguirli di nuovo affinché questi consensi siano inclusi nel
modello di applicazione.
Le risorse FHIR vengono indicizzate in modo asincrono, pertanto potrebbe verificarsi un leggero ritardo tra il completamento di ApplyConsents
o ApplyAdminConsents
e il momento in cui il modello di applicazione viene riportato 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 di 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 per il consenso vengono aggiornate durante un determinato intervallo di tempo
Per chiamare ApplyAdminConsents
: devi fornire l'elenco completo di tutti
i criteri che vuoi applicare (non un elenco incrementale). Di conseguenza, un elenco vuoto annullerà l'applicazione di tutti i criteri amministrativi del negozio. Ogni criterio deve essere un nome di versione della risorsa se l'archivio FHIR utilizza il controllo delle versioni, e un nome di risorsa negli altri casi.
Puoi utilizzare operations.get
per recuperare il valore ProgressCounter
dell'operazione. Al termine, c'è una richiesta ApplyConsentsResponse che è inclusa in
Operation.response
.
I contatori in ProgressCounter
e ApplyConsentsResponse
o
ApplyAdminConsentsResponse
sono descritti nella seguente tabella.
ProgressCounter |
ApplyConsentsResponse o ApplyAdminConsentsResponse |
Descrizione |
---|---|---|
success |
consentApplySuccess |
Il numero di risorse per il consenso elaborate correttamente dall'operazione. |
failure |
consentApplyFailure |
Il numero di risorse per il 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 che potrebbero avere una modifica del consenso, ma non è riuscita a reindicizzarla. Ciò potrebbe influire sulla ricerca con contesto del consenso, ma non su altri metodi. Per vedere i dettagli dell'errore, puoi visualizzare i log degli errori in Cloud Logging. |
Quando le risorse per il consenso FHIR vengono elaborate, puoi utilizzare le API seguenti per verificare lo stato dell'applicazione forzata per un singolo consenso o per tutti i consensi di un paziente:
CheckConsentEnforcementStatus
: restituisce una risorsaParameters
(STU3, R4) che elenca i seguenti parametri:id
: rappresenta l'ID risorsa della risorsa di consensolastUpdated
: rappresenta la data e l'ora dell'ultima applicazione del consensoversionId
: 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) costituito dallo stato di applicazione di tutti i consensi di un singolo paziente
Per i criteri di amministrazione, CheckConsentEnforcementStatus
può essere utilizzato solo per controllare
lo stato di applicazione di un singolo criterio di amministrazione del consenso. In alternativa, puoi utilizzare fhirStores.get
per visualizzare tutti i criteri di amministrazione attivi applicati allo store.
Stato di applicazione del consenso
consent-enforcement-status
può avere uno qualsiasi dei seguenti valori:
OFF
: rappresenta lo stato di applicazione predefinito di una nuova risorsa Consenso in cui la risorsa Consenso non è mai stata elaborata.ENFORCEABLE
: lo stato in cui la risorsa Consenso è stata elaborata correttamente.INACTIVE
: uno stato inattivo in cui la risorsa Consenso viene ignorata.UNSUPPORTED
: lo stato di una risorsa per il consenso che può 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 delle risorse di consenso FHIR e il livello di supporto per la risorsa sono privi di errori, ma una o più delle seguenti condizioni sono vere:Il paziente dispone di un'ampia serie di risorse per il consenso.
La dimensione delle istruzioni di consenso in tutti i consensi attivi è superiore a quella massima consentita delle istruzioni di consenso per un server FHIR per applicarle.
Cerca con 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 le quali è stato dato il consenso.
Cerca risorse FHIR con l'ambito del consenso
- Il medico Jeffrey Brown (identificato da
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) che utilizza un'applicazione attendibileApp/123
cerca in tutte le osservazioni constatus=final
. - Il medico Jeffrey Brown (identificato da
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) che utilizza l'applicazioneApp/123
cerca in tutte le osservazioni del paziente Darcy. - Il medico Jeffrey Brown (identificato da
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) che utilizza l'applicazioneApp/123
cerca in tutte le osservazioni provenienti dal paziente Darcy ai fini di trattamenti di emergenza. - Il medico Jeffrey Brown (identificato da
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) cerca nelle 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/v1beta1/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/v1beta1/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/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final" }, { "relation": "first", "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final" }, { "relation": "self", "url": "https://healthcare.googleapis.com/v1beta1/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/v1beta1/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/v1beta1/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/v1beta1/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/v1beta1/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é allo scenario di consenso actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123
viene negato l'accesso per la risorsa Patient Darcy (identificata da Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2
), il server FHIR non restituisce alcuna osservazione del paziente come se quest'ultimo 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/v1beta1/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/v1beta1/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/v1beta1/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/v1beta1/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/v1beta1/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/v1beta1/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/v1beta1/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 dovrebbe 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/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner?"
Poiché è stato fornito il numero bypass
, i controlli del consenso sono stati ignorati. Dovresti
ricevere una risposta JSON simile alla seguente:
{ "entry": [ { "fullUrl": "https://healthcare.googleapis.com/v1beta1/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/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?" }, { "relation": "first", "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?" }, { "relation": "self", "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?" } ], "resourceType": "Bundle", "total": 1, "type": "searchset" }
Ottieni risorsa con contesto del consenso
L'API Cloud Healthcare supporta la risorsa FHIR in un determinato archivio FHIR con actor
, purpose
e environment
come parametri di ricerca. La risposta contiene solo le risorse per le quali è stato dato il consenso.
Ottieni risorse FHIR con l'ambito del consenso
- Il medico Jeffrey Brown (identificato da
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) utilizzando 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 esegue 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 non autorizzato di emergenza alla registrazione di un paziente utilizzando il protocollo "infranto". (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/v1beta1/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/v1beta1/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/sconosciuto") 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/v1beta1/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 corrisponde al contenuto della risorsa Paziente.
{ "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/v1beta1/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 salta 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 } }
Configura l'intestazione del consenso
Le seguenti sezioni descrivono i metodi di applicazione del consenso supportati nell'API Cloud Healthcare e il modo in cui l'accesso alle risorse viene applicato quando si effettua una richiesta di consenso.
Quando effettui una richiesta, il tuo server di autorizzazione è responsabile della generazione dei token di accesso con l'ambito del 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 per le voci di consenso. In una determinata richiesta FHIR è possibile includere fino a tre voci di actor
, una tra purp
e una tra env
.
Per ambiti speciali, una richiesta FHIR può supportare uno tra btg
o bypass
.
Imposta le intestazioni HTTP per le applicazioni attendibili
Questa sezione è necessaria 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 potrebbero effettuare chiamate direttamente all'API Cloud Healthcare con gli ambiti di consenso nell'intestazione HTTP specificata. Questo consente l'applicazione diretta del consenso senza che sia necessario un SMARTproxy o un altro proxy per effettuare la conversione tra server di autorizzazione esterni e Google Cloud.
Ad esempio, l'applicazione potrebbe essere registrata per un sottoinsieme di ambiti, ad esempio un ambito dell'applicazione environment
, oppure l'applicazione potrebbe presentare un widget di selezione per impostare alcune voci di ambito come purpose
della funzione di accesso.
Un utente attendibile o un'applicazione attendibile potrebbe utilizzare anche
le voci dell'ambito btg
o bypass
, soggette a
revisione successivi all'audit.
Configura 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 del consenso di input. Gli amministratori degli archivi 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.
Esempio di token di accesso
L'esempio seguente 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"
}
Configura 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 sensibile al consenso.
Consente all'implementazione FHIR nell'API Cloud Healthcare di includere token di accesso sensibile al consenso come parte del modello di gestione e di autorizzazione dell'API Cloud Healthcare.
Supporta anche le funzionalità dei token per il supporto SMART su FHIR.
Quando effettui una richiesta di recupero dei dati dall'API Cloud Healthcare tramite SMARTProxy, si verifica quanto segue:
SMARTProxy accetta una richiesta da un client contenente un token per il consenso.
SMARTProxy convalida il token di consenso attraverso un server di autorizzazione JWT di tua proprietà.
SMARTProxy legge gli ambiti dal token per il 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 di consenso alla richiesta. L'API Cloud Healthcare restituisce quindi una risposta al client tramite SMARTProxy.
Configurare un account di servizio Google Cloud
Un proxy può avere un solo account di servizio Google Cloud. Se più client utilizzano lo stesso proxy, utilizzeranno lo stesso account di servizio. Presta cauzione quando condividi un account di servizio con più client per i seguenti motivi:
Per leggere i dati FHIR nell'API Cloud Healthcare, l'account di servizio può essere configurato in modo da avere autorizzazioni ampie 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
indirizzo email dell'entità è legato all'account di servizio.
Ad esempio, se chiami direttamente l'API Cloud Healthcare per l'autenticazione del tuo Account Google, 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 dell'entità è l'indirizzo email dell'account di servizio e l'account originale non è definito.
Audit log
Gli audit log vengono generati quando è presente una richiesta di accesso o quando l'applicazione forzata dell'accesso alle risorse cambia.
Accedi agli audit log
Se gli audit log sono abilitati nel datastore FHIR, negli audit log disponibili in Cloud Logging viene incluso un campo di metadati consentMode
. consentMode
può avere uno dei seguenti valori:
off
: la configurazione del datastore FHIR ha il valoreconsentConfig.accessEnforced
impostato sufalse
e non consente richieste di 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
ed era presente l'intestazione dell'ambito del consenso. Di conseguenza, i consensi sono stati valutati e applicati alla richiesta.btg
: per la richiesta FHIR è stato fornitobtg
nell'intestazione dell'ambito del consenso. Di conseguenza, i controlli del consenso sono stati ignorati. Questa richiesta è destinata a essere utilizzata solo per le emergenze ed è soggetta a revisione successiva all'audit.bypass
: per la richiesta FHIR è stato fornito solobypass
nell'intestazione dell'ambito del consenso. Di conseguenza, i controlli del consenso sono stati ignorati. Questa richiesta è destinata a essere utilizzata da un flusso di lavoro attendibile (ad esempio un amministratore o un'applicazione attendibile anziché da utenti finali) in modo che questo audit log sia diverso dabtg
, utilizzato per i controlli della governance dei dati.
Se vuoi, puoi impostare access_determination_log_config
su VERBOSE
per registrare ulteriori informazioni sul motivo per cui una richiesta viene accolta o rifiutata.
Audit log delle modifiche dell'applicazione forzata degli accessi
Quando la risorsa di base del vano cambia (ad esempio, viene rimosso il tag employee
di un paziente): il controllo dell'accesso alla risorsa modificata e al relativo compartimento potrebbe cambiare a causa del criterio di protezione a cascata dell'amministratore. La reindicizzazione verrà attivata in tutte
le risorse del compartimento. L'avanzamento della reindicizzazione per ogni aggiornamento delle risorse di base del compartimento può essere monitorato in Cloud Logging con il filtro jsonPayload.@type="type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry"
.
Esempio di log di avanzamento della reindicizzazione a cascata
{ "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 reindicizzato e jsonPayload.lastUpdated
è il timestamp dell'aggiornamento delle risorse dei pazienti. Se l'operazione è appena stata avviata, 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 singola per il consenso |
|
Modello di applicazione |
|
X-Consent-Scope |
|
Metodi supportati |
|
Prestazioni |
|
Best practice
Le seguenti sezioni descrivono le best practice quando si utilizza il controllo dell'accesso FHIR.
Best practice generali
Non import risorse FHIR e chiamare
ApplyConsents
oApplyAdminConsents
in parallelo. Ti consigliamo di importare prima le risorse FHIR e di chiamareApplyConsents
oApplyAdminConsents
. Tuttavia, se le risorse da importare non includono risorse per pazienti o per il consenso, il modello di applicazione non sarà interessato e non sarà necessario elaborare i consensi o i criteri di amministrazione.Non creare ricerche personalizzate e non chiamare
ApplyConsents
in parallelo. Ti consigliamo di eseguirle una dopo l'altra.Se i tuoi flussi di lavoro richiedono di chiamare più
ApplyConsents
in modalità disgiuntePatientScope
, possono essere chiamati in parallelo.ApplyAdminConsents
può essere eseguito in parallelo con un numero qualsiasi diApplyConsents
, ma non con altriApplyAdminConsents
.Quando si configura 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 prima, seguite dalle risorse del compartimento rimanenti. In alternativa, tutte le risorse dello scomparto possono essere aggregate in un singolo bundle e importate utilizzando
fhir.executeBundle
.
Elimina risorsa Patient
Quando elimini una risorsa Paziente, se vuoi rimuovere anche l'applicazione
del consenso per quel paziente (in particolare quando
FhirStore.disableReferentialIntegrity
è vera), ti consigliamo di seguire
questo ordine di operazioni:
Elimina tutte le risorse per il consenso appartenenti alla risorsa Paziente.
Chiama
ApplyConsents
con il filtroPatientScope
.
Configura un negozio esistente per l'accesso al consenso
Per configurare uno store esistente per l'accesso al consenso, completa questi passaggi:
Utilizza
UpdateFhirStore
per impostareConsentConfig
con l'applicazione del consensoversion
suV1
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/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?update_mask=consentConfig"
Elabora i consensi dei pazienti o le norme per gli amministratori
ApplyConsents
per il consenso 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/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"
ApplyAdminConsents
per i criteri amministrativi e i criteri a cascata dell'amministratore.
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/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyAdminConsents"
Frequenza di esecuzione di applyConsents o AppliedAdminConsents
Se il campo
ConsentConfig
non viene configurato: il campoConsentConfig
non viene impostato sia quando viene creato un datastore FHIR per la prima volta sia quando il campoConsentConfig
viene cancellato. Se il campoConsentConfig
non è impostato, devi ripetere la configurazione del datastore per l'accesso al consenso prima di effettuare richieste di consenso per evitare di valutare i criteri di applicazione del consenso non aggiornati.Quando il modello di applicazione cambia: quando una risorsa per il consenso viene creata, aggiornata o eliminata, il modello di applicazione cambia. In questi casi, devi chiamare
ApplyConsents
oApplyAdminConsents
per rendere effettive le modifiche.Se puoi tenere traccia delle modifiche relative ai pazienti con consenso, ti consigliamo di utilizzare il filtro
PatientScope
per evitare che venga rielaborato l'intero store. Questo filtro è utile per aggiornare immediatamente l'applicazione forzata di un piccolo gruppo 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 relative al consenso tra UTC 0AM 2022-09-20 e UTC 0AM 2022-09-21.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/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"