Controlar el acceso a los recursos de FHIR en la API de Cloud Healthcare

En esta página, se describe cómo usar Recursos de consentimiento de FHIR para determinar el acceso a los datos de los almacenes de FHIR en la API de Cloud Healthcare.

Para configurar un almacén de FHIR con aplicación de consentimiento, completa los siguientes pasos:

  1. Crea un almacén de FHIR si aún no tienes uno.

  2. Configura los siguientes parámetros de ConsentConfig del almacén de FHIR para habilitar la aplicación del consentimiento:

    • version: Especifica para qué versión de aplicación de consentimiento se utiliza. en el almacén de FHIR. Este valor solo se puede establecer una vez mediante CreateFhirStore o UpdateFhirStore. Luego de establecerlo, debes llamar a ApplyConsents o ApplyAdminConsents para cambiar la versión.

    • access_enforced: Si se configura como true, cuando accedes a los recursos de FHIR, el los encabezados de consentimiento proporcionados se verificarán con las directivas de consentimiento que se proporcionen. por los consumidores.

    • consent_header_handling Si se establece en PERMIT_EMPTY_SCOPE (valor predeterminado), el servidor permite solicitudes sin el encabezado X-Consent-Scope (o vacío). Si se establece en REQUIRED_ON_READ y access_enforced = true, el servidor rechaza todas las solicitudes sin encabezado X-Consent-Scope (o vacío).

Configura un nuevo almacén de FHIR con ConsentConfig

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json" \
    --data "{
      'version': 'R4',
      'enableUpdateCreate': true,
      'consentConfig': {
        'version': 'V1',
        'accessEnforced': true
      }
    }" "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores?fhirStoreId=FHIR_STORE_ID"

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID",
  "version": "R4",
  "enableUpdateCreate": true,
  "consentConfig": {
    "version": "V1"
  }
}

Si ya tienes una tienda existente, usa UpdateFhirStore para establecer la ConsentConfig con la aplicación de consentimiento version como V1 y establece accessEnforced en 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"

Las políticas se representan a través del Recurso de consentimiento. Los campos de recursos propósito y el uso se describen en los documentos del modelo de datos.

A continuación, se muestra un ejemplo de todos los recursos que se pueden crear para este ejemplo en particular.

Crea recursos de FHIR

En el siguiente ejemplo, se muestra cómo ejecutar una [paquete de FHIR](/health-api/docs/how-tos/fhir-bundles) para propagar los siguientes recursos:

  • Un recurso de un profesional con el nombre José Borrero
  • Un recurso de un paciente con el nombre Diana Sánchez
  • Un recurso de observación que muestra la medición de hemoglobina de Darcy (LOINC718-7) que recopiló el Hospital feliz
  • Un recurso de observación que muestra la medición de glucosa de Darcy (LOINC15074-8).
  • Un consentimiento de Darcy para permitir que Jeffrey Brown use la aplicación App/123 para acceder a los datos que recopiló Happy Hospital
  • Un consentimiento de Darcy para permitir que Jeffrey Brown acceda a cualquiera de sus datos por tratamiento de emergencia (ETREAT)
  • Un consentimiento del Happy Hospital para permitir que Jeffrey Brown acceda a todos los datos al realizar una investigación biomédica (BIORCH) con la aplicación 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"

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
  "entry": [
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/12942879-f89f-41ae-aa80-0b911b649833/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/68583624-9921-4158-8754-2a306c689abd/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/10998b60-a252-405f-aa47-0702554ddc8e/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/73c54e8d-2789-403b-9dee-13085c5d5e34/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/5c8e3f8a-9fd5-480d-a08e-f29b89feccde/_history/VERSION_ID",
        "status": "201 Created"
      }
    }
  ],
  "resourceType": "Bundle",
  "type": "transaction-response"
}

A continuación, se muestran más ejemplos de R4 Recurso de consentimiento que demuestra cómo se pueden representar las políticas complejas.

{
  "resourceType": "Consent",
  "id": "patient-consent-example",
  "patient": {
    "reference": "Patient/f001"
  },
  "category": [
    {
      "coding": [
        {
          "system": "http://loinc.org",
          "code": "59284-0"
        }
      ]
    }
  ],
  "scope": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/consentscope",
        "code": "patient-privacy"
      }
    ]
  },
  "policyRule": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "OPTIN"
      }
    ]
  },
  "status": "active",
  "provision": {
    "type": "permit",
    "actor": [
      {
        "reference": {
          "reference": "Practitioner/f002"
        },
        "role": {
          "coding": [
            {
              "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode",
              "code": "GRANTEE"
            }
          ]
        }
      }
    ],
    "purpose": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason",
        "code": "TREAT"
      }
    ],
    "class": [
      {
        "system": "http://hl7.org/fhir/resource-types",
        "code": "Encounter"
      }
    ],
    "data": [
      {
        "meaning": "instance",
        "reference": {
          "reference": "Encounter/e001"
        }
      }
    ],
    "extension": [
      {
        "url": "https://g.co/fhir/medicalrecords/Environment",
        "valueCodeableConcept": {
          "coding": [
            {
              "system": "iso3166-1",
              "code": "CA"
            }
          ]
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "valueCoding": {
          "system": "http://terminology.hl7.org/CodeSystem/common-tags",
          "code": "actionable"
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "extension": [
          {
            "url": "https://g.co/fhir/medicalrecords/DataTag",
            "valueCoding": {
              "system": "http://example.com/custom-tags",
              "code": "archived"
            }
          },
          {
            "url": "https://g.co/fhir/medicalrecords/DataTag",
            "valueCoding": {
              "system": "http://example.com/custom-tags",
              "code": "insensitive"
            }
          }
        ]
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataSource",
        "valueUri": "http://somesystem.example.org/foo"
      }
    ],
    "securityLabel": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-Confidentiality",
        "code": "R"
      },
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "PSY"
      }
    ]
  }
}

