En esta página, se describe cómo usar Recursos de consentimiento de FHIR para determinar el acceso a los datos de los almacenes de FHIR en la API de Cloud Healthcare.
Configura un almacén habilitado para el control de acceso de FHIR
Para configurar un almacén de FHIR con aplicación de consentimiento, completa los siguientes pasos:
Crea un almacén de FHIR si aún no tienes uno.
Configura los siguientes parámetros de
ConsentConfig
del almacén de FHIR para habilitar la aplicación del consentimiento:version
: Especifica para qué versión de aplicación del consentimiento se utiliza. en el almacén de FHIR. Este valor solo se puede establecer una vez medianteCreateFhirStore
oUpdateFhirStore
. Una vez configurada, debes llamar aApplyConsents
o aApplyAdminConsents
para cambiar la versión.access_enforced
: Si se establece comotrue
, cuando se accede a los recursos de FHIR, los encabezados de consentimiento proporcionados se verificarán con las directivas de consentimiento que proporcionan los consumidores.consent_header_handling
: Si se establece enPERMIT_EMPTY_SCOPE
(valor predeterminado), el servidor permite solicitudes sin el encabezadoX-Consent-Scope
(o vacío). Si se establece enREQUIRED_ON_READ
yaccess_enforced
=true
, el servidor rechaza todas las solicitudes sin encabezadoX-Consent-Scope
(o vacío).
Configura un nuevo almacén de 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"
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID", "version": "R4", "enableUpdateCreate": true, "consentConfig": { "version": "V1" } }
Si ya tienes una tienda existente, usa UpdateFhirStore
para configurar lo siguiente:ConsentConfig
con la aplicación de consentimientoversion
como V1
y establece accessEnforced
a 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"
Define políticas con el recurso de consentimiento
Las políticas se representan a través del Recurso de consentimiento. El propósito y el uso de los campos de recursos se describen en la documentación del modelo de datos.
Este es un ejemplo de todos los recursos que se pueden crear para este ejemplo en particular.
Crea recursos de FHIR
En el siguiente ejemplo, se muestra cómo ejecutar un [paquete de FHIR](/healthcare-api/docs/how-tos/fhir-bundles) para propagar los siguientes recursos:
- Un recurso de un profesional con el nombre José Borrero
- Un recurso de un paciente con el nombre Diana Sánchez
- Un recurso de observación que muestra la medición de hemoglobina de Diana (LOINC
718-7
) que recopiló el Hospital Happy - Un recurso de observación que muestra la medición de glucosa de Darcy
(LOINC
15074-8
). - Un consentimiento de Darcy para permitir que Jeffrey Brown use la aplicación
App/123
a fin de acceder a los datos recopilados por el hospital Happy - Un consentimiento de Diana para permitir que José Borrero acceda a cualquiera de sus datos para un tratamiento de emergencia (
ETREAT
) - Un consentimiento del Happy Hospital para permitir que Jeffrey Brown acceda a todos los datos
al realizar una investigación biomédica (
BIORCH
) con la aplicaciónApp/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"
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
{ "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" }
A continuación, se muestran más ejemplos de R4 Recurso de consentimiento que demuestra cómo se pueden representar las políticas complejas.
Directiva de consentimiento del paciente de muestra
{ "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" } ] } }
El ejemplo anterior representa el recurso de consentimiento de un paciente en el que
f001
le da permiso a un profesional f002
con
el objetivo de proporcionar tratamiento regular representado por TREAT
.
El profesional proviene de la ubicación geográfica iso3166-1/CA
. Este recurso de consentimiento permite que el profesional acceda a los datos del paciente si cumplen con todas las condiciones siguientes.
- Es un tipo
Encounter
con el IDEncounter/e001
. - Proviene de la fuente
http://somesystem.example.org/foo
. - Satisface al menos una de las siguientes condiciones en la etiqueta (se pueden etiquetar recursos configurando los campos
system
ycode
de Meta.tag): - Tiene la etiqueta (
system
=http://terminology.hl7.org/CodeSystem/common-tags
) ycode
=actionable
) - Tiene etiquetas (
system
=http://example.com/custom-tags
ycode
=archived
) y (system
=http://example.com/custom-tags
ycode
=insensitive
). - Tiene al menos una de las siguientes etiquetas de seguridad
system
=http://terminology.hl7.org/CodeSystem/v3-Confidentiality
ycode
es uno deR
,N
,M
,L
oU
.system
=http://terminology.hl7.org/CodeSystem/v3-ActCode
ycode
=PSY
.
Ejemplo de directiva de política de administración
{ "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" } ] } }
En el ejemplo anterior, se representa un recurso de consentimiento de política de administrador que otorga permiso a un profesional f002
con el fin de proporcionar un tratamiento regular representado por TREAT
. El profesional es
la ubicación geográfica iso3166-1/CA
. Este recurso de consentimiento permite que las
profesional de la salud accedan a los datos del paciente si estos satisfacen todos los
las siguientes condiciones:
- Es un tipo
Encounter
con el IDEncounter/e001
. - Proviene de la fuente
http://somesystem.example.org/foo
. - Cumple con al menos una de las siguientes condiciones en la etiqueta:
- Tiene la etiqueta (
system
=http://terminology.hl7.org/CodeSystem/common-tags
) ycode
=actionable
) - Tiene etiquetas (
system
=http://example.com/custom-tags
ycode
=archived
) y (system
=http://example.com/custom-tags
ycode
=insensitive
). - Tiene al menos una de las siguientes etiquetas de seguridad
system
=http://terminology.hl7.org/CodeSystem/v3-Confidentiality
ycode
es uno deR
,N
,M
,L
oU
.system
=http://terminology.hl7.org/CodeSystem/v3-ActCode
ycode
=PSY
.
Ejemplo de directiva de política de encadenamiento del administrador
{ "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" } } ] } }
El ejemplo anterior representa un recurso de consentimiento de una política en cascada del administrador que otorga
permiso a un profesional f002
con el fin de proporcionar
tratamiento regular representado por TREAT
. El profesional proviene de la ubicación geográfica iso3166-1/CA
. Este recurso de consentimiento permite que el profesional acceda a los datos del compartimento de los pacientes con la etiqueta employee
. Todos los criterios de recursos
solo se aplica a los recursos básicos del compartimento, es decir, el recurso Paciente, ya que
que controla los recursos de origen.
Aplicar los consentimientos de los pacientes o las políticas del administrador
Haga cumplir el consentimiento del paciente antes del 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"
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" }
La respuesta contiene un nombre de operación. Para hacer un seguimiento del estado de la operación, puedes usar el [Método `get` de la operación](/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"
Cuando la operación finaliza, el servidor muestra una respuesta con el estado de la operación en 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" } }
Esta respuesta indicó que el servidor procesó con éxito 2 consentimientos y actualizó el acceso consensual de 5 recursos (1 del paciente, 2 Consentimientos, 2 Observaciones).
Aplica la política de administrador con 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"
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" }
La respuesta contiene un nombre de operación. Para hacer un seguimiento del estado de la operación, puedes usar el [Método `get` de la operación](/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"
Cuando la operación finaliza, el servidor muestra una respuesta con el estado de la operación en 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" } }
Esta respuesta indicó que el servidor procesó correctamente 1 política de administración y actualizó el acceso consensuado a 7 recursos (1 profesional, 1 paciente, 2 observaciones, 2 consentimientos de pacientes y 1 política del administrador).
No entrará en vigencia la aplicación de los consentimientos almacenados en un almacén de FHIR
hasta el ApplyConsents
(para los consentimientos de los pacientes) o hasta el ApplyAdminConsents
(para los administradores
políticas en cascada de administración) y se completa correctamente. Si
agregas, modificas o quitas consentimientos después de ejecutar ApplyConsents
o
ApplyAdminConsents
, debes volver a ejecutarla para que se incluyan esos consentimientos
el modelo de aplicación.
Los recursos de FHIR se indexan de forma asíncrona, por lo que puede haber una pequeña demora entre el momento en el que se completa ApplyConsents
o ApplyAdminConsents
y el momento en que el modelo de aplicación se refleja en los resultados de la búsqueda. Esta demora solo se espera para las solicitudes de búsqueda.
Si es la primera vez que configuras la aplicación del consentimiento en el FHIR
al almacén, espera al ApplyConsents
o ApplyAdminConsents
de larga duración
que se complete antes de realizar solicitudes
basadas en el consentimiento.
Para llamar a ApplyConsents
en un subconjunto de pacientes, puedes usar los siguientes filtros:
PatientScope
: para ejecutarApplyConsents
en una lista de ID de pacientes con hasta 10,000 pacientesTimeRange
: para ejecutarApplyConsent
en una lista de ID de recursos de pacientes cuyos recursos de consentimiento se actualizan durante un período determinado
Para llamar a ApplyAdminConsents
, debes proporcionar la lista completa de todas las políticas que deseas aplicar (no una lista incremental). Como resultado, una lista vacía anulará la aplicación forzosa de todas las políticas de administrador de la tienda. Cada política
debe ser un nombre de versión del recurso si el
Tienda de FHIR
es el control de versiones y, en caso contrario, el nombre del recurso.
Puedes usar operations.get
para recuperar el ProgressCounter
de la operación. Una vez completado, hay un ApplyConsentsResponse que se incluye en Operation.response
.
Los contadores en ProgressCounter
y ApplyConsentsResponse
o
ApplyAdminConsentsResponse
se describen en la siguiente tabla.
ProgressCounter |
ApplyConsentsResponse o ApplyAdminConsentsResponse |
Descripción |
---|---|---|
success |
consentApplySuccess |
La cantidad de recursos de consentimiento que la operación procesó correctamente. |
failure |
consentApplyFailure |
Es la cantidad de recursos de consentimiento que no son compatibles o no son válidos. Para ello, puedes ver los registros de errores en Cloud Logging o, cuando validateOnly sea false , verificar el estado de aplicación del consentimiento con CheckConsentEnforcementStatus o CheckPatientConsentEnforcementStatus para recuperar los detalles del error. |
secondarySuccess |
affectedResources |
Cuando validateOnly es false , representa la cantidad de recursos de FHIR que se volvieron a indexar de forma correcta debido al cambio del consentimiento. |
secondaryFailure |
failedResources |
Cuando validateOnly es false , representa la cantidad de recursos de FHIR que pueden tener un cambio de consentimiento, pero no pudieron reindexarse. Esto puede afectar la búsqueda con contexto de consentimiento, pero no otros métodos. Para ver los detalles de los errores, puedes consultar los registros de errores en Cloud Logging. |
Cuando se procesan los recursos de consentimiento de FHIR, puedes usar las siguientes API para verificar el estado de la aplicación de un solo consentimiento o de todos los consentimientos de un paciente:
CheckConsentEnforcementStatus
: Muestra un recursoParameters
(STU3, R4) que enumera los siguientes parámetros:id
: Representa el ID del recurso de consentimiento.lastUpdated
: Representa la hora en la que se aplicó el consentimiento por última vez.versionId
: Representa el ID de la versión que se usa para la aplicación del consentimientoconsent-enforcement-status
: Representa el estado de la aplicación del consentimiento
CheckPatientConsentEnforcementStatus
: muestra unBundle
(STU3 ,R4 ) del recursoParameters
(STU3 ,R4 ) que consiste en el estado de la aplicación de todos los consentimientos de un solo paciente
En el caso de la política de administrador, CheckConsentEnforcementStatus
solo se puede usar para verificar el estado de aplicación de una sola política de administrador de consentimiento. Como alternativa, puedes
usar fhirStores.get
para ver todas las políticas de administrador activas aplicadas a la tienda.
Estado de aplicación del consentimiento
La consent-enforcement-status
puede tener cualquiera de los siguientes valores:
OFF
: Representa el estado de la aplicación predeterminado de un recurso de consentimiento nuevo en el que nunca se procesó el recurso de consentimiento.ENFORCEABLE
: Es el estado en el que se procesó correctamente el recurso de consentimiento.INACTIVE
: Es un estado inactivo en el que se ignora el recurso de consentimiento.UNSUPPORTED
: Es el estado de un recurso de consentimiento que puede cumplir con las especificaciones de FHIR, pero que no se puede aplicar. Esto se debe a una implementación limitada de la aplicación del consentimiento de FHIR con el nivel actual de compatibilidad de funciones.ENFORCEMENT_LIMIT_EXCEEDED
: Es el estado en el que el formato de recursos del consentimiento de FHIR y el nivel de compatibilidad con el recurso no tienen errores. Sin embargo, una o más de las siguientes condiciones son verdaderas:El paciente tiene un gran conjunto de recursos de consentimiento.
El tamaño de las directivas de consentimiento en todos los consentimientos activos es mayor que el tamaño máximo permitido de las directivas de consentimiento para que un servidor FHIR las aplique.
Búsqueda con contexto de consentimiento
La API de Cloud Healthcare admite búsquedas de recursos de FHIR de un
Almacén de FHIR con actor
, purpose
y environment
como parámetros de consulta. La respuesta contiene solo los recursos que están en consentimiento.
Busca recursos FHIR con permisos de consentimiento
- El profesional José Borrero (identificado con
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) mediante una aplicación de confianzaApp/123
busca todas las observaciones constatus=final
. - El profesional José Borrero (identificado con
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) mediante la aplicaciónApp/123
busca todas las observaciones de la paciente Diana. - El profesional José Borrero (identificado con
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) mediante la aplicaciónApp/123
busca en todas las observaciones de la paciente Diana con fines de tratamiento de emergencia. - El profesional José Borrero (identificado con
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) busca observaciones constatus=final
para dos propósitos, investigaciones de tratamientos y - Un administrador de TI de un hospital usa
bypass
para buscar a todos los profesionales del hospital.
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"
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
{ "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"
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
{ "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 consulta anterior es una búsqueda en cadena. Debido a que en la situación del consentimiento a actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123
se le niega el acceso al recurso de la paciente Diana (identificada con Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2
), el servidor de FHIR no muestra ninguna observación del paciente, es como si no existiera.
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"
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
{ "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"
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
{ "issue": [ { "code": "security", "details": { "text": "permission_denied" }, "diagnostics": "the maximum number of allowed consent purpose scopes is 1, got 2", "severity": "error" } ], "resourceType": "OperationOutcome" }
En este caso, el profesional José Borrero debe quitar un propósito innecesario de "X-Consent-Scope" en la solicitud.
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?"
Debido a que se proporcionó bypass
, se omitieron las verificaciones de consentimiento. Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
{ "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" }
Obtener recursos con el contexto de consentimiento
La API de Cloud Healthcare permite obtener recursos FHIR de un
Almacén de FHIR con actor
, purpose
y environment
como parámetros de consulta. La respuesta contiene solo los recursos que están en consentimiento.
Obtén recursos de FHIR con permisos de consentimiento
- Jeffrey Brown (identificado por
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) con la aplicaciónApp/123
lee la medición de hemoglobina del paciente (en este ejemplo,Observation/7473784b-46a8-470c-b9a6-fe38a01025aa
). - Jeffrey Brown (identificado por
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) utilizando una aplicación desconocidaApp/unknown
lee la medición de hemoglobina del paciente (en este ejemplo,Observation/7473784b-46a8-470c-b9a6-fe38a01025aa
). - El profesional José Borrero (identificado con
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) que realiza una investigación biomédica con la aplicaciónApp/golden
lee el atributo birthDate de Darcy (en este ejemplo,Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2
). - El profesional José Borrero (identificado con
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) solicita acceso de emergencia no autorizado al registro de un paciente mediante el protocolo "rompe el vidrio". (en este ejemplo,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"
Debido a que se le otorgó el consentimiento al solicitante, la respuesta es el contenido del recurso de observación.
{ "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"
Debido a que el consentimiento del paciente no permite el acceso al límite del solicitante ("App/unknown"), se rechaza la solicitud.
{ "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"
Debido a que se le otorgó el consentimiento al solicitante, la respuesta es el contenido del recurso de paciente.
{ "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"
Debido a que el método de autorización del consentimiento es btg
, el servidor omite las verificaciones de consentimiento. La respuesta es el contenido del recurso de observación.
{ "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 el encabezado de consentimiento
En las siguientes secciones, se describen los métodos de aplicación de consentimiento compatibles en la API de Cloud Healthcare y cómo se aplica el acceso a los recursos cuando se realiza una solicitud de consentimiento adaptada.
Cuando se realiza una solicitud, tu servidor de autorización es responsable de generar tokens de acceso con el permiso de consentimiento relevante.
Configura el encabezado HTTP
Los permisos de consentimiento se pasan a la API de Cloud Healthcare mediante el encabezado HTTP X-Consent-Scope
. La API de Cloud Healthcare usa este encabezado para aplicar el control de acceso basado en el consentimiento de los datos en almacenes de FHIR.
Una solicitud de FHIR puede admitir una cantidad limitada de permisos de entrada de consentimiento. Se pueden incluir hasta tres entradas de actor
, una de purp
y una de env
en una solicitud de FHIR determinada.
Para los permisos especiales, una solicitud de FHIR puede admitir uno de btg
o bypass
.
Establece encabezados HTTP para aplicaciones de confianza
Esta sección solo es necesaria si utilizas un servidor de autorización controlado por el cliente. En esta instancia, también debes usar un proxy SMARTproxy o una opción similar.
Algunas aplicaciones de confianza pueden realizar llamadas directamente a la API de Cloud Healthcare con los permisos de consentimiento en el encabezado HTTP especificado. Esto permite la aplicación directa del consentimiento sin la necesidad de que SMARTproxy o algún otro proxy realicen conversiones entre los servidores de autorización externos y Google Cloud.
Por ejemplo, la aplicación se puede registrar para un subconjunto de permisos, como un permiso de aplicación environment
, o la aplicación podría presentar un widget de selección para establecer algunas entradas del permiso, como el purpose
de la persona que accede.
Un usuario de confianza o una aplicación de confianza también podrían usar las entradas de alcance btg
o bypass
, que están sujetas a revisiones posteriores a la auditoría.
Configura tu servidor de autorización para los permisos de consentimiento
La API de Cloud Healthcare proporciona una compatibilidad integrada para la aplicación del consentimiento de FHIR según los permisos de consentimiento de entrada. Los administradores de los almacenes de FHIR son responsables de crear y configurar un servidor de autorización fuera de la API de Cloud Healthcare que otorga permisos de consentimiento.
Token de acceso de muestra
En el siguiente ejemplo, se muestra un token de acceso codificado en Base64:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpc3MiOiJjb25zZW50LnRva2VuLm9yZyIsImlhdCI6MTYxMjg4NDA4NSwiZXhwIjoxNjQ0NDIwMDg1LCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJkb2N0b3IuZ2FicmllbGFAZXhhbXBsZS5jb20iLCJzY29wZSI6Im9pZGMgYWN0b3IvUHJhY3RpdGlvbmVyLzEyMyBhY3Rvci9Hcm91cC85OTkgcHVycC92My9UUkVBVCBlbnYvQXBwL2FiYyJ9.fC7ljkVUUx8fwUOrJuONcrqA-WKC-k_Bclzlgds0Cq6H_gEe3nUjPlSOCTQsIdYB
Después de decodificar el token de acceso, puedes ver que contiene la siguiente carga útil:
{
"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 es un proxy de código abierto de Google que tiene las siguientes características:
Permite que el servidor FHIR de la API de Cloud Healthcare acepte y valide los tokens de acceso adaptados al consentimiento.
Permite que la implementación de FHIR en la API de Cloud Healthcare incluya tokens de acceso adaptado al consentimiento como parte de las APIs de administración y de permisos de estado.
También admite características de token para la compatibilidad de SMART en FHIR.
Cuando realizas una solicitud para recuperar datos de la API de Cloud Healthcare a través de SMARTProxy, ocurre lo siguiente:
SMARTProxy acepta una solicitud de un cliente que contiene un token adaptado al consentimiento.
SMARTProxy valida el token adaptado al consentimiento mediante un servidor de autorización JWT que te pertenece.
SMARTProxy lee los permisos del token adaptado al consentimiento y los pasa a la API de Cloud Healthcare a través del encabezado HTTP.
La API de Cloud Healthcare recibe los encabezados y los valida para aplicar las directivas de consentimiento en la solicitud. Luego, la API de Cloud Healthcare le muestra al cliente una respuesta a través del SMARTProxy del cliente.
Configura una cuenta de servicio de Google Cloud
Un proxy solo puede tener una sola cuenta de servicio de Google Cloud. Si varios clientes usan el mismo proxy, los clientes usarán la misma cuenta de servicio. Ten cuidado cuando compartas una cuenta de servicio con varios clientes por los siguientes motivos:
Para leer los datos de FHIR en la API de Cloud Healthcare, la cuenta de servicio se puede configurar para que tenga amplios permisos de lectura y escritura. Para obtener más información sobre los permisos, consulta Controla el acceso a los recursos de la API de Cloud Healthcare. Consulta Prácticas recomendadas generales para configurar el proxy.
Los registros de auditoría de Cloud
La dirección de correo electrónico principal está vinculada a la cuenta de servicio.
Por ejemplo, si llamas a la API de Cloud Healthcare directamente con tu Cuenta de Google para la autenticación, entonces, los Registros de auditoría de Cloud registran tu dirección de correo electrónico como la principal. Cuando usas un proxy para llamar a la API de Cloud Healthcare, el proxy usa su propia cuenta de servicio, y la dirección de correo electrónico principal es la de la cuenta de servicio y la cuenta original no está definida.
Registros de auditoría
Los registros de auditoría se generan cuando hay una solicitud de acceso o cuando cambia la aplicación forzosa de acceso de los recursos.
Accede a los registros de auditoría
Si los registros de auditoría están habilitados en el almacén de FHIR, se incluye un campo de metadatos consentMode
en los registros de auditoría disponibles en Cloud Logging. consentMode
puede tener uno de los siguientes valores:
off
: La configuración del almacén de FHIR tieneconsentConfig.accessEnforced
configurado comofalse
y no permite solicitudes de consentimiento.emptyScope
: El almacén de FHIR tieneconsentConfig.accessEnforced
configurado comotrue
, pero no se incluyó un encabezado de alcance de consentimiento. Como resultado, no se aplicaron los consentimientos.enforced
: El almacén de FHIR tieneconsentConfig.accessEnforced
configurado comotrue
y el encabezado del permiso de consentimiento estaba presente. Como resultado, los consentimientos evaluarse y aplicarse a la solicitud.btg
: La solicitud de FHIR teníabtg
proporcionado en el encabezado de alcance de consentimiento. Como resultado, se omitieron las verificaciones de consentimiento. Esta solicitud se diseñó para ante emergencias y sujeto únicamente a la revisión posterior a la auditoría.bypass
: Solo se proporcionóbypass
en el permiso de consentimiento a la solicitud de FHIR. encabezado. Como resultado, se omitieron las verificaciones de consentimiento. Esta solicitud está diseñada para que la use un flujo de trabajo de confianza (como un administrador o una aplicación de confianza en lugar de los usuarios finales) de modo que este registro de auditoría sea diferente debtg
, que se usa para las verificaciones de gobernanza de datos.
También puedes establecer access_determination_log_config
en VERBOSE
para registrar más información
sobre por qué se otorga o rechaza una solicitud.
Registros de auditoría de cambios de la aplicación de acceso
Cuando cambia el recurso básico del compartimento (por ejemplo, quitar la dirección IP de un paciente
Etiqueta employee
): Es el control de acceso en el recurso modificado y su compartimento.
puede cambiar debido a la Política en cascada del administrador. Se activará el reindexado en todos los recursos de su compartimento. El progreso de reindexación de cada base de compartimento
se puede hacer un seguimiento de la actualización de recursos en Cloud Logging con el filtro
jsonPayload.@type="type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry"
Ejemplo de registro de progreso del reindexado en cascada
{ "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
es el estado de la operación de reindexación, jsonPayload.affectedResources
es la cantidad de recursos del compartimento reindexados y jsonPayload.lastUpdated
es la marca de tiempo de la actualización de recursos para pacientes. Si la operación acaba de comenzar, jsonPayload.state="STATE_STARTED"
y jsonPayload.affectedResources
no estarán presentes.
Restricciones y limitaciones
En esta sección, se muestran las restricciones y los límites de FHIR R4, pero se aplican a la FTU3 de FHIR.
Tipo | Restricciones y límites |
---|---|
Recurso de consentimiento único |
|
Modelo de aplicación |
|
X-Consent-Scope |
|
Métodos admitidos |
|
Rendimiento |
|
Prácticas recomendadas
En las siguientes secciones, se describen las prácticas recomendadas para usar el control de acceso de FHIR.
Prácticas recomendadas generales
No importes recursos de FHIR ni llames a
ApplyConsents
oApplyAdminConsents
en paralelo. Te recomendamos que primero importes los recursos de FHIR y, luego,ApplyConsents
oApplyAdminConsents
. Sin embargo, si los recursos que se importarán no incluyen ningún recurso de paciente o consentimiento, el modelo de aplicación no se verá afectado y no será necesario procesar consentimientos o políticas de administración.No crees búsquedas personalizadas ni llames a
ApplyConsents
en paralelo. Te recomendamos realizarlos una tras otra.Si tus flujos de trabajo requieren llamar a varios
ApplyConsents
enPatientScope
disyuntos, se pueden llamar en paralelo.ApplyAdminConsents
puede ejecutarse en paralelo con cualquier cantidad deApplyConsents
, pero no con otraApplyAdminConsents
.Cuando configures el proxy, restringe la cuenta de servicio de IAM con permisos de solo lectura para evitar escribir los datos de un paciente en los registros de otro.
No uses el proxy de consentimiento cuando crees o actualices registros.
Valida todas las solicitudes de escritura para evitar modificaciones inesperadas de los datos de los pacientes.
Cuando se aplican consentimientos en cascada, los recursos básicos del compartimento deben importado y, luego, los recursos restantes del compartimento. Como alternativa, todas Los recursos de compartimentos se pueden unir en un solo paquete y transferirse. con
fhir.executeBundle
.
Borra recursos Patient
Cuando borras un recurso Patient, si también deseas quitar la aplicación del consentimiento para ese paciente (en especial cuando FhirStore.disableReferentialIntegrity
es verdadero), te recomendamos que sigas este orden de las operaciones:
Borra todos los recursos de consentimiento que pertenecen al recurso Patient.
Llama a
ApplyConsents
con el filtroPatientScope
.
Configura un almacén existente para obtener acceso con consentimiento
A fin de configurar un almacén existente para el acceso de consentimiento, sigue estos pasos:
Usa
UpdateFhirStore
para configurar lo siguiente:ConsentConfig
con la aplicación de consentimientoversion
comoV1
y estableceaccessEnforced
atrue
.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"
Procesar los consentimientos de los pacientes o las políticas de administración
ApplyConsents
para los consentimientos de los pacientes
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
para las políticas del administrador y las políticas en cascada del administrador.
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"
Con qué frecuencia se debe ejecutar ApplyConsents o ApplyAdminConsents
Cuando el campo
ConsentConfig
no está configurado: el campoConsentConfig
no se configura cuando se crea por primera vez un almacén de FHIR y cuando el campoConsentConfig
se borra. Una vez que el campoConsentConfig
no esté configurado, debes repetir la configuración del almacén para el acceso de consentimiento antes de realizar solicitudes adaptadas al consentimiento a fin de para evitar la evaluación de políticas de aplicación de consentimiento desactualizadas.Cuando el modelo de aplicación cambia: cuando se crea, actualiza o borra un recurso de consentimiento, el modelo de aplicación cambia. En esos casos, debes llamar a
ApplyConsents
oApplyAdminConsents
para que se apliquen estos cambios.Si puedes realizar un seguimiento de Patients con cambios de consentimiento, te recomendamos que uses el filtro
PatientScope
para evitar volver a procesar todo el almacén. Este filtro es útil para actualizar de inmediato la aplicación de un conjunto pequeño de pacientes.También puedes ejecutar
ApplyConsents
de forma periódica mediante el filtroTimeRange
. Este filtro es útil cuando la actualización inmediata no es crítica. Por ejemplo, la siguiente solicitud actualiza la aplicación de los cambios de consentimiento entre el 20 de enero de 2022 y las 0 a.m. de UTC 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/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"