Esta página descreve como usar os recursos de consentimento do FHIR para determinar o acesso a dados de armazenamentos FHIR na API Cloud Healthcare.
Configurar um repositório com controle de acesso do FHIR
Para configurar um repositório de FHIR com a aplicação de consentimento, siga estas etapas:
Crie um armazenamento FHIR, se ainda não tiver um.
Defina os seguintes parâmetros
ConsentConfig
do armazenamento FHIR para ativar a aplicação do consentimento:version
: especifica qual versão de aplicação do consentimento está sendo usada para o armazenamento de FHIR. Esse valor só pode ser definido uma vez porCreateFhirStore
ouUpdateFhirStore
. Depois de definido, é necessário chamarApplyConsents
ouApplyAdminConsents
para mudar a versão.access_enforced
: se definido comotrue
, ao acessar recursos FHIR, os cabeçalhos de consentimento fornecidos serão verificados de acordo com as diretivas de consentimento fornecidas pelos consumidores.consent_header_handling
: se definido comoPERMIT_EMPTY_SCOPE
(padrão), o servidor permite solicitações sem (ou com) o cabeçalhoX-Consent-Scope
vazio. Se definido comoREQUIRED_ON_READ
eaccess_enforced
=true
, o servidor rejeita todas as solicitações sem (ou vazio) cabeçalhoX-Consent-Scope
.
Configurar um novo armazenamento FHIR com 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"
Você receberá uma resposta JSON semelhante a esta:
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID", "version": "R4", "enableUpdateCreate": true, "consentConfig": { "version": "V1" } }
Se você já tiver uma loja, use UpdateFhirStore
para definir o
ConsentConfig
com a aplicação de consentimento version
como
V1
e defina accessEnforced
como 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"
Definir políticas usando o recurso de consentimento
As políticas são representadas pelo recurso de consentimento. A finalidade e o uso dos campos de recursos são descritos nos Documentos do modelo de dados.
Confira um exemplo de todos os recursos que podem ser criados para este exemplo específico.
Criar recursos FHIR
O exemplo a seguir mostra como executar um [pacote FHIR](/healthcare-api/docs/how-tos/fhir-bundles) para preencher os seguintes recursos:
- Um recurso de profissional com o nome Jeffrey Brown
- Um recurso de paciente com o nome Darcy Smith
- Um recurso de observação mostrando a medição de hemoglobina de Darcy
(LOINC
718-7
) coletada pelo Happy Hospital - Um recurso de observação mostrando a medição de glicose de Darcy
(LOINC
15074-8
). - Um consentimento de Darcy para permitir que Jeffrey Brown use o aplicativo
App/123
para acessar os dados dela coletados pelo Happy Hospital - Um consentimento de Darcy para permitir que Jeffrey Brown acesse qualquer um dos dados dela para
tratamento de emergência
(
ETREAT
). - Um consentimento do Happy Hospital para permitir que Jeffrey Brown acesse todos os dados
ao realizar pesquisas biomédicas (
BIORCH
) com o aplicativoApp/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"
Você receberá uma resposta JSON semelhante a esta:
{ "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" }
Confira abaixo mais exemplos de recurso de consentimento R4 que demonstram como as políticas complexas podem ser representadas.
Exemplo de diretiva de consentimento do paciente
{ "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" } ] } }
O exemplo anterior representa um recurso de consentimento do paciente em que um paciente
f001
concede permissão a um profissional f002
com
a finalidade de fornecer tratamento regular representado por TREAT
.
O profissional é da geolocalização iso3166-1/CA
. Esse
recurso de consentimento permite que o profissional de saúde acesse os dados do paciente se eles
atendem a todas as condições a seguir.
- É um tipo
Encounter
com o IDEncounter/e001
. - Ele vem da fonte
http://somesystem.example.org/foo
. - Ele atende a pelo menos uma das seguintes condições na tag. Os recursos podem ser marcados definindo o campo
system
ecode
de Meta.tags: - Tem a tag (
system
=http://terminology.hl7.org/CodeSystem/common-tags
ecode
=actionable
) - Tem as duas tags (
system
=http://example.com/custom-tags
ecode
=archived
) e (system
=http://example.com/custom-tags
ecode
=insensitive
) - Ele tem pelo menos um dos seguintes rótulos de segurança
system
=http://terminology.hl7.org/CodeSystem/v3-Confidentiality
ecode
é um dos seguintes:R
,N
,M
,L
,U
.system
=http://terminology.hl7.org/CodeSystem/v3-ActCode
ecode
=PSY
.
Exemplo de diretiva de política do administrador
{ "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" } ] } }
O exemplo anterior representa um recurso de consentimento de política de administrador que concede permissão
a um profissional f002
com o objetivo de fornecer tratamento
regular representado por TREAT
. O profissional é da geolocalização iso3166-1/CA
. Esse recurso de consentimento permite que o
profissional acesse os dados do paciente se eles atenderem a todas as
seguintes condições:
- É um tipo
Encounter
com o IDEncounter/e001
. - Ele vem da fonte
http://somesystem.example.org/foo
. - Ele atende a pelo menos uma das seguintes condições na tag:
- Tem a tag (
system
=http://terminology.hl7.org/CodeSystem/common-tags
ecode
=actionable
) - Tem as duas tags (
system
=http://example.com/custom-tags
ecode
=archived
) e (system
=http://example.com/custom-tags
ecode
=insensitive
) - Ele tem pelo menos um dos seguintes rótulos de segurança
system
=http://terminology.hl7.org/CodeSystem/v3-Confidentiality
ecode
é um dos seguintes:R
,N
,M
,L
,U
.system
=http://terminology.hl7.org/CodeSystem/v3-ActCode
ecode
=PSY
.
Exemplo de diretiva de política em cascata para administradores
{ "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" } } ] } }
O exemplo anterior representa um recurso de consentimento de política em cascata do administrador que concede
permissão a um profissional f002
com o objetivo de fornecer
tratamento regular representado por TREAT
. O profissional é da
geolocalização iso3166-1/CA
. Esse recurso de consentimento permite que o
profissional acesse os dados do compartimento de pacientes com a tag
employee
. Todos os critérios de recurso
se aplicam apenas aos recursos de base do compartimento, ou seja, o recurso Paciente, porque ele
controla quais recursos serão incluídos.
Aplicar consentimentos de pacientes ou políticas de administrador
Aplicar os consentimentos do paciente 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"
Você receberá uma resposta JSON semelhante a esta:
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" }
A resposta contém um nome de operação. Para acompanhar o status da operação, use o [método "get" da operação](/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"
Quando a operação for concluída, o servidor vai retornar uma resposta com o status da operação no 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" } }
Essa resposta indicou que o servidor processou dois consentimentos e atualizou o acesso consensual de cinco recursos (um paciente, dois consentimentos e duas observações).
Aplicar a política de administrador por 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"
Você receberá uma resposta JSON semelhante a esta:
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" }
A resposta contém um nome de operação. Para acompanhar o status da operação, use o [método "get" da operação](/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"
Quando a operação for concluída, o servidor retornará uma resposta com o status da operação no 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" } }
Essa resposta indicou que o servidor processou uma política de administrador e atualizou o acesso consensual de sete recursos (um profissional, um paciente, duas observações, duas autorizações do paciente e uma política de administrador).
A aplicação de consentimentos armazenados em uma loja FHIR não entrará em vigor
até que ApplyConsents
(para consentimentos do paciente) ou ApplyAdminConsents
(para políticas
de administrador e políticas de administrador em cascata) seja chamado e concluído. Se
você adicionar, modificar ou remover consentimentos depois de executar ApplyConsents
ou
ApplyAdminConsents
, será necessário executar o comando novamente para que esses consentimentos sejam incluídos no
modelo de aplicação.
Os recursos do FHIR são indexados de forma assíncrona. Portanto, pode haver um pequeno atraso
entre o momento em que ApplyConsents
ou ApplyAdminConsents
é concluído e quando
o modelo de aplicação é refletido nos resultados da pesquisa. Esse atraso é esperado
apenas para solicitações de pesquisa.
Se esta é a primeira vez que você configura a aplicação de consentimento na loja
FHIR, aguarde a conclusão da operação de longa duração
ApplyConsents
ou ApplyAdminConsents
antes de fazer solicitações com consentimento.
Para chamar ApplyConsents
em um subconjunto de pacientes, use os seguintes
filtros:
PatientScope
: executeApplyConsents
em uma lista de IDs de pacientes com até 10.000 pacientesTimeRange
: executeApplyConsent
em uma lista de IDs de recursos de pacientes cujos recursos de consentimento são atualizados durante um determinado período
Para chamar ApplyAdminConsents
: você precisa fornecer a lista completa de todas
as políticas que você quer aplicar (não uma lista incremental). Como resultado, uma lista vazia
anula a aplicação de todas as políticas de administrador da loja. Cada política
precisa ser um nome de versão de recurso se a
armazenagem FHIR
tiver controle de versão. Caso contrário, será um nome de recurso.
Use operations.get
para extrair o ProgressCounter
da operação. Após a conclusão, há uma ApplyConsentsResponse que é incluída no
Operation.response
.
Os contadores em ProgressCounter
e ApplyConsentsResponse
ou
ApplyAdminConsentsResponse
são descritos na tabela a seguir.
ProgressCounter |
ApplyConsentsResponse ou ApplyAdminConsentsResponse |
Descrição |
---|---|---|
success |
consentApplySuccess |
O número de recursos de consentimento que a operação processou. |
failure |
consentApplyFailure |
O número de recursos de consentimento que não têm suporte ou são inválidos. Você pode acessar os registros de erros no Cloud Logging ou, quando validateOnly for false , verificar o status de aplicação do consentimento usando CheckConsentEnforcementStatus ou CheckPatientConsentEnforcementStatus para extrair os detalhes do erro. |
secondarySuccess |
affectedResources |
Quando validateOnly é false , ele representa o número de recursos FHIR que foram reindexados devido ao efeito da mudança de consentimento. |
secondaryFailure |
failedResources |
Quando validateOnly é false , ele representa o número de recursos FHIR que podem ter a mudança de consentimento, mas não conseguiram reindexar. Isso pode afetar a pesquisa com contexto de consentimento, mas não outros métodos. Para conferir os detalhes do erro, consulte os registros de erros no Cloud Logging. |
Quando os recursos de consentimento do FHIR são processados, é possível usar as APIs a seguir para verificar o status da aplicação de um único consentimento ou de todos os consentimentos de um paciente:
CheckConsentEnforcementStatus
: retorna um recursoParameters
(STU3, R4) que lista os seguintes parâmetros:id
: representa o ID do recurso de consentimentolastUpdated
: representa o horário em que o consentimento foi aplicado pela última vezversionId
: representa o ID da versão usado para a aplicação do consentimentoconsent-enforcement-status
: representa o status da aplicação do consentimento.
CheckPatientConsentEnforcementStatus
: retorna umBundle
(STU3, R4) do recursoParameters
(STU3, R4) que consiste no status de aplicação de todos os consentimentos de um único paciente.
Para a política de administrador, CheckConsentEnforcementStatus
só pode ser usado para verificar
o status de aplicação de uma única política de administrador de consentimento. Como alternativa, use fhirStores.get
para conferir todas as políticas ativas aplicadas à loja.
Status da aplicação do consentimento
O consent-enforcement-status
pode ter qualquer um dos seguintes valores:
OFF
: representa o status de aplicação de regras padrão de um novo recurso de consentimento em que o recurso de consentimento nunca foi processado.ENFORCEABLE
: o estado em que o recurso de consentimento foi processado com sucesso.INACTIVE
: um estado inativo em que o recurso de consentimento é ignorado.UNSUPPORTED
: o estado de um recurso de consentimento que pode estar em conformidade com as especificações do FHIR, mas não pode ser aplicado. Isso se deve à implementação limitada da aplicação do consentimento do FHIR com o nível atual de suporte a recursos.ENFORCEMENT_LIMIT_EXCEEDED
: o estado em que o formato do recurso de consentimento do FHIR e o nível de suporte ao recurso não têm erros, mas uma ou mais das seguintes condições são verdadeiras:O paciente tem um grande conjunto de recursos de consentimento.
O tamanho das diretivas de consentimento em todos os consentimentos ativos é maior do que o tamanho máximo permitido para que um servidor FHIR as aplique.
Pesquisar com o contexto de consentimento
A API Cloud Healthcare oferece suporte a pesquisas de recursos FHIR em um determinado
armazenamento FHIR com actor
, purpose
e environment
como parâmetros de consulta. A
resposta contém apenas os recursos que têm consentimento.
Pesquisar recursos FHIR com escopo de consentimento
- O profissional Jeffrey Brown (identificado por
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) usando um aplicativo confiávelApp/123
pesquisa todas as observações comstatus=final
. - O profissional de saúde Jeffrey Brown (identificado por
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) usando o aplicativoApp/123
pesquisa todas as observações do paciente Darcy. - O profissional da saúde Jeffrey Brown (identificado por
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) usando o aplicativoApp/123
pesquisa todas as observações do paciente Darcy para fins de tratamento de emergência. - O profissional Jeffrey Brown (identificado por
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) pesquisa observações comstatus=final
para duas finalidades: tratamento e pesquisa - Um administrador de TI de um hospital usa
bypass
para pesquisar todos os profissionais do 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"
Você receberá uma resposta JSON semelhante a esta:
{ "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"
Você receberá uma resposta JSON semelhante a esta:
{ "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" }
A consulta anterior é uma pesquisa encadeada. Como o cenário de consentimento
actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123
nega acesso ao recurso do paciente Darcy (identificado por
Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2
), o servidor FHIR
não retorna nenhuma observação do paciente, como se ele não existisse.
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"
Você receberá uma resposta JSON semelhante a esta:
{ "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"
Você receberá uma resposta JSON semelhante a esta:
{ "issue": [ { "code": "security", "details": { "text": "permission_denied" }, "diagnostics": "the maximum number of allowed consent purpose scopes is 1, got 2", "severity": "error" } ], "resourceType": "OperationOutcome" }
Nesse caso, o profissional Jeffrey Brown precisa remover uma finalidade desnecessária do "X-Consent-Scope" na solicitação.
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?"
Como bypass
foi fornecido, as verificações de consentimento foram ignoradas. Você
vai receber uma resposta JSON semelhante a esta:
{ "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" }
Acessar o recurso com o contexto de consentimento
A API Cloud Healthcare oferece suporte ao recurso FHIR de extração em um determinado
armazenamento FHIR com actor
, purpose
e environment
como parâmetros de consulta. A
resposta contém apenas os recursos que têm consentimento.
Acessar recursos FHIR com escopo de consentimento
- O profissional de saúde Jeffrey Brown (identificado por
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) usando o aplicativoApp/123
lê a medição de hemoglobina do paciente (neste exemplo,Observation/7473784b-46a8-470c-b9a6-fe38a01025aa
). - O profissional de saúde Jeffrey Brown (identificado por
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) usando o aplicativo desconhecidoApp/unknown
lê a medição de hemoglobina do paciente (neste exemplo,Observation/7473784b-46a8-470c-b9a6-fe38a01025aa
). - O profissional de saúde Jeffrey Brown (identificado por
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) faz pesquisas biomédicas usando o aplicativoApp/golden
e lê a data de nascimento de Darcy (neste exemplo,Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2
). - O profissional de saúde Jeffrey Brown (identificado por
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) solicita acesso emergencial não autorizado ao registro de um paciente usando o protocolo "break-the-glass". (neste exemplo,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"
Como o solicitante recebeu consentimento, a resposta é o conteúdo do recurso de observação.
{ "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"
Como o acesso de limite do solicitante ("App/unknown") não é permitido pelo consentimento do paciente, a solicitação é negada.
{ "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"
Como o solicitante recebeu consentimento, a resposta é o conteúdo do recurso "Patient".
{ "active": true, "birthDate": "1990-01-01", "gender": "female", "id": "3c6aa096-c054-4c22-b2b4-1e4a4d203de2", "meta": { "lastUpdated": "2022-09-01T17:31:40.423469+00:00", "versionId": "VERSION_ID", "tag": [{ "system": "http://terminology.hl7.org/CodeSystem/common-tags", "code": "employee" }] }, "name": [ { "family": "Smith", "given": [ "Darcy" ], "use": "official" } ], "resourceType": "Patient" }
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "X-Consent-Scope: btg actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833" \ "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"
Como o método de autorização do consentimento é btg
, o servidor pula as verificações
de consentimento. A resposta é o conteúdo do recurso de observação.
{ "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 } }
Configurar cabeçalho de consentimento
As seções a seguir descrevem os métodos de aplicação de consentimento compatíveis na API Cloud Healthcare e como o acesso a recursos é aplicado quando você faz uma solicitação de consentimento.
Ao fazer uma solicitação, seu servidor de autorização é responsável por gerar tokens de acesso com o escopo de consentimento relevante.
Definir cabeçalho HTTP
Os escopos de consentimento são transmitidos para a API Cloud Healthcare usando o
cabeçalho HTTP X-Consent-Scope
. A API Cloud Healthcare usa esse cabeçalho para
impor o controle de acesso com base no consentimento a dados em armazenamentos FHIR.
Uma solicitação FHIR pode ter um número limitado de escopos de entrada de consentimento. Até três
entradas de actor
, uma de purp
e uma de env
podem ser incluídas em uma determinada
solicitação do FHIR.
Para escopos especiais, uma solicitação FHIR pode oferecer suporte a btg
ou
bypass
.
Definir cabeçalhos HTTP para aplicativos confiáveis
Esta seção só é necessária se você estiver usando um servidor de autorização controlado pelo cliente. Nesse caso, você também precisa usar um proxy SMART ou semelhante.
Alguns aplicativos confiáveis podem fazer chamadas diretamente para a API Cloud Healthcare com os escopos de consentimento no cabeçalho HTTP especificado. Isso permite a aplicação direta do consentimento sem a necessidade de um SMARTproxy ou outro proxy para converter entre servidores de autorização externos e o Google Cloud.
Por exemplo, seu aplicativo pode estar registrado em um subconjunto de escopos, como
um escopo environment
do aplicativo, ou apresentar um
widget de seleção para definir algumas entradas de escopo, como o purpose
do accessor.
Um usuário ou um app confiável também pode usar
as entradas de escopo btg
ou bypass
, que estão sujeitas a
revisões pós-auditoria.
Configurar o servidor de autorização para escopos de consentimento
A API Cloud Healthcare oferece suporte integrado para aplicação de consentimento do FHIR com base nos escopos de consentimento de entrada. Os administradores do armazenamento FHIR são responsáveis por criar e configurar um servidor de autorização fora da API Cloud Healthcare que conceda escopos de consentimento.
Exemplo de token de acesso
Veja na amostra a seguir um token de acesso codificado em base64:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpc3MiOiJjb25zZW50LnRva2VuLm9yZyIsImlhdCI6MTYxMjg4NDA4NSwiZXhwIjoxNjQ0NDIwMDg1LCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJkb2N0b3IuZ2FicmllbGFAZXhhbXBsZS5jb20iLCJzY29wZSI6Im9pZGMgYWN0b3IvUHJhY3RpdGlvbmVyLzEyMyBhY3Rvci9Hcm91cC85OTkgcHVycC92My9UUkVBVCBlbnYvQXBwL2FiYyJ9.fC7ljkVUUx8fwUOrJuONcrqA-WKC-k_Bclzlgds0Cq6H_gEe3nUjPlSOCTQsIdYB
Depois de decodificar o token de acesso, você vai notar que ele contém o seguinte 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"
}
Configurar o SMARTProxy
O SMARTProxy é um proxy de código aberto do Google que oferece os seguintes recursos:
Permite que o servidor FHIR da API Cloud Healthcare aceite e valide tokens de acesso com consentimento.
Permite que a implementação FHIR na API Cloud Healthcare inclua tokens de acesso com consentimento como parte do modelo de gerenciamento e permissões da API Cloud Healthcare.
Também oferece suporte a recursos de token para o SMART no FHIR.
Quando você faz uma solicitação para recuperar dados da API Cloud Healthcare pelo SMARTProxy, o seguinte ocorre:
O SMARTProxy aceita uma solicitação de um cliente que contém um token com consentimento.
O SMARTProxy valida o token de consentimento por um servidor de autorização JWT de sua propriedade.
O SMARTProxy lê os escopos do token com consentimento e os transmite para a API Cloud Healthcare pelo cabeçalho HTTP.
A API Cloud Healthcare recebe os cabeçalhos e os valida para aplicar as diretivas de consentimento à solicitação. A API Cloud Healthcare retorna uma resposta por meio do SMARTProxy para o cliente.
Configurar uma conta de serviço do Google Cloud
Um proxy pode ter apenas uma conta de serviço do Google Cloud. Se vários clientes usarem o mesmo proxy, eles usarão a mesma conta de serviço. Tenha cuidado ao compartilhar uma conta de serviço com vários clientes pelos seguintes motivos:
Para ler os dados FHIR na API Cloud Healthcare, a conta de serviço pode ser configurada para ter permissões amplas de leitura e gravação. Para mais informações sobre permissões, consulte Como controlar o acesso aos recursos da API Cloud Healthcare. Consulte as práticas recomendadas gerais para configurar o proxy.
Registros de auditoria do Cloud
O endereço de e-mail principal está vinculado à conta de serviço.
Por exemplo, se você chamar a API Cloud Healthcare diretamente usando sua Conta do Google para autenticação, os registros de auditoria do Cloud vão registrar seu endereço de e-mail como o endereço principal. Quando você usa um proxy para chamar a API Cloud Healthcare, o proxy usa a própria conta de serviço, e o endereço de e-mail principal é o endereço de e-mail da conta de serviço, e a conta original não é definida.
Registros de auditoria
Os registros de auditoria são gerados quando há uma solicitação de acesso ou quando a aplicação de acesso dos recursos muda.
ao máximo.
Se os registros de auditoria estiverem
ativados
na loja FHIR, um campo de metadados consentMode
será incluído nos registros de auditoria
disponíveis no Cloud Logging. O consentMode
pode ter um dos seguintes
valores:
off
: a configuração do repositório FHIR temconsentConfig.accessEnforced
definido comofalse
e não permite solicitações com consentimento.emptyScope
: o armazenamento FHIR temconsentConfig.accessEnforced
definido comotrue
, mas um cabeçalho de escopo de consentimento não foi incluído. Como resultado, os consentimentos não foram aplicados.enforced
: o armazenamento FHIR temconsentConfig.accessEnforced
definido comotrue
e o cabeçalho de escopo de consentimento está presente. Como resultado, os consentimentos foram avaliados e aplicados à solicitação.btg
: a solicitação FHIR tinhabtg
fornecido no cabeçalho do escopo de consentimento. Como resultado, as verificações de consentimento foram ignoradas. Essa solicitação é destinada a emergências e está sujeita apenas à análise pós-auditoria.bypass
: a solicitação FHIR tinha apenasbypass
fornecida no cabeçalho de escopo de consentimento. Como resultado, as verificações de consentimento foram puladas. Essa solicitação é destinada a ser usada por um fluxo de trabalho confiável (como um administrador ou um aplicativo confiável em vez de usuários finais) para que esse registro de auditoria seja diferente debtg
, que é usado para verificações de governança de dados.
Opcionalmente, você pode definir access_determination_log_config
como VERBOSE
para registrar mais informações
sobre por que uma solicitação foi concedida ou negada.
Acessar registros de auditoria de mudança de enforcement
Quando o recurso de base do compartimento muda (por exemplo, a remoção da tag
employee
de um paciente): o controle de acesso no recurso alterado e no compartimento
pode mudar devido à política de encadeamento do administrador. Isso vai acionar a reindexação em todos
os recursos do compartimento. O progresso da reindexação de cada atualização de recurso de base de compartimento pode ser rastreado no Cloud Logging com o filtro jsonPayload.@type="type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry"
.
Exemplo de registro de progresso de reindexação em 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
é o estado da operação de reindexação, jsonPayload.affectedResources
é o número de recursos de compartimento reindexados e jsonPayload.lastUpdated
é o carimbo de data/hora da atualização do recurso do paciente. Se a operação acabou de começar, jsonPayload.state="STATE_STARTED"
e jsonPayload.affectedResources
não estarão presentes.
Restrições e limitações
Esta seção mostra as restrições e os limites do FHIR R4, mas as mesmas restrições e limites se aplicam ao FHIR STU3.
Tipo | Restrições e limites |
---|---|
Recurso de consentimento único |
|
Modelo de aplicação |
|
X-Consent-Scope |
|
Métodos aceitos |
|
Desempenho |
|
Práticas recomendadas
As seções a seguir descrevem as práticas recomendadas ao usar o Controle de acesso do FHIR.
Práticas recomendadas gerais
Não import recursos do FHIR e chame
ApplyConsents
ouApplyAdminConsents
em paralelo. Recomendamos que você importe primeiro os recursos do FHIR e depois chameApplyConsents
ouApplyAdminConsents
. No entanto, se os recursos a serem importados não incluírem recursos de paciente ou consentimento, o modelo de aplicação não será afetado, e o processamento de consentimentos ou políticas de administrador não será necessário.Não crie pesquisas personalizadas e chame
ApplyConsents
em paralelo. Recomendamos que você faça uma depois da outra.Se os fluxos de trabalho exigirem a chamada de vários
ApplyConsents
emPatientScope
disjuntos, eles poderão ser chamados em paralelo.ApplyAdminConsents
pode ser executado em paralelo com qualquer número deApplyConsents
, mas não com outroApplyAdminConsents
.Ao configurar o proxy, restrinja a conta de serviço do IAM com permissões de leitura somente para evitar gravar os dados de um paciente nos registros de outro.
Não use o proxy de consentimento ao criar ou atualizar registros.
Valide todas as solicitações de gravação para evitar modificações inesperadas de dados de vários pacientes.
Quando os consentimentos em cascata são aplicados, os recursos de base do compartimento precisam ser importados primeiro, seguidos pelos recursos restantes do compartimento. Como alternativa, todos os recursos do compartimento podem ser agrupados em um único pacote e ingeridos usando
fhir.executeBundle
.
Excluir recurso de paciente
Ao excluir um recurso de paciente, se você também quiser remover a aplicação de consentimento
para esse paciente (especialmente quando
FhirStore.disableReferentialIntegrity
for verdadeiro), recomendamos seguir
esta ordem de operações:
Exclua todos os recursos de consentimento pertencentes ao recurso Paciente.
Chame
ApplyConsents
com o filtroPatientScope
.
Configurar um repositório para acesso de consentimento
Para configurar uma loja para acesso de consentimento, siga estas etapas:
Use
UpdateFhirStore
para definir oConsentConfig
com a aplicação de consentimentoversion
comoV1
e definaaccessEnforced
comotrue
.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"
Processar consentimentos de pacientes ou políticas administrativas
ApplyConsents
para consentimentos do paciente
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 políticas de administração e políticas de administração em cascata.
curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json" \ --data "{ 'newConsentsList': { 'names': [ 'projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/RESOURCE_ID_1/_history/VERSION_ID_1', ... 'projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/RESOURCE_ID_N/_history/VERSION_ID_N' ] }, 'validateOnly': false }" \ "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyAdminConsents"
Frequência de execução de ApplyConsents ou ApplyAdminConsents
Quando o campo
ConsentConfig
não está definido: o campoConsentConfig
não é definido quando uma loja FHIR é criada pela primeira vez e quando o campoConsentConfig
é limpo. Depois que o campoConsentConfig
for redefinido, repita a configuração da loja para acesso de consentimento antes de fazer solicitações que exigem consentimento para evitar a avaliação de políticas de aplicação de consentimento desatualizadas.Quando o modelo de aplicação muda: quando um recurso de consentimento é criado, atualizado ou excluído, o modelo de aplicação muda. Nesses casos, é necessário chamar
ApplyConsents
ouApplyAdminConsents
para que essas mudanças entrem em vigor.Se você puder acompanhar as mudanças de pacientes com consentimento, recomendamos usar o filtro
PatientScope
para evitar o reprocessamento de toda a loja. Esse filtro é útil para atualizar imediatamente a aplicação de um pequeno conjunto de pacientes.Também é possível executar
ApplyConsents
periodicamente usando o filtroTimeRange
. Esse filtro é útil quando a atualização imediata não é essencial. Por exemplo, a solicitação a seguir atualiza a aplicação de mudanças de consentimento entre UTC 0h 20/09/2022 e UTC 0h 21/09/2022.curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json" \ --data "{ 'validateOnly': false, 'timeRange': { 'start': '2022-09-20T00:00:00Z', 'end': '2022-09-21T00:00:00Z', } }" \ "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"
Usar a visualização de consentimento FHIR
O Visualizador de consentimento do FHIR mostra políticas de controle de acesso. Ele fornece uma tabela com escopos de consentimento para representar as regras de controle de acesso do FHIR.
Antes de usar o Visualizador de consentimento do FHIR, verifique o seguinte:
A configuração
disableResourceVersioning
do repositório FHIR precisa serfalse
. Essa configuração não pode ser alterada após a criação do armazenamento FHIR. Para criar um novo armazenamento de FHIR, consulte Criar um armazenamento de FHIR.O repositório FHIR está configurado para aplicação de consentimento.
Para acessar o visualizador de consentimento FHIR, siga estas etapas:
Console
No console do Google Cloud, acesse a página Navegador.
Selecione o conjunto de dados que contém o repositório FHIR com as políticas de consentimento aplicadas que você quer consultar.
Na página Armazenamentos de dados, na lista Armazenamentos de dados, selecione o armazenamento de FHIR com as políticas de consentimento aplicadas que você quer consultar.
Na página Detalhes do repositório de dados, clique na guia Consentimento. Os escopos de consentimento são exibidos.