Controle o acesso aos recursos FHIR na API Cloud Healthcare

Nesta página, descrevemos como usar Recursos de consentimento de FHIR para determinar o acesso a dados de armazenamentos FHIR na API Cloud Healthcare.

Para configurar um repositório FHIR com a aplicação de consentimento, siga estas etapas:

  1. Crie um repositório FHIR se você ainda não tiver um.

  2. Defina os seguintes parâmetros ConsentConfig do repositório 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 por CreateFhirStore ou UpdateFhirStore Depois de definido, você deve chamar ApplyConsents ou ApplyAdminConsents para alterar a versão.

    • access_enforced: se definido como true, ao acessar os recursos FHIR, o os cabeçalhos de consentimento fornecidos serão verificados de acordo com as diretivas de consentimento fornecidas pelos consumidores.

    • consent_header_handling: Se definida como PERMIT_EMPTY_SCOPE (padrão), o servidor permitirá solicitações sem cabeçalho X-Consent-Scope (ou vazio). Se definido como REQUIRED_ON_READ e access_enforced = true, o servidor rejeita todas as solicitações sem (ou vazio) cabeçalho X-Consent-Scope.

Configurar um novo repositório 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"

As políticas são representadas pelo recurso de consentimento. O campo "resource" finalidade e uso são descritos nos Documentos de 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 [pacote FHIR](/healthcare-api/docs/how-tos/fhir-bundles) para preencher o seguintes recursos:

  • Um recurso para profissionais chamado Jeffrey Brown
  • O recurso para pacientes chamado Darcy Smith
  • Um recurso de observação mostrando a medição de hemoglobina de Darcy (LOINC718-7) coletada pelo Happy Hospital
  • Um recurso de observação mostrando a medição de glicose de Darcy (LOINC15074-8).
  • Consentimento de Darcy para permitir que Jeffrey Brown use o aplicativo App/123 para acessar os dados coletados pelo Hospital Feliz
  • O consentimento de Darcy para permitir que Jeffrey Brown acesse os dados dela para: tratamento de emergência (ETREAT)
  • Um consentimento do Happy Hospital para permitir que Jeffrey Brown acesse todos os dados ao fazer pesquisa biomédica (BIORCH) com o aplicativo App/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 a seguir mais exemplos de R4. Recurso de consentimento que demonstra como políticas complexas podem ser representadas.

{
  "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. Isso O recurso de consentimento permite que o profissional acesse os dados do paciente se o os dados atendam a todas as condições a seguir.

  • Ele é do tipo Encounter com o ID Encounter/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 e code de Meta.tags:
    • Tem a tag (system = http://terminology.hl7.org/CodeSystem/common-tags e code = actionable)
    • Tem as duas tags (system = http://example.com/custom-tags e code = archived) e (system = http://example.com/custom-tags e code = insensitive)
  • Tem pelo menos um dos marcadores de segurança a seguir
    • system = http://terminology.hl7.org/CodeSystem/v3-Confidentiality e code é R, N, M, L, U.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCode e code = 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 da política do administrador que concede permissões a um profissional f002 com o objetivo de oferecer tratamento de dados representado por TREAT. O profissional é geolocalização iso3166-1/CA. Esse recurso de consentimento permite que acesso aos dados dos pacientes se eles atenderem a todos os estas condições:

  • Ele é do tipo Encounter com o ID Encounter/e001.
  • Ele vem da origem 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 e code = actionable)
    • Tem as duas tags (system = http://example.com/custom-tags e code = archived) e (system = http://example.com/custom-tags e code = insensitive)
  • Tem pelo menos um dos marcadores de segurança a seguir
    • system = http://terminology.hl7.org/CodeSystem/v3-Confidentiality e code é R, N, M, L, U.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCode e code = PSY.

Exemplo de diretiva de política em cascata do 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"
        }
      }
    ]
  }
}