El ejemplo anterior representa el recurso de consentimiento de un paciente en el que f001 le da permiso a un profesional f002 con el objetivo de proporcionar tratamiento regular representado por TREAT. El profesional proviene de la ubicación geográfica iso3166-1/CA. Esta El recurso de consentimiento permite al profesional acceder a los datos del paciente si el los datos satisfacen todas las siguientes condiciones.

  • Es un tipo Encounter con el ID Encounter/e001.
  • Proviene de la fuente http://somesystem.example.org/foo.
  • Cumple con, al menos, una de las siguientes condiciones en la etiqueta (se pueden etiquetar los recursos estableciendo los campos system y code de Meta.tag):
    • Tiene la etiqueta (system = http://terminology.hl7.org/CodeSystem/common-tags) y code = actionable)
    • Tiene ambas etiquetas (system = http://example.com/custom-tags y code = archived) y (system = http://example.com/custom-tags y code = insensitive)
  • Tiene al menos una de las siguientes etiquetas de seguridad
    • system = http://terminology.hl7.org/CodeSystem/v3-Confidentiality y code es uno de R, N, M, L y U.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCode y code = PSY.

Ejemplo de directiva de política de administración

{
  "resourceType": "Consent",
  "id": "admin-policy-example",
  "patient": {},
  "extension": [{
    "url": "https://g.co/fhir/medicalrecords/ConsentAdminPolicy"
  }],
  "category": [
    {
      "coding": [
        {
          "system": "http://loinc.org",
          "code": "57017-6"
        }
      ]
    }
  ],
  "scope": {},
  "policyRule": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "OPTIN"
      }
    ]
  },
  "status": "active",
  "provision": {
    "type": "permit",
    "actor": [
      {
        "reference": {
          "reference": "Practitioner/f002"
        },
        "role": {
          "coding": [
            {
              "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode",
              "code": "GRANTEE"
            }
          ]
        }
      }
    ],
    "purpose": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason",
        "code": "TREAT"
      }
    ],
    "class": [
      {
        "system": "http://hl7.org/fhir/resource-types",
        "code": "Encounter"
      }
    ],
    "data": [
      {
        "meaning": "instance",
        "reference": {
          "reference": "Encounter/e001"
        }
      }
    ],
    "extension": [
      {
        "url": "https://g.co/fhir/medicalrecords/Environment",
        "valueCodeableConcept": {
          "coding": [
            {
              "system": "iso3166-1",
              "code": "CA"
            }
          ]
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "valueCoding": {
          "system": "http://terminology.hl7.org/CodeSystem/common-tags",
          "code": "actionable"
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "extension": [
          {
            "url": "https://g.co/fhir/medicalrecords/DataTag",
            "valueCoding": {
              "system": "http://example.com/custom-tags",
              "code": "archived"
            }
          },
          {
            "url": "https://g.co/fhir/medicalrecords/DataTag",
            "valueCoding": {
              "system": "http://example.com/custom-tags",
              "code": "insensitive"
            }
          }
        ]
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataSource",
        "valueUri": "http://somesystem.example.org/foo"
      }
    ],
    "securityLabel": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-Confidentiality",
        "code": "R"
      },
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "PSY"
      }
    ]
  }
}

El ejemplo anterior representa una política del administrador que el recurso de consentimiento otorga permiso a un profesional f002 con el fin de brindar servicios tratamiento representado por TREAT. El profesional es la ubicación geográfica iso3166-1/CA. Este recurso de consentimiento permite que las profesional de la salud accedan a los datos del paciente si estos satisfacen todos los las siguientes condiciones:

  • Es un tipo Encounter con el ID Encounter/e001.
  • Proviene de la fuente http://somesystem.example.org/foo.
  • Cumple con al menos una de las siguientes condiciones en la etiqueta:
    • Tiene la etiqueta (system = http://terminology.hl7.org/CodeSystem/common-tags) y code = actionable)
    • Tiene ambas etiquetas (system = http://example.com/custom-tags y code = archived) y (system = http://example.com/custom-tags y code = insensitive)
  • Tiene al menos una de las siguientes etiquetas de seguridad
    • system = http://terminology.hl7.org/CodeSystem/v3-Confidentiality y code es uno de R, N, M, L y U.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCode y code = PSY.

Ejemplo de directiva de política en cascada de administración

{
  "resourceType": "Consent",
  "id": "admin-cascading-policy-example",
  "patient": {},
  "extension": [
    { "url": "https://g.co/fhir/medicalrecords/ConsentAdminPolicy" },
    { "url": "https://g.co/fhir/medicalrecords/CascadingPolicy" }
  ],
  "category": [
    {
      "coding": [
        {
          "system": "http://loinc.org",
          "code": "57017-6"
        }
      ]
    }
  ],
  "scope": {},
  "policyRule": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "OPTIN"
      }
    ]
  },
  "status": "active",
  "provision": {
    "type": "permit",
    "actor": [
      {
        "reference": {
          "reference": "Practitioner/f002"
        },
        "role": {
          "coding": [
            {
              "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode",
              "code": "GRANTEE"
            }
          ]
        }
      }
    ],
    "purpose": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason",
        "code": "TREAT"
      }
    ],
    "class": [
      {
        "system": "http://hl7.org/fhir/resource-types",
        "code": "Patient"
      }
    ],
    "extension": [
      {
        "url": "https://g.co/fhir/medicalrecords/Environment",
        "valueCodeableConcept": {
          "coding": [
            {
              "system": "iso3166-1",
              "code": "CA"
            }
          ]
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "valueCoding": {
          "system": "http://terminology.hl7.org/CodeSystem/common-tags",
          "code": "employee"
        }
      }
    ]
  }
}

El ejemplo anterior representa un recurso de consentimiento de una política en cascada del administrador que otorga permiso a un profesional f002 con el fin de proporcionar tratamiento regular representado por TREAT. El profesional es de la ubicación geográfica iso3166-1/CA. Este recurso de consentimiento permite que las profesional de la salud acceda a los datos del compartimento de los pacientes con una etiqueta employee. Todos los criterios de recursos solo se aplica a los recursos básicos del compartimento, es decir, el recurso Paciente, ya que que controla los recursos de origen.

Aplica de manera forzosa los consentimientos de los pacientes o las políticas de administración.

Haga cumplir el consentimiento del paciente antes del ApplyConsents

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

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
}

La respuesta contiene un nombre de operación. Para hacer un seguimiento del estado de la operación, puedes usar el [Método `get` de la operación](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get):

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

Cuando la operación finaliza, el servidor muestra una respuesta con el estado de la operación en formato JSON:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1beta1.fhir.FhirStoreService.ApplyConsents",
    "createTime": "CREATE_TIME",
    "endTime": "END_TIME",
    "logsUrl": "https://console.cloud.google.com/logs/query/CLOUD_LOGGING_URL",
    "counter": {
      "success": "2",
      "secondarySuccess": "5"
    }
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.fhir.ApplyConsentsResponse",
    "consentApplySuccess": "2",
    "affectedResources": "5"
  }
}

Esta respuesta indicó que el servidor procesó con éxito 2 consentimientos y actualizó el acceso consensual de 5 recursos (1 del paciente, 2 Consentimientos, 2 Observaciones).

Aplica la política de administración antes del ApplyAdminConsents

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json" \
    --data "{
      'validateOnly': false,
      'newConsentsList': {
        'names': ['projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/5c8e3f8a-9fd5-480d-a08e-f29b89feccde/_history/VERSION_ID']
      }
    }" \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyAdminConsents"

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
}

La respuesta contiene un nombre de operación. Para hacer un seguimiento del estado de la operación, puedes usar el [Método `get` de la operación](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get):

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

Cuando la operación finaliza, el servidor muestra una respuesta con el estado de la operación en formato JSON:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1beta1.fhir.FhirStoreService.ApplyAdminConsents",
    "createTime": "CREATE_TIME",
    "endTime": "END_TIME",
    "logsUrl": "https://console.cloud.google.com/logs/query/CLOUD_LOGGING_URL",
    "counter": {
      "success": "1",
      "secondarySuccess": "7"
    }
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.fhir.ApplyAdminConsentsResponse",
    "consentApplySuccess": "1",
    "affectedResources": "7"
  }
}

Esta respuesta indicó que el servidor procesó correctamente 1 política de administración y actualizó el acceso consensuado a 7 recursos (1 profesional, 1 paciente, 2 observaciones, 2 consentimientos de pacientes y 1 política del administrador).

No entrará en vigencia la aplicación de los consentimientos almacenados en un almacén de FHIR hasta el ApplyConsents (para los consentimientos de los pacientes) o hasta el ApplyAdminConsents (para los administradores políticas en cascada de administración) y se completa correctamente. Si agregas, modificas o quitas consentimientos después de ejecutar ApplyConsents o ApplyAdminConsents, debes volver a ejecutarla para que se incluyan esos consentimientos el modelo de aplicación.

Los recursos de FHIR se indexan de forma asíncrona, por lo que puede haber un leve retraso entre el momento en que se completan ApplyConsents o ApplyAdminConsents y cuando el modelo de aplicación se refleja en los resultados de la búsqueda. Esta demora solo en las solicitudes de búsqueda.

Si es la primera vez que configuras la aplicación del consentimiento en el FHIR almacén, espera el ApplyConsents o ApplyAdminConsents de larga duración la operación antes de realizar solicitudes basadas en el consentimiento.

Para llamar a ApplyConsents en un subconjunto de pacientes, puedes usar los siguientes filtros:

  • PatientScope: para ejecutar ApplyConsents en una lista de ID de pacientes con hasta 10,000 pacientes

  • TimeRange: para ejecutar ApplyConsent en una lista de ID de recursos de pacientes cuyos recursos de consentimiento se actualizan durante un período determinado

Para llamar a ApplyAdminConsents, debes proporcionar la lista completa de todos. políticas que deseas aplicar (no una lista incremental). Como resultado, una tabla vacía anulará la aplicación de todas las políticas de administración de la tienda. Cada política debe ser un nombre de versión del recurso si el Tienda de FHIR es el control de versiones y, en caso contrario, el nombre del recurso.

Puedes usar operations.get para recuperar el ProgressCounter de la operación. Una vez completada, se incluye una ApplyConsentsResponse en la Operation.response Los contadores en ProgressCounter y ApplyConsentsResponse o ApplyAdminConsentsResponse se describen en la siguiente tabla.

ProgressCounter ApplyConsentsResponse o ApplyAdminConsentsResponse Descripción
success consentApplySuccess La cantidad de recursos de consentimiento que la operación procesó correctamente.
failure consentApplyFailure La cantidad de recursos de consentimiento que no son compatibles o no son válidas. Puedes ver los registros de errores en Cloud Logging o, cuando validateOnly sea false, verificar el estado de la aplicación de consentimiento con CheckConsentEnforcementStatus o CheckPatientConsentEnforcementStatus para recuperar los detalles del error.
secondarySuccess affectedResources Cuando validateOnly es false, representa la cantidad de recursos de FHIR que se volvieron a indexar de forma correcta debido al cambio del consentimiento.
secondaryFailure failedResources Cuando validateOnly es false, representa la cantidad de recursos de FHIR que pueden tener un cambio de consentimiento, pero no se pudieron volver a indexar. Esto puede afectar la búsqueda con contexto de consentimiento, pero no otros métodos. Para ver los detalles de los errores, puedes consultar los registros de errores en Cloud Logging.

Cuando se procesan los recursos de consentimiento de FHIR, puedes usar las siguientes API para verificar el estado de la aplicación de un solo consentimiento o de todos los consentimientos de un paciente:

Para la política de administración, CheckConsentEnforcementStatus solo se puede usar para realizar verificaciones el estado de aplicación de una sola política de administración de consentimiento. Como alternativa, puedes usar fhirStores.get para ver todas las políticas de administración activas que se aplican a la tienda.

La consent-enforcement-status puede tener cualquiera de los siguientes valores:

  • OFF: Representa el estado de aplicación predeterminado de un nuevo recurso de consentimiento. en el que el recurso Consent nunca se procesados.

  • ENFORCEABLE: Es el estado en el que se procesó correctamente el recurso de consentimiento.

  • INACTIVE: Es un estado inactivo en el que se ignora el recurso de consentimiento.

  • UNSUPPORTED: Es el estado de un recurso de consentimiento que puede cumplir con las especificaciones de FHIR, pero que no se puede aplicar. Esto se debe a una implementación limitada de la aplicación del consentimiento de FHIR con el nivel actual de compatibilidad de funciones.

  • ENFORCEMENT_LIMIT_EXCEEDED: Es el estado en el que el formato de recursos del consentimiento de FHIR y el nivel de compatibilidad con el recurso no tienen errores. Sin embargo, una o más de las siguientes condiciones son verdaderas:

    • El paciente tiene un gran conjunto de recursos de consentimiento.

    • El tamaño de las directivas de consentimiento en todos los consentimientos activos es mayor que el tamaño máximo permitido de las directivas de consentimiento para que un servidor FHIR las aplique.

La API de Cloud Healthcare admite búsquedas de recursos de FHIR de un Almacén de FHIR con actor, purpose y environment como parámetros de consulta. La respuesta contiene solo los recursos que están en consentimiento.

  1. Jeffrey Brown (identificado por Practitioner/12942879-f89f-41ae-aa80-0b911b649833) Cuando se usa una aplicación confiable, App/123 busca en todas las observaciones con 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"
    

    Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

    {
      "entry": [
        {
          "fullUrl": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION_ID/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa",
          "resource": {
            "code": {
              "coding": [
                {
                  "code": "718-7",
                  "display": "Hemoglobin [Mass/volume] in Blood",
                  "system": "http://loinc.org"
                }
              ]
            },
            "effectivePeriod": {
              "start": "2021-12-10T05:30:10+01:00"
            },
            "id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
            "issued": "2021-12-10T13:30:10+01:00",
            "meta": {
              "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
              "source": "http://example.com/HappyHospital",
              "versionId": "VERSION_ID"
            },
            "resourceType": "Observation",
            "status": "final",
            "subject": {
              "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
            },
            "valueQuantity": {
              "code": "g/dL",
              "system": "http://unitsofmeasure.org",
              "unit": "g/dl",
              "value": 7.2
            }
          },
          "search": {
            "mode": "match"
          }
        }
      ],
      "link": [
        {
          "relation": "search",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
        }
      ],
      "resourceType": "Bundle",
      "total": 1,
      "type": "searchset"
    }
    
  3. Jeffrey Brown (identificado por Practitioner/12942879-f89f-41ae-aa80-0b911b649833) usando la aplicación App/123 busca todas las observaciones del paciente Darcy.
  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"
    

    Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

    {
      "link": [
        {
          "relation": "search",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy"
        }
      ],
      "resourceType": "Bundle",
      "total": 0,
      "type": "searchset"
    }
    

    La consulta anterior es una búsqueda en cadena. Dado que la situación de consentimiento actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123 se le deniega el acceso al recurso Patient Darcy (identificado por Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2), el servidor de FHIR no devuelve una observación del Paciente como si este no existiera.

  5. Jeffrey Brown (identificado por Practitioner/12942879-f89f-41ae-aa80-0b911b649833) que utiliza la aplicación App/123 busca todas las observaciones del El paciente Darcy para tratamientos de emergencia.
  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"
    

    Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

    {
      "entry": [
        {
          "fullUrl": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/68583624-9921-4158-8754-2a306c689abd",
          "resource": {
            "code": {
              "coding": [
                {
                  "code": "15074-8",
                  "display": "Glucose [Moles/volume] in Blood",
                  "system": "http://loinc.org"
                }
              ]
            },
            "effectivePeriod": {
              "start": "2021-12-01T05:30:10+01:00"
            },
            "id": "68583624-9921-4158-8754-2a306c689abd",
            "issued": "2021-12-01T13:30:10+01:00",
            "meta": {
              "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
              "versionId": "VERSION_ID"
            },
            "resourceType": "Observation",
            "status": "final",
            "subject": {
              "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
            },
            "valueQuantity": {
              "code": "mmol/L",
              "system": "http://unitsofmeasure.org",
              "unit": "mmol/l",
              "value": 6.3
            }
          },
          "search": {
            "mode": "match"
          }
        },
        {
          "fullUrl": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa",
          "resource": {
            "code": {
              "coding": [
                {
                  "code": "718-7",
                  "display": "Hemoglobin [Mass/volume] in Blood",
                  "system": "http://loinc.org"
                }
              ]
            },
            "effectivePeriod": {
              "start": "2021-12-10T05:30:10+01:00"
            },
            "id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
            "issued": "2021-12-10T13:30:10+01:00",
            "meta": {
              "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
              "source": "http://example.com/HappyHospital",
              "versionId": "VERSION_ID"
            },
            "resourceType": "Observation",
            "status": "final",
            "subject": {
              "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
            },
            "valueQuantity": {
              "code": "g/dL",
              "system": "http://unitsofmeasure.org",
              "unit": "g/dl",
              "value": 7.2
            }
          },
          "search": {
            "mode": "match"
          }
        }
      ],
      "link": [
        {
          "relation": "search",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy"
        }
      ],
      "resourceType": "Bundle",
      "total": 2,
      "type": "searchset"
    }
    
  7. Jeffrey Brown (identificado por Practitioner/12942879-f89f-41ae-aa80-0b911b649833) busca observaciones con status=final para dos propósitos: investigación y tratamiento
  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"
    

    Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

    {
      "issue": [
        {
          "code": "security",
          "details": {
            "text": "permission_denied"
          },
          "diagnostics": "the maximum number of allowed consent purpose scopes is 1, got 2",
          "severity": "error"
        }
      ],
      "resourceType": "OperationOutcome"
    }
    

    En este caso, el practicante Jeffrey Brown debe eliminar un del "Alcance X-Consentimiento" de la solicitud.

  9. El administrador de TI de un hospital usa bypass para buscar todos Médicos del 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?"
    

    Debido a que se proporcionó bypass, se omitieron las verificaciones de consentimiento. Tú deberían recibir una respuesta JSON similar a la siguiente:

    {
      "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"
    }
    

La API de Cloud Healthcare permite obtener recursos FHIR de un Almacén de FHIR con actor, purpose y environment como parámetros de consulta. La respuesta contiene solo los recursos que están en consentimiento.

  1. Jeffrey Brown (identificado por Practitioner/12942879-f89f-41ae-aa80-0b911b649833) con la aplicación App/123 lee la medición de hemoglobina del paciente (en este ejemplo, 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"
    

    Debido a que se le otorgó el consentimiento al solicitante, la respuesta es el contenido del recurso de observación.

    {
      "code": {
        "coding": [
          {
            "code": "718-7",
            "display": "Hemoglobin [Mass/volume] in Blood",
            "system": "http://loinc.org"
          }
        ]
      },
      "effectivePeriod": {
        "start": "2021-12-10T05:30:10+01:00"
      },
      "id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
      "issued": "2021-12-10T13:30:10+01:00",
      "meta": {
        "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
        "source": "http://example.com/HappyHospital",
        "versionId": "VERSION_ID"
      },
      "resourceType": "Observation",
      "status": "final",
      "subject": {
        "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
      },
      "valueQuantity": {
        "code": "g/dL",
        "system": "http://unitsofmeasure.org",
        "unit": "g/dl",
        "value": 7.2
      }
    }
    
  3. Jeffrey Brown (identificado por Practitioner/12942879-f89f-41ae-aa80-0b911b649833) utilizando una aplicación desconocida App/unknown lee la medición de hemoglobina del paciente (en este ejemplo, 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"
    

    Debido a que el límite de acceso del solicitante (“App/desconocido”) no es permitido por el consentimiento del Paciente, se rechaza la solicitud.

    {
      "issue": [
        {
          "code": "security",
          "details": {
            "text": "permission_denied"
          },
          "diagnostics": "Consent access denied or the resource being accessed does not exist",
          "severity": "error"
        }
      ],
      "resourceType": "OperationOutcome"
    }
    
  5. Jeffrey Brown (identificado por Practitioner/12942879-f89f-41ae-aa80-0b911b649833) haciendo una investigación biomédica con la aplicación App/golden lee la fecha de nacimiento de Darcy (en este ejemplo, 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"
    

    Debido a que el solicitante obtuvo su consentimiento, la respuesta es el contenido de la Recurso de paciente.

    {
      "active": true,
      "birthDate": "1990-01-01",
      "gender": "female",
      "id": "3c6aa096-c054-4c22-b2b4-1e4a4d203de2",
      "meta": {
        "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
        "versionId": "VERSION_ID",
        "tag": [{
          "system": "http://terminology.hl7.org/CodeSystem/common-tags",
          "code": "employee"
        }]
      },
      "name": [
        {
          "family": "Smith",
          "given": [
            "Darcy"
          ],
          "use": "official"
        }
      ],
      "resourceType": "Patient"
    }
    
  7. Jeffrey Brown (identificado por Practitioner/12942879-f89f-41ae-aa80-0b911b649833) solicita acceso no autorizado en caso de emergencia a un registro de paciente mediante la función de emergencia protocolo. (en este ejemplo, 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 el método de autorización del consentimiento es btg, el servidor omite el consentimiento. y verificaciones de control. La respuesta es el contenido del recurso de observación.

    {
      "code": {
        "coding": [
          {
            "code": "718-7",
            "display": "Hemoglobin [Mass/volume] in Blood",
            "system": "http://loinc.org"
          }
        ]
      },
      "effectivePeriod": {
        "start": "2021-12-10T05:30:10+01:00"
      },
      "id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
      "issued": "2021-12-10T13:30:10+01:00",
      "meta": {
        "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
        "source": "http://example.com/HappyHospital",
        "versionId": "VERSION_ID"
      },
      "resourceType": "Observation",
      "status": "final",
      "subject": {
        "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
      },
      "valueQuantity": {
        "code": "g/dL",
        "system": "http://unitsofmeasure.org",
        "unit": "g/dl",
        "value": 7.2
      }
    }
    

En las siguientes secciones, se describen los métodos de aplicación de consentimiento compatibles en la API de Cloud Healthcare y cómo se aplica el acceso a los recursos cuando se realiza una solicitud de consentimiento adaptada.

Cuando se realiza una solicitud, tu servidor de autorización es responsable de generar tokens de acceso con el permiso de consentimiento relevante.

Configura el encabezado HTTP

Los permisos de consentimiento se pasan a la API de Cloud Healthcare mediante el encabezado HTTP X-Consent-Scope. La API de Cloud Healthcare usa este encabezado para aplicar el control de acceso basado en el consentimiento de los datos en almacenes de FHIR.

Una solicitud de FHIR puede admitir una cantidad limitada de permisos de entrada de consentimiento. Se pueden incluir hasta tres entradas de actor, una de purp y una de env en una solicitud de FHIR determinada.

Para permisos especiales, una solicitud FHIR puede admitir una de btg, o bypass

Establece encabezados HTTP para aplicaciones de confianza

Esta sección solo es necesaria si utilizas un servidor de autorización controlado por el cliente. En esta instancia, también debes usar un proxy SMARTproxy o una opción similar.

Algunas aplicaciones de confianza pueden realizar llamadas directamente a la API de Cloud Healthcare con los permisos de consentimiento en el encabezado HTTP especificado. Esto permite la aplicación directa del consentimiento sin la necesidad de que SMARTproxy o algún otro proxy realicen conversiones entre los servidores de autorización externos y Google Cloud.

Por ejemplo, la aplicación se puede registrar para un subconjunto de permisos, como un permiso de aplicación environment, o la aplicación podría presentar un widget de selección para establecer algunas entradas del permiso, como el purpose de la persona que accede.

Un usuario o una aplicación confiables también podrían usar las entradas de permiso btg o bypass, que están sujetas a revisiones posteriores a la auditoría.

La API de Cloud Healthcare proporciona una compatibilidad integrada para la aplicación del consentimiento de FHIR según los permisos de consentimiento de entrada. Los administradores de los almacenes de FHIR son responsables de crear y configurar un servidor de autorización fuera de la API de Cloud Healthcare que otorga permisos de consentimiento.

Token de acceso de muestra

En el siguiente ejemplo, se muestra un token de acceso codificado en Base64:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpc3MiOiJjb25zZW50LnRva2VuLm9yZyIsImlhdCI6MTYxMjg4NDA4NSwiZXhwIjoxNjQ0NDIwMDg1LCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJkb2N0b3IuZ2FicmllbGFAZXhhbXBsZS5jb20iLCJzY29wZSI6Im9pZGMgYWN0b3IvUHJhY3RpdGlvbmVyLzEyMyBhY3Rvci9Hcm91cC85OTkgcHVycC92My9UUkVBVCBlbnYvQXBwL2FiYyJ9.fC7ljkVUUx8fwUOrJuONcrqA-WKC-k_Bclzlgds0Cq6H_gEe3nUjPlSOCTQsIdYB

Después de decodificar el token de acceso, puedes ver que contiene la siguiente carga útil:

{
  "iss": "consent.token.org",
  "iat": 1612884085,
  "exp": 1644420085,
  "aud": "www.example.com",
  "sub": "doctor.gabriela@example.com",
  "scope": "oidc actor/Practitioner/123 actor/Group/999 purp/v3/TREAT env/App/abc"
}

Configura SMARTProxy

SMARTProxy es un proxy de código abierto de Google que tiene las siguientes características:

  • Permite que el servidor FHIR de la API de Cloud Healthcare acepte y valide los tokens de acceso adaptados al consentimiento.

  • Permite que la implementación de FHIR en la API de Cloud Healthcare incluya tokens de acceso adaptado al consentimiento como parte de las APIs de administración y de permisos de estado.

  • También admite características de token para la compatibilidad de SMART en FHIR.

Cuando realizas una solicitud para recuperar datos de la API de Cloud Healthcare a través de SMARTProxy, ocurre lo siguiente:

  1. SMARTProxy acepta una solicitud de un cliente que contiene un token adaptado al consentimiento.

  2. SMARTProxy valida el token adaptado al consentimiento mediante un servidor de autorización JWT que te pertenece.

  3. SMARTProxy lee los permisos del token adaptado al consentimiento y los pasa a la API de Cloud Healthcare a través del encabezado HTTP.

  4. La API de Cloud Healthcare recibe los encabezados y los valida para aplicar las directivas de consentimiento en la solicitud. Luego, la API de Cloud Healthcare le muestra al cliente una respuesta a través del SMARTProxy del cliente.

Configura una cuenta de servicio de Google Cloud

Un proxy solo puede tener una sola cuenta de servicio de Google Cloud. Si varios clientes usan el mismo proxy, los clientes usarán la misma cuenta de servicio. Ten cuidado cuando compartas una cuenta de servicio con varios clientes por los siguientes motivos:

Por ejemplo, si llamas a la API de Cloud Healthcare directamente con tu Cuenta de Google para la autenticación, entonces, los Registros de auditoría de Cloud registran tu dirección de correo electrónico como la principal. Cuando usas un proxy para llamar a la API de Cloud Healthcare, el proxy usa su propia cuenta de servicio, y la dirección de correo electrónico principal es la de la cuenta de servicio y la cuenta original no está definida.

Registros de auditoría

Los registros de auditoría se generan cuando hay una solicitud de acceso o cuando de la aplicación de políticas de acceso.

Accede a los registros de auditoría

Si los registros de auditoría están habilitados en el almacén de FHIR, se incluye un campo de metadatos consentMode en los registros de auditoría disponibles en Cloud Logging. consentMode puede tener uno de los siguientes valores:

  • off: La configuración del almacén de FHIR tiene consentConfig.accessEnforced configurado como false y no permite solicitudes de consentimiento.

  • emptyScope: El almacén de FHIR tiene consentConfig.accessEnforced configurado como true, pero no se incluyó un encabezado de alcance de consentimiento. Como resultado, no se aplicaron los consentimientos.

  • enforced: El almacén de FHIR tiene consentConfig.accessEnforced configurado como true y el encabezado del permiso de consentimiento estaba presente. Como resultado, los consentimientos evaluarse y aplicarse a la solicitud.

  • btg: Se proporcionó btg a la solicitud de FHIR en el encabezado del permiso de consentimiento. Como resultado, se omitieron las verificaciones de consentimiento. Esta solicitud se diseñó para ante emergencias y sujeto únicamente a la revisión posterior a la auditoría.

  • bypass: Solo se proporcionó bypass en el permiso de consentimiento a la solicitud de FHIR. encabezado. Como resultado, se omitieron las verificaciones de consentimiento. El propósito de esta solicitud que debe usarse en un flujo de trabajo de confianza (como un administrador o un en lugar de usuarios finales) de manera que este registro de auditoría sea diferente del el btg, que se usa para las verificaciones de administración de datos.

También puedes establecer access_determination_log_config en VERBOSE para registrar más información sobre por qué se otorga o rechaza una solicitud.

Registros de auditoría de cambios de la aplicación de acceso

Cuando cambia el recurso básico del compartimento (por ejemplo, quitar la dirección IP de un paciente Etiqueta employee): Es el control de acceso en el recurso modificado y su compartimento. puede cambiar debido a la Política en cascada del administrador. Esto activará la reindexación en todos los recursos de su compartimento. El progreso de reindexación de cada base de compartimento se puede hacer un seguimiento de la actualización de recursos en Cloud Logging con el filtro jsonPayload.@type="type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry".

Ejemplo de registro de progreso de reindexación en cascada

{
  "insertId": "tz2gtza8",
  "jsonPayload": {
    "@type": "type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry",
    "state": "STATE_FINISHED",
    "affectedResources": "2",
    "lastUpdated": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ",
    "compartmentBaseResourceName": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/PATIENT_RESOURCE_ID/_history/PATIENT_RESOURCE_VERSION"
  },
  "resource": {
    "type": "healthcare_fhir_store",
    "labels": {
      "location": "LOCATION",
      "dataset_id": "DATASET_ID",
      "fhir_store_id": "FHIR_STORE_ID",
      "project_id": "PROJECT_ID"
    }
  },
  "timestamp": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ",
  "severity": "INFO",
  "logName": "projects/PROJECT_ID/logs/healthcare.googleapis.com%2Fconsent_cascading_fhir",
  "receiveTimestamp": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ"
}

jsonPayload.state es el estado de la operación de reindexación, jsonPayload.affectedResources es la cantidad de recursos del compartimento reindexados y jsonPayload.lastUpdated es la marca de tiempo de la actualización de recursos para pacientes. Si la operación acaba de comenzar, jsonPayload.state="STATE_STARTED" y jsonPayload.affectedResources no estarán presentes.

Restricciones y limitaciones

En esta sección, se muestran las restricciones y los límites de FHIR R4, pero se aplican a la FTU3 de FHIR.

Tipo Restricciones y límites
Recurso de consentimiento único
  • Solo se admite un único Consent.provision; no se admiten varios aprovisionamientos o aprovisionamientos anidados.
  • Al menos 1 Consent.provision.actor, como máximo 25:
    • Consent.provision.actor.role debe ser http://terminology.hl7.org/CodeSystem/v3-RoleCode
    • Consent.provision.actor.code debe ser GRANTEE o HPOWATT.
  • Como máximo 1 Consent.provision.purpose:
    • Consent.provision.purpose.system debe ser http://terminology.hl7.org/CodeSystem/v3-ActReason
    • Consent.provision.purpose.code no está vacío y tiene un máximo de 13 caracteres.
  • 1 elemento environment como máximo:
    • Consent.provision.extension.url debe ser https://g.co/fhir/medicalrecords/Environment
    • La longitud combinada entre el sistema y el código debe ser inferior a 15 caracteres.
  • Si filtras por tipo de recurso, Consent.provision.class.system debe ser http://hl7.org/fhir/resource-types.
  • Si filtras por fuente de datos, Consent.provision.extension.url debe ser https://g.co/fhir/medicalrecords/DataSource.
  • Si filtras por etiqueta de datos, Consent.provision.extension.url debe ser https://g.co/fhir/medicalrecords/DataTag.
    • La etiqueta de datos puede ser una extensión compleja, anidada hasta un nivel, para describir una política que coincida con los recursos con todas las etiquetas especificadas (interpretada de forma conjunta).
    • Se admiten como máximo 5 etiquetas anidadas.
  • 100 valores como máximo para todos los atributos repetidos, a menos que se describan de forma diferente en esta fila.
Modelo de aplicación
  • Cada paciente puede tener hasta 200 recursos de consentimiento active aplicados a la vez.
  • Cada tienda puede tener hasta 200 políticas de administrador de active aplicadas a la vez.
  • Un formato compacto especial para el conjunto de todas las Directivas de consentimiento en todos los consentimientos activos de un paciente determinado no debe exceder un umbral de tamaño establecido. Por lo general, hay capacidad suficiente para codificar miles de directivas de consentimiento, a menos que las strings de recursos muy largas estén sobrecargadas. Por ejemplo:
    • Cientos de consentimientos en fuentes de datos y etiquetas de datos únicas, cada una de las cuales consume mucho espacio.
    • Un solo paciente con 3,000 entradas de identificadores de recursos Consent.provision.data.reference únicos en muchos consentimientos activos, cada uno que especifique un Consent.provision.actor único, utiliza el espacio de manera más enérgica que las disposiciones que no especifican ninguna restricción de referencia de datos o contienen muchas de las mismas cadenas de referencia del actor.
  • Cada recurso puede tener hasta 1,000 directivas de consentimiento de todos los Consentimientos que se apliquen a él.
X-Consent-Scope
  • Mínimo una y máximo tres entradas actor.
  • Máximo una entrada purp:
    • Cada entrada purp debe tener el formato system/code (v3 es el sistema registrado para http://terminology.hl7.org/CodeSystem/v3-ActReason).
    • La longitud del código debe ser menor que 13.
  • Máximo una entrada env:
    • Cada entrada env debe tener el formato system/code.
    • La longitud combinada del sistema y el código debe ser inferior a 15.
  • btg requiere al menos una entrada de actor.
  • bypass requiere al menos una entrada de actor y una de env.
Métodos admitidos
Rendimiento
  • ApplyConsents y ApplyAdminConsents escalan de manera similar o mejor que ImportResources.
  • Información sobre las solicitudes que tienen en cuenta el consentimiento:
    • Nuestro modelo de consentimiento se optimizó para la aplicación del rendimiento de las operaciones CRUD, incluida la búsqueda a gran escala en muchos recursos y muchos pacientes.
    • Una lectura de recursos individuales puede tener un impacto marginal en la latencia de la solicitud. Sin embargo, el rendimiento de la búsqueda varía según la consulta base y la cantidad de permisos de consentimiento que generan más criterios de acceso activos durante una búsqueda.
    • Recomendamos ejecutar tus propias pruebas de rendimiento en una variedad de parámetros de solicitud de FHIR representativos a fin de determinar las características de rendimiento para tus casos prácticos en función de las características de tus datos, como la cantidad de recursos de un tipo de recurso de búsqueda determinado en el almacén de FHIR.
    • Nuestra solución mantiene la transferencia y las actualizaciones de todos los recursos, incluidos los de consentimiento y básicos que permite que la capacidad de procesamiento durante la transferencia y otras formas de tráfico de escritura continúe con un impacto mínimo.

Prácticas recomendadas

En las siguientes secciones, se describen las prácticas recomendadas para usar el control de acceso de FHIR.

Prácticas recomendadas generales

  • Lo que no debes hacer importar Recursos FHIR y llamar a ApplyConsents o ApplyAdminConsents en paralelo. Te recomendamos que primero importes los recursos de FHIR y, luego, ApplyConsents o ApplyAdminConsents. Sin embargo, si los recursos que se importados no incluyen ningún recurso de paciente ni de consentimiento, el modelo de aplicación de las políticas no se verá afectado y tratamiento de consentimientos o políticas de administración no es necesario.

  • Lo que no debes hacer crear búsquedas personalizadas y llama a ApplyConsents en paralelo. Te recomendamos realizarlos una tras otra.

  • Si tus flujos de trabajo requieren llamar a varios ApplyConsents en modo inconexo PatientScope, se pueden llamar en paralelo.

  • ApplyAdminConsents se puede ejecutar en paralelo con cualquier cantidad de ApplyConsents. pero no con otro ApplyAdminConsents.

  • Cuando configures el proxy, restringe la cuenta de servicio de IAM con permisos de solo lectura para evitar escribir los datos de un paciente en los registros de otro.

  • No uses el proxy de consentimiento cuando crees o actualices registros.

  • Valida todas las solicitudes de escritura para evitar modificaciones inesperadas de los datos de los pacientes.

  • Cuando se aplican consentimientos en cascada, los recursos básicos del compartimento deben importado y, luego, los recursos restantes del compartimento. Como alternativa, todas Los recursos de compartimentos pueden unirse en un solo paquete y transferirse. con fhir.executeBundle.

Borra recursos Patient

Cuando borras un recurso Patient, si también deseas quitar la aplicación del consentimiento para ese paciente (en especial cuando FhirStore.disableReferentialIntegrity es verdadero), te recomendamos que sigas este orden de las operaciones:

  1. Borra todos los recursos de consentimiento que pertenecen al recurso Patient.

  2. Llama a ApplyConsents con el filtro PatientScope.

A fin de configurar un almacén existente para el acceso de consentimiento, sigue estos pasos:

  1. Usa UpdateFhirStore para configurar lo siguiente:ConsentConfig con la aplicación de consentimientoversion como V1 y establece accessEnforced a true.

    curl -X PATCH \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "Content-Type: application/json" \
        --data "{
          'consentConfig': {
            'version': 'V1',
            'accessEnforced': true
          }
        }" "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?update_mask=consentConfig"
    
  2. Procesa consentimientos de pacientes o políticas de administración

    1. ApplyConsents para los consentimientos de los pacientes
    curl -X POST \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "Content-Type: application/json" \
        --data "{'validateOnly': false}" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"
    
    1. ApplyAdminConsents para las políticas del administrador y las políticas en cascada del administrador.
    curl -X POST \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "Content-Type: application/json" \
        --data "{
          'newConsentsList': {
              'names': [
              'projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/RESOURCE_ID_1/_history/VERSION_ID_1',
              ...
              'projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/RESOURCE_ID_N/_history/VERSION_ID_N'
              ]
          },
          'validateOnly': false
        }" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyAdminConsents"
    

Frecuencia con la que se deben ejecutar ApplyConsents o ApplyAdminConsents

  • Cuando el campo ConsentConfig no está configurado: el campo ConsentConfig no se configura cuando se crea por primera vez un almacén de FHIR y cuando el campo ConsentConfig se borra. Una vez que el campo ConsentConfig no esté configurado, debes repetir la configuración del almacén para el acceso de consentimiento antes de realizar solicitudes adaptadas al consentimiento a fin de para evitar la evaluación de políticas de aplicación de consentimiento desactualizadas.

  • Cuando el modelo de aplicación cambia: cuando se crea, actualiza o borra un recurso de consentimiento, el modelo de aplicación cambia. En esos casos, debes llamar a ApplyConsents o ApplyAdminConsents para que se apliquen estos cambios.

    • Si puedes realizar un seguimiento de Patients con cambios de consentimiento, te recomendamos que uses el filtro PatientScope para evitar volver a procesar todo el almacén. Este filtro es útil para actualizar de inmediato la aplicación de un conjunto pequeño de pacientes.

    • También puedes ejecutar ApplyConsents de forma periódica mediante el filtro TimeRange. Este filtro es útil cuando la actualización inmediata no es crítica. Por ejemplo, la siguiente solicitud actualiza la aplicación forzosa para los cambios de consentimiento entre las 0 a.m. del 20 de septiembre de 2022 y las 0 a.m. del 21 de septiembre de 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"
      

¿Qué sigue?