O exemplo anterior representa um recurso de consentimento da 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 é de a geolocalização iso3166-1/CA. Esse recurso de consentimento permite que acesso aos dados do compartimento dos pacientes com tag employee: Todos os critérios só se aplica aos recursos base do compartimento, ou seja, o recurso "Paciente", já que controla de quais recursos a cascata será aplicada.

Aplicar consentimentos de pacientes ou políticas administrativas

Aplicar o consentimento do paciente até 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 é concluída, o servidor retorna uma resposta com o status a 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 do administrador até 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 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.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 com sucesso 1 política de administrador e atualizamos o acesso consensual de sete recursos (um profissional, um paciente, duas observações, dois consentimentos do paciente e uma política administrativa).

A aplicação de consentimentos armazenados em um repositório FHIR não entrará em vigor. até ApplyConsents (para consentimentos de pacientes) ou ApplyAdminConsents (para administradores) políticas e políticas em cascata do administrador) é chamado e concluído. Se Você adicionar, modificar ou remover consentimentos depois de executar ApplyConsents ou ApplyAdminConsents, você precisa executá-la novamente para que esses consentimentos sejam incluídos o 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 for a primeira vez que você está configurando a aplicação de consentimento no FHIR armazenar, aguarde a extensão de ApplyConsents ou ApplyAdminConsents operação seja concluída antes de fazer solicitações com base no consentimento.

Para chamar ApplyConsents em um subconjunto de pacientes, use o seguinte: filtros:

  • PatientScope: execute o ApplyConsents em uma lista de IDs de pacientes com até 10.000 pacientes.

  • TimeRange: para executar ApplyConsent em uma lista de IDs de recursos de pacientes com solicitações de os recursos são atualizados durante um determinado período

Para chamar ApplyAdminConsents: você precisa fornecer a lista completa de todos políticas que você quer aplicar (não uma lista incremental). Como resultado, um objeto vazio anulará 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 Loja de FHIR é controle de versões; caso contrário, um nome de recurso.

Você pode usar o operations.get para recuperar ProgressCounter da operação. Após a conclusão, há uma mensagem ApplyConsentsResponse incluída na Operation.response. Os contadores nas classes 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. É possível acessar os registros de erros no Cloud Logging ou, quando validateOnly for false, verificar o status da aplicação do consentimento usando CheckConsentEnforcementStatus ou CheckPatientConsentEnforcementStatus para recuperar os detalhes do erro.
secondarySuccess affectedResources Quando validateOnly for false, ele representará o número de recursos FHIR que foram reindexados com sucesso devido ao efeito da mudança do consentimento.
secondaryFailure failedResources Quando validateOnly for false, ele representará o número de recursos FHIR que podem ter o consentimento alterado, mas não foram reindexados. Isso pode afetar a pesquisa com contexto de consentimento, mas não outros métodos. Para conferir os detalhes do erro, acesse 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:

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. Você também pode pode usar fhirStores.get para ver todas as políticas de administrador ativas aplicadas ao armazenamento.

O consent-enforcement-status pode ter qualquer um destes valores:

  • OFF: representa o status de aplicação padrão de um novo recurso de consentimento. em que o recurso de consentimento nunca foi processed.

  • 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 o FHIR. específicas de serviço, mas não é executável. Isso ocorre devido à implementação limitada da aplicação do consentimento do FHIR com o nível atual de suporte aos recursos.

  • ENFORCEMENT_LIMIT_EXCEEDED: o estado em que o recurso de consentimento FHIR formato e o nível de suporte para o recurso estão livres de erros, mas ou mais das seguintes condições forem verdadeiras:

    • O paciente tem um grande conjunto de recursos de consentimento.

    • O tamanho das diretivas de consentimento em todos os consentimentos ativos é maior. que o tamanho máximo permitido das diretivas de consentimento para um FHIR servidor para aplicá-las.

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. O A resposta contém apenas os recursos que foram consentidos.

  1. Profissional Jeffrey Brown (identificado por Practitioner/12942879-f89f-41ae-aa80-0b911b649833) usando um aplicativo confiável, o App/123 pesquisa todas as observações com status=final.
  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/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"
    }
    
  3. Profissional Jeffrey Brown (identificado por Practitioner/12942879-f89f-41ae-aa80-0b911b649833) O uso do aplicativo App/123 pesquisa todas as observações da paciente Daniel.
  4. 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 é negado 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.

  5. O profissional Jeffrey Brown (identificado por Practitioner/12942879-f89f-41ae-aa80-0b911b649833) usando o aplicativo App/123 pesquisa todas as observações do paciente Darcy para fins de tratamento de emergência.
  6. 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"
    }
    
  7. Profissional Jeffrey Brown (identificado por Practitioner/12942879-f89f-41ae-aa80-0b911b649833) pesquisa observações com status=final para duas finalidades: tratamento e pesquisa
  8. 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 deve remover uma imagem de "X-Consent-Scope" na solicitação.

  9. O administrador de TI de um hospital usa o bypass para pesquisar tudo Profissionais de saúde em um hospital.
  10. 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ê deve 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"
    }
    

A API Cloud Healthcare oferece suporte ao recurso "get FHIR" em um determinado Repositório de FHIR com actor, purpose e environment como parâmetros de consulta. O A resposta contém apenas os recursos que foram consentidos.

  1. Profissional Jeffrey Brown (identificado por Practitioner/12942879-f89f-41ae-aa80-0b911b649833) o uso do aplicativo App/123 lê a medição da hemoglobina do paciente (neste exemplo, Observation/7473784b-46a8-470c-b9a6-fe38a01025aa).
  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/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
      }
    }
    
  3. Profissional Jeffrey Brown (identificado por Practitioner/12942879-f89f-41ae-aa80-0b911b649833) usando o aplicativo desconhecido App/unknown, lê a medição da hemoglobina do paciente (neste exemplo, Observation/7473784b-46a8-470c-b9a6-fe38a01025aa).
  4. 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 limite de acesso do solicitante ("App/unknown") não é permitido pelo consentimento do paciente, a solicitação será negada.

    {
      "issue": [
        {
          "code": "security",
          "details": {
            "text": "permission_denied"
          },
          "diagnostics": "Consent access denied or the resource being accessed does not exist",
          "severity": "error"
        }
      ],
      "resourceType": "OperationOutcome"
    }
    
  5. O profissional de saúde Jeffrey Brown (identificado por Practitioner/12942879-f89f-41ae-aa80-0b911b649833) faz pesquisas biomédicas usando o aplicativo App/golden e lê a data de nascimento de Darcy (neste exemplo, Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2).
  6. 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 o consentimento, a resposta é o conteúdo do Recurso do 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"
    }
    
  7. Profissional Jeffrey Brown (identificado por Practitioner/12942879-f89f-41ae-aa80-0b911b649833) solicita acesso não autorizado emergencial ao prontuário de um paciente usando a solicitação de acesso imediato protocolo. (neste exemplo, Observation/7473784b-46a8-470c-b9a6-fe38a01025aa).
  8. 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 o consentimento e verificações de tempo de atividade. A resposta é o conteúdo do recurso 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
      }
    }
    

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 com consentimento.

Ao fazer uma solicitação, o servidor de autorização é responsável por gerar 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 imporar o controle de acesso baseado em consentimento a dados em armazenamentos FHIR.

Uma solicitação FHIR pode oferecer suporte a 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 um determinado solicitação FHIR.

Para escopos especiais, uma solicitação FHIR pode oferecer suporte a btg ou bypass.

Defina cabeçalhos HTTP para aplicativos confiáveis

Esta seção só será necessária se você estiver usando um cliente servidor de autorização. Nesse caso, você também precisa usar um proxy SMART ou proxy 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 ser registrado para um subconjunto de escopos, como como um escopo de environment do aplicativo, ou o aplicativo pode apresentar uma widget de seleção para definir algumas entradas de escopo, como o purpose do acessador.

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.

A API Cloud Healthcare oferece suporte integrado para o consentimento FHIR com base nos escopos de consentimento de entrada. Os administradores de repositórios FHIR responsável por criar e configurar um servidor de autorização API Cloud Healthcare que concede 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, observe 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 SMARTProxy

O SMARTProxy é um proxy de código aberto do Google que oferece recursos:

  • Permite que o servidor FHIR da API Cloud Healthcare aceite e valide usando tokens de acesso com base no consentimento.

  • Permite que a implementação de FHIR na API Cloud Healthcare inclua tokens de acesso com reconhecimento de consentimento como parte do gerenciamento e da API Cloud Healthcare modelo de permissão.

  • 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 através do SMARTProxy, ocorre o seguinte:

  1. O SMARTProxy aceita uma solicitação de um cliente que contém um token com reconhecimento de consentimento.

  2. O SMARTProxy valida o token com reconhecimento de consentimento por uma autorização JWT de sua propriedade.

  3. O SMARTProxy lê os escopos do token de reconhecimento de consentimento e os passa para a API Cloud Healthcare pelo cabeçalho HTTP.

  4. A API Cloud Healthcare recebe os cabeçalhos e os valida para aplicar diretivas de consentimento na 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 usam o mesmo proxy, a mesma conta de serviço é usada pelos clientes. Usar tenha cuidado ao compartilhar uma conta de serviço com vários clientes para os seguintes motivos:

Por exemplo, se você chamar a API Cloud Healthcare diretamente usando sua Conta para a autenticação, os Registros de auditoria do Cloud registram seu endereço de e-mail como o endereço de e-mail 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 estiver definida.

Registros de auditoria

Os registros de auditoria são gerados quando há uma solicitação de acesso ou quando mudanças na aplicação das políticas.

ao máximo.

Se os registros de auditoria forem ativado no repositório FHIR, um campo de metadados consentMode será incluído na auditoria registros disponíveis no Cloud Logging. O consentMode pode ter uma das seguintes opções: valores:

  • off: a configuração do repositório FHIR tem consentConfig.accessEnforced definido. false e não permite solicitações que reconhecem o consentimento.

  • emptyScope: o repositório FHIR tem consentConfig.accessEnforced definido como true, mas um cabeçalho do escopo de consentimento não foi incluído. Por isso, os consentimentos não foram aplicadas.

  • enforced: o repositório FHIR tem consentConfig.accessEnforced definido como true. e o cabeçalho do escopo de consentimento estava presente. Por isso, os consentimentos foram avaliado e aplicado na solicitação.

  • btg: a solicitação FHIR tinha btg fornecido no cabeçalho do escopo de consentimento. Como as verificações de consentimento foram ignoradas. Esta solicitação se destina a ser usada para em emergências e sujeito apenas à análise pós-auditoria.

  • bypass: a solicitação FHIR tinha apenas bypass fornecida no cabeçalho de escopo de consentimento. Por isso, as verificações de consentimento foram ignoradas. 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 de btg, que é usado para verificações de governança de dados.

Também é possível definir access_determination_log_config como VERBOSE para registrar mais informações sobre por que uma solicitação é concedida ou negada.

Registros de auditoria de alteração da aplicação de acesso

Quando o recurso base do compartimento mudar (por exemplo, remover a conta do Tag employee): o controle de acesso do recurso alterado e do compartimento dele. pode mudar devido à política em cascata do administrador. Isso acionará a reindexação em todos os recursos de compartimento. O progresso da reindexação de cada base de compartimento a atualização de recursos pode ser rastreada 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 compartimentos reindexados e jsonPayload.lastUpdated é o carimbo de data/hora da atualização dos recursos dos pacientes. Se a operação tiver sido iniciada há pouco tempo, jsonPayload.state="STATE_STARTED" e jsonPayload.affectedResources não estarão presentes.

Restrições e limitações

Nesta seção, mostramos as restrições e os limites para FHIR R4, mas as mesmas restrições e limites se aplicam ao FHIR STU3.

Tipo Restrições e limites
Recurso de consentimento único
  • Só é possível usar uma única Consent.provision. Não é possível usar várias provisões ou provisionamentos aninhados.
  • No mínimo 1 Consent.provision.actor e no máximo 25:
    • Consent.provision.actor.role precisa ser http://terminology.hl7.org/CodeSystem/v3-RoleCode.
    • Consent.provision.actor.code precisa ser GRANTEE ou HPOWATT.
  • No máximo 1 Consent.provision.purpose:
    • Consent.provision.purpose.system precisa ser http://terminology.hl7.org/CodeSystem/v3-ActReason.
    • Consent.provision.purpose.code não está vazio e precisa ter no máximo 13 caracteres.
  • No máximo 1 environment:
    • Consent.provision.extension.url precisa ser https://g.co/fhir/medicalrecords/Environment.
    • O comprimento do sistema e do código combinados deve ser inferior a 15 caracteres.
  • Se você filtrar por tipo de recurso, Consent.provision.class.system precisará ser http://hl7.org/fhir/resource-types.
  • Se a filtragem for por fonte de dados, Consent.provision.extension.url precisa ser https://g.co/fhir/medicalrecords/DataSource.
  • Se você filtrar por tag de dados, Consent.provision.extension.url precisará ser https://g.co/fhir/medicalrecords/DataTag.
    • A tag de dados pode ser uma extensão complexa, aninhada em um nível, para descrever uma política que combina recursos com todas as tags especificadas (interpretadas de forma conjuntiva).
    • No máximo, cinco tags aninhadas são aceitas.
  • No máximo 100 valores para todos os atributos repetidos, a menos que descrito de maneira diferente nesta linha.
Modelo de aplicação
  • Cada paciente pode ter até 200 recursos de consentimento do active aplicados por vez.
  • Cada loja pode ter até 200 políticas de administrador do active aplicadas por vez.
  • Um formato compacto especial para o conjunto de todas as diretivas de consentimento em todos os consentimentos ativos de um determinado paciente não pode exceder um limite de tamanho definido. Normalmente, há capacidade suficiente para codificar milhares de diretivas de consentimento, a menos que strings de recursos muito longas sejam particularmente abundantes. Exemplo:
    • Centenas de consentimentos em fontes de dados e tags de dados únicas, cada um dos quais é muito longo consome muito espaço.
    • Um único paciente com 3.000 entradas de identificador de recursos Consent.provision.data.reference exclusivas em vários consentimentos ativos, cada uma especificando um Consent.provision.actor exclusivo, usa o espaço de maneira mais agressiva do que as disposições que não especificam nenhuma restrição de referência de dados ou contêm muitas das mesmas strings de referência de atores.
  • Cada recurso pode ter até mil diretivas de consentimento de todos os consentimentos aplicáveis a ele.
X-Consent-Scope
  • Mínimo de uma e máximo de três entradas actor.
  • Máximo de uma entrada purp:
    • Cada entrada purp precisa estar no formato system/code (v3 é o sistema registrado para http://terminology.hl7.org/CodeSystem/v3-ActReason).
    • O código precisa ser menor que 13.
  • Máximo de uma entrada env:
    • Cada entrada env precisa estar no formato system/code.
    • O comprimento do sistema e do código combinados deve ser inferior a 15.
  • btg requer no mínimo uma entrada actor.
  • bypass requer no mínimo uma entrada actor e uma entrada env.
Métodos aceitos
Desempenho
  • ApplyConsents e ApplyAdminConsents são dimensionados de maneira semelhante ou melhor que ImportResources.
  • Sobre as solicitações com base no consentimento:
    • Nosso modelo de consentimento foi otimizado para a performance de operações CRUD, incluindo a pesquisa em muitos recursos e pacientes.
    • Uma leitura de recursos individuais pode ter um impacto marginal na latência de solicitação. No entanto, a performance da pesquisa varia de acordo com a consulta de base e o número de escopos de consentimento que geram mais critérios de acesso ativos durante uma pesquisa.
    • Recomendamos que você execute seus próprios testes de desempenho em vários parâmetros de solicitação de FHIR representativos para determinar as características de desempenho dos seus casos de uso com base nas características dos seus dados, como a quantidade de recursos de um determinado tipo de recurso de pesquisa no armazenamento de FHIR.
    • Nossa solução mantém o processamento e as atualizações de todos os recursos, inclusive os de consentimento, leves de modo que a capacidade de processamento durante a ingestão e outras formas de tráfego de gravação prossigam com impacto mínimo.

Práticas recomendadas

As seções a seguir descrevem as práticas recomendadas ao usar o controle de acesso FHIR.

Práticas recomendadas gerais

  • Não importe recursos do FHIR e chame ApplyConsents ou ApplyAdminConsents em paralelo. Recomendamos importar primeiro os recursos do FHIR e depois chamar ApplyConsents ou ApplyAdminConsents. No entanto, se os recursos a serem importados não incluam recursos de pacientes ou de consentimento, modelo de aplicação não será afetado e consentimento de processamento ou políticas do administrador não é necessário.

  • O que não fazer criar pesquisas personalizadas e chamar ApplyConsents em paralelo. Recomendamos que você faça isso depois com o outro.

  • Caso seus fluxos de trabalho exijam a chamada de vários ApplyConsents em conjuntos separados PatientScope, elas podem ser chamadas em paralelo.

  • ApplyAdminConsents pode ser executada em paralelo com qualquer número de ApplyConsents, mas não com outro ApplyAdminConsents.

  • Ao configurar o proxy, restrinja a conta de serviço do IAM com permissões somente leitura para evitar gravar os dados de um paciente em outro prontuários do paciente.

  • 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 dados de pacientes diferentes.

  • 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, todas os recursos de compartimentos podem ser unidos 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:

  1. Exclua todos os recursos de consentimento pertencentes ao recurso Paciente.

  2. Chame ApplyConsents com o filtro PatientScope.

Se quiser configurar um armazenamento para acesso de consentimento, siga estas etapas:

  1. Use UpdateFhirStore para definir ConsentConfig com a aplicação do 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"
  2. Processar o consentimento dos pacientes ou políticas administrativas

    1. ApplyConsents para consentimento de 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"
    1. 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 campo ConsentConfig não é definido quando um repositório de FHIR é criado pela primeira vez e quando o campo ConsentConfig está limpa. Quando o campo ConsentConfig não estiver definido, será preciso repetir o configurar o armazenamento para acesso de consentimento antes de fazer solicitações com base no consentimento para evitar a avaliação do consentimento desatualizado políticas de aplicação obrigatória.

  • Quando o modelo de aplicação muda: quando um o recurso de consentimento é criado, atualizado ou excluído, o modelo de aplicação mudanças. Nesses casos, chame ApplyConsents ou ApplyAdminConsents para que as mudanças entrem em vigor.

    • Se você conseguir acompanhar as mudanças em "Pacientes com consentimento", recomendamos use o filtro PatientScope para evitar o reprocessamento de todo o armazenamento. Este filtro é útil para atualizar imediatamente a aplicação de uma restrição conjunto de pacientes.

    • Também é possível executar ApplyConsents periodicamente usando a TimeRange. filtro. Este 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 0AM 20-09-2022 e UTC 0AM 2022-09-21.

      curl -X POST \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "Content-Type: application/json" \
        --data "{
           'validateOnly': false,
           'timeRange': {
             'start': '2022-09-20T00:00:00Z',
             'end': '2022-09-21T00:00:00Z',
           }
          }" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"

A seguir