Controllare l'accesso alle risorse FHIR nell'API Cloud Healthcare

Questa pagina descrive come utilizzare le risorse per il consenso FHIR per determinare l'accesso ai dati degli archivi FHIR nell'API Cloud Healthcare.

Per configurare un archivio FHIR con l'applicazione del consenso, completa i seguenti passaggi:

  1. Crea un archivio FHIR se non ne hai già uno.

  2. Imposta i seguenti parametri ConsentConfig del datastore FHIR per attivare l'applicazione del consenso:

    • version: specifica la versione dell'applicazione del consenso in uso per il datastore FHIR. Questo valore può essere impostato una sola volta tramite CreateFhirStore o UpdateFhirStore. Una volta impostata, devi chiamare ApplyConsents o ApplyAdminConsents per modificare la versione.

    • access_enforced: se impostato su true, quando si accede alle risorse FHIR, le intestazioni di consenso fornite verranno verificate in base alle direttive di consenso fornite dai consumatori.

    • consent_header_handling: se impostato su PERMIT_EMPTY_SCOPE (valore predefinito), il server consente richieste senza intestazione X-Consent-Scope (o vuota). Se impostato su REQUIRED_ON_READ e access_enforced = true, il server rifiuta tutte le richieste senza intestazione X-Consent-Scope (o vuota).

Configura un nuovo datastore FHIR con ConsentConfig

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

Dovresti ricevere una risposta JSON simile alla seguente:

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

Se hai già un negozio, utilizza UpdateFhirStore per impostare ConsentConfig con l'applicazione del consenso version come V1 e imposta accessEnforced su true.

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

I criteri sono rappresentati tramite la risorsa Consenso. Lo scopo e l'utilizzo dei campi delle risorse sono descritti nella documentazione del modello di dati.

Ecco un esempio di tutte le risorse che possono essere create per questo esempio specifico.

Creare risorse FHIR

L'esempio seguente mostra come eseguire un [bundle FHIR](/healthcare-api/docs/how-tos/fhir-bundles) per compilare le seguenti risorse:

  • Una risorsa professionista con il nome Jeffrey Brown
  • Una risorsa Patient con nome Darcy Smith
  • Una risorsa di osservazione che mostra la misurazione dell'emoglobina di Darcy (LOINC718-7) raccolta dall'ospedale Happy
  • Una risorsa di osservazione che mostra la misurazione del glucosio di Darcy (LOINC15074-8).
  • Un consenso di Darcy a consentire a Jeffrey Brown di utilizzare l'applicazione App/123 per accedere ai suoi dati raccolti dall'Happy Hospital
  • Un consenso di Darcy a consentire a Jeffrey Brown di accedere a qualsiasi suo dato per cure di emergenza (ETREAT)
  • Un consenso dell'ospedale Happy per consentire a Jeffrey Brown di accedere a tutti i dati durante la ricerca biomedica (BIORCH) con l'applicazione 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"

Dovresti ricevere una risposta JSON simile alla seguente:

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

Di seguito sono riportati altri esempi di risorsa per il consenso R4 che dimostrano come possono essere rappresentate norme complesse.

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

L'esempio precedente rappresenta una risorsa Consenso del paziente in cui un paziente f001 concede l'autorizzazione a un professionista f002 con lo scopo di fornire una cura regolare rappresentata da TREAT. Il professionista proviene dalla geolocalizzazione iso3166-1/CA. Questa risorsa Consenso consente al professionista di accedere ai dati del paziente se questi soddisfano tutte le seguenti condizioni.

  • Si tratta di un tipo Encounter con ID Encounter/e001.
  • Proviene dalla fonte http://somesystem.example.org/foo.
  • Soddisfa almeno una delle seguenti condizioni sul tag (le risorse possono essere taggate impostando i campi system e code di Meta.tag):
    • Contiene il tag (system = http://terminology.hl7.org/CodeSystem/common-tags e code = actionable)
    • Contiene entrambi i tag (system = http://example.com/custom-tags e code = archived) e (system = http://example.com/custom-tags e code = insensitive)
  • Deve avere almeno una delle seguenti etichette di sicurezza
    • system = http://terminology.hl7.org/CodeSystem/v3-Confidentiality e code è una delle seguenti: R, N, M, L, U.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCode e code = PSY.

Direttiva di criteri amministrativi di esempio

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

L'esempio precedente mostra una risorsa di consenso del criterio di amministrazione che concede l'autorizzazione a un professionista f002 allo scopo di fornire cure regolari rappresentate da TREAT. Il professionista proviene dalla geolocalizzazione iso3166-1/CA. Questa risorsa Consenso consente al professionista sanitario di accedere ai dati del paziente se i dati soddisfano tutte le seguenti condizioni:

  • Si tratta di un tipo Encounter con ID Encounter/e001.
  • Proviene dalla fonte http://somesystem.example.org/foo.
  • Soddisfa almeno una delle seguenti condizioni sul tag:
    • Contiene il tag (system = http://terminology.hl7.org/CodeSystem/common-tags e code = actionable)
    • Contiene entrambi i tag (system = http://example.com/custom-tags e code = archived) e (system = http://example.com/custom-tags e code = insensitive)
  • Deve avere almeno una delle seguenti etichette di sicurezza
    • system = http://terminology.hl7.org/CodeSystem/v3-Confidentiality e code è una delle seguenti: R, N, M, L, U.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCode e code = PSY.

Esempio di direttiva del criterio di applicazione gerarchica dell'amministratore

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

L'esempio precedente rappresenta una risorsa di consenso per i criteri a cascata dell'amministratore che concede l'autorizzazione a un professionista f002 allo scopo di fornire un trattamento regolare rappresentato da TREAT. Il professionista proviene dalla geolocalizzazione iso3166-1/CA. Questa risorsa Consenso consente al professionista sanitario di accedere ai dati del comparto dei pazienti con il tag employee. Tutti i criteri delle risorse si applicano solo alle risorse di base del compartimento, ovvero alla risorsa Paziente, poiché controllano le risorse da cui applicare la struttura a cascata.

Applicare i consensi dei pazienti o i criteri di amministrazione

Applicare i consensi del paziente entro il giorno ApplyConsents

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

Dovresti ricevere una risposta JSON simile alla seguente:

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

La risposta contiene il nome di un'operazione. Per monitorare lo stato dell'operazione, puoi utilizzare il [metodo "get" dell'operazione](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get):

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

Al termine dell'operazione, il server restituisce una risposta con lo stato dell'operazione in formato JSON:

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

Questa risposta indica che il server ha elaborato correttamente 2 consensi e aggiornato l'accesso con consenso di 5 risorse (1 paziente, 2 consensi, 2 osservazioni).

Applica il criterio di amministrazione entro il giorno ApplyAdminConsents

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

Dovresti ricevere una risposta JSON simile alla seguente:

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

La risposta contiene il nome di un'operazione. Per monitorare lo stato dell'operazione, puoi utilizzare il [metodo "get" dell'operazione](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get):

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

Al termine dell'operazione, il server restituisce una risposta con lo stato dell'operazione in formato JSON:

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

Questa risposta indica che il server ha elaborato correttamente un criterio amministrativo e ha aggiornato l'accesso consensuale di 7 risorse (1 professionista, 1 paziente, 2 osservazioni, 2 consensi dei pazienti e 1 criterio amministrativo).

L'applicazione dei consensi memorizzati in un archivio FHIR non entrerà in vigore fino a quando ApplyConsents (per i consensi dei pazienti) o ApplyAdminConsents (per le norme di amministrazione e le norme di amministrazione gerarchiche) non viene chiamato e completato correttamente. Se aggiungi, modifichi o rimuovi i consensi dopo aver eseguito ApplyConsents o ApplyAdminConsents, devi eseguirlo di nuovo affinché i consensi vengano inclusi nel modello di applicazione.

Le risorse FHIR vengono indicizzate in modo asincrono, pertanto potrebbe esserci un leggero ritardo tra il completamento di ApplyConsents o ApplyAdminConsents e il momento in cui il modello di applicazione viene applicato nei risultati di ricerca. Questo ritardo è previsto solo per le richieste di ricerca.

Se è la prima volta che configuri l'applicazione del consenso nel repository FHIR, attendi il completamento dell'operazione ApplyConsents o ApplyAdminConsents a lungo termine prima di effettuare richieste che richiedono il consenso.

Per chiamare ApplyConsents su un sottoinsieme di pazienti, puoi utilizzare i seguenti filtri:

  • PatientScope: per eseguire ApplyConsents su un elenco di ID paziente con un massimo di 10.000 pazienti

  • TimeRange: per eseguire ApplyConsent su un elenco di ID risorsa paziente le cui risorse per il consenso vengono aggiornate durante un determinato intervallo di tempo

Per chiamare ApplyAdminConsents: devi fornire l'elenco completo di tutte le norme che vuoi applicare (non un elenco incrementale). Di conseguenza, un elenco vuoto annullerà l'applicazione di tutte le norme di amministrazione dello Store. Ogni criterio deve essere un nome di versione della risorsa se l'archivio FHIR gestisce le versioni e un nome della risorsa in caso contrario.

Puoi utilizzare operations.get per recuperare l'ProgressCounter dell'operazione. Al termine, è presente un ApplyConsentsResponse incluso nel Operation.response. I contatori in ProgressCounter e ApplyConsentsResponse o ApplyAdminConsentsResponse sono descritti nella tabella seguente.

ProgressCounter ApplyConsentsResponse o ApplyAdminConsentsResponse Descrizione
success consentApplySuccess Il numero di risorse per il consenso elaborate correttamente dall'operazione.
failure consentApplyFailure Il numero di risorse di consenso non supportate o non valide. Puoi visualizzare i log degli errori in Cloud Logging oppure, quando validateOnly è false, controllare lo stato dell'applicazione del consenso utilizzando CheckConsentEnforcementStatus o CheckPatientConsentEnforcementStatus per recuperare i dettagli dell'errore.
secondarySuccess affectedResources Quando validateOnly è false, rappresenta il numero di risorse FHIR sottoposte a nuova indicizzazione a causa dell'effetto della modifica del consenso.
secondaryFailure failedResources Quando validateOnly è false, indica il numero di risorse FHIR che potrebbero aver subito una modifica del consenso, ma per le quali non è stato possibile eseguire la nuova indicizzazione. Ciò potrebbe influire sulla ricerca con contesto del consenso, ma non su altri metodi. Per visualizzare i dettagli dell'errore, puoi visualizzare i log degli errori in Cloud Logging.

Quando le risorse di consenso FHIR vengono elaborate, puoi utilizzare le seguenti API per controllare lo stato dell'applicazione di un singolo consenso o di tutti i consensi di un paziente:

Per i criteri di amministrazione, CheckConsentEnforcementStatus può essere utilizzato solo per controllare lo stato di applicazione di un singolo criterio di amministrazione del consenso. In alternativa, puoi utilizzare fhirStores.get per visualizzare tutte le norme di amministrazione attive applicate al negozio.

consent-enforcement-status può avere uno dei seguenti valori:

  • OFF: rappresenta lo stato di applicazione predefinito di una nuova risorsa di consenso in cui la risorsa di consenso non è mai stata elaborate.

  • ENFORCEABLE: lo stato in cui la risorsa Consenso è stata elaborata correttamente.

  • INACTIVE: uno stato inattivo in cui la risorsa Consenso viene ignorata.

  • UNSUPPORTED: lo stato di una risorsa di consenso che potrebbe essere conforme alle specifiche FHIR, ma non è applicabile. Ciò è dovuto all'implementazione limitata dell'applicazione del consenso FHIR con l'attuale livello di supporto delle funzionalità.

  • ENFORCEMENT_LIMIT_EXCEEDED: lo stato in cui il formato della risorsa di consenso FHIR e il livello di supporto della risorsa sono privi di errori, tuttavia una o più delle seguenti condizioni sono vere:

    • Il paziente ha un ampio insieme di risorse per il consenso.

    • Le dimensioni delle direttive per il consenso in tutti i consensi attivi sono superiori alle dimensioni massime consentite per le direttive per il consenso affinché un server FHIR possa applicarle.

L'API Cloud Healthcare supporta le ricerche di risorse FHIR in un determinato archivio FHIR con actor, purpose e environment come parametri di ricerca. La risposta contiene solo le risorse per cui è stato dato il consenso.

  1. Il professionista Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) utilizzando un'applicazione attendibile App/123 esegue ricerche in tutte le osservazioni 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"

    Dovresti ricevere una risposta JSON simile alla seguente:

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

    Dovresti ricevere una risposta JSON simile alla seguente:

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

    La query precedente è una ricerca in catena. Poiché allo scenario di consenso actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123 viene negato l'accesso alla risorsa Paziente Darcy (identificata da Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2), il server FHIR non restituisce alcuna osservazione del paziente come se il paziente non esistesse.

  5. Il professionista Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) utilizzando l'applicazione App/123 esegue ricerche in tutte le osservazioni del paziente Darcy a fini di trattamento di emergenza.
  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"

    Dovresti ricevere una risposta JSON simile alla seguente:

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

    Dovresti ricevere una risposta JSON simile alla seguente:

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

    In questo caso, il professionista Jeffrey Brown deve rimuovere uno scopo non necessario da "X-Consent-Scope" nella richiesta.

  9. Un amministratore IT di un ospedale utilizza bypass per cercare tutti i professionisti dell'ospedale.
  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?"

    Poiché è stato fornito bypass, i controlli del consenso sono stati ignorati. Dovresti ricevere una risposta JSON simile alla seguente:

    {
      "entry": [
        {
          "fullUrl": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/12942879-f89f-41ae-aa80-0b911b649833",
          "resource": {
            "active": true,
            "birthDate": "1970-05-23",
            "gender": "male",
            "id": "12942879-f89f-41ae-aa80-0b911b649833",
            "meta": {
              "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
              "versionId": "VERSION_ID"
            },
            "name": [
              {
                "family": "Brown",
                "given": [
                  "Jeffrey"
                ],
                "use": "official"
              }
            ],
            "resourceType": "Practitioner"
          },
          "search": {
            "mode": "match"
          }
        }
      ],
      "link": [
        {
          "relation": "search",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
        }
      ],
      "resourceType": "Bundle",
      "total": 1,
      "type": "searchset"
    }
    

L'API Cloud Healthcare supporta l'ottenimento della risorsa FHIR in un determinato archivio FHIR con actor, purpose e environment come parametri di ricerca. La risposta contiene solo le risorse per cui è stato dato il consenso.

  1. Il professionista Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) utilizzando l'applicazione App/123 legge la misurazione dell'emoglobina del paziente (in questo esempio, 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"

    Poiché al richiedente è stato concesso il consenso, la risposta è costituita dai contenuti della risorsa Observation.

    {
      "code": {
        "coding": [
          {
            "code": "718-7",
            "display": "Hemoglobin [Mass/volume] in Blood",
            "system": "http://loinc.org"
          }
        ]
      },
      "effectivePeriod": {
        "start": "2021-12-10T05:30:10+01:00"
      },
      "id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
      "issued": "2021-12-10T13:30:10+01:00",
      "meta": {
        "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
        "source": "http://example.com/HappyHospital",
        "versionId": "VERSION_ID"
      },
      "resourceType": "Observation",
      "status": "final",
      "subject": {
        "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
      },
      "valueQuantity": {
        "code": "g/dL",
        "system": "http://unitsofmeasure.org",
        "unit": "g/dl",
        "value": 7.2
      }
    }
    
  3. Il professionista Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) utilizzando l'applicazione sconosciuta App/unknown legge la misurazione dell'emoglobina del paziente (in questo esempio, 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"

    Poiché l'accesso ai confini del richiedente ("App/sconosciuto") non è consentito dal consenso del paziente, la richiesta viene rifiutata.

    {
      "issue": [
        {
          "code": "security",
          "details": {
            "text": "permission_denied"
          },
          "diagnostics": "Consent access denied or the resource being accessed does not exist",
          "severity": "error"
        }
      ],
      "resourceType": "OperationOutcome"
    }
    
  5. Il professionista Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) che svolge ricerche biomediche utilizzando l'applicazione App/golden legge la data di nascita di Darcy (in questo esempio, 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"

    Poiché il richiedente ha dato il consenso, la risposta è costituita dai contenuti della risorsa Patient.

    {
      "active": true,
      "birthDate": "1990-01-01",
      "gender": "female",
      "id": "3c6aa096-c054-4c22-b2b4-1e4a4d203de2",
      "meta": {
        "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
        "versionId": "VERSION_ID",
        "tag": [{
          "system": "http://terminology.hl7.org/CodeSystem/common-tags",
          "code": "employee"
        }]
      },
      "name": [
        {
          "family": "Smith",
          "given": [
            "Darcy"
          ],
          "use": "official"
        }
      ],
      "resourceType": "Patient"
    }
    
  7. Il professionista Jeffrey Brown (identificato da Practitioner/12942879-f89f-41ae-aa80-0b911b649833) richiede l'accesso di emergenza non autorizzato al record di un paziente utilizzando il protocollo "break-the-glass". (in questo esempio, 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"

    Poiché il metodo di autorizzazione del consenso è btg, il server salta i controlli del consenso. La risposta è il contenuto della risorsa Observation.

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

Le sezioni seguenti descrivono i metodi di applicazione del consenso supportati nell'API Cloud Healthcare e in che modo viene applicato l'accesso alle risorse quando viene effettuata una richiesta che tiene conto del consenso.

Quando effettui una richiesta, il tuo server di autorizzazione è responsabile della generazione di token di accesso con l'ambito del consenso pertinente.

Impostare l'intestazione HTTP

Gli ambiti del consenso vengono passati all'API Cloud Healthcare utilizzando l'X-Consent-Scope intestazione HTTP. L'API Cloud Healthcare utilizza questo intestazione per applicare controllo dell'accesso basato sul consenso ai dati negli archivi FHIR.

Una richiesta FHIR può supportare un numero limitato di ambiti di voci di consenso. In una determinata richiesta FHIR è possibile includere fino a tre voci di actor, una di purp e una di env.

Per gli ambiti speciali, una richiesta FHIR può supportare uno dei valori btg o bypass.

Impostare le intestazioni HTTP per le applicazioni attendibili

Questa sezione è obbligatoria solo se utilizzi un server di autorizzazione controllato dal cliente. In questo caso, devi utilizzare anche un proxy SMARTproxy o un proxy simile.

Alcune applicazioni attendibili possono effettuare chiamate direttamente all'API Cloud Healthcare con gli ambiti del consenso nell'intestazione HTTP specificata. In questo modo, viene abilitata l'applicazione diretta del consenso senza la necessità di un proxy SMART o di un altro proxy per la conversione tra i server di autorizzazione esterni e Google Cloud.

Ad esempio, l'applicazione potrebbe essere registrata per un sottoinsieme di ambiti, ad esempio un ambito environment dell'applicazione, oppure l'applicazione potrebbe presentare un widget di selezione per impostare alcune voci di ambito, ad esempio purpose dell'accessore.

Un utente attendibile o un'applicazione attendibile potrebbe anche utilizzare le voci di ambito btg o bypass, che sono soggette a revisioni post-audit.

L'API Cloud Healthcare fornisce il supporto integrato per l'applicazione del consenso FHIR in base agli ambiti del consenso inseriti. Gli amministratori del repository FHIR sono responsabili della creazione e della configurazione di un server di autorizzazione esterno all'API Cloud Healthcare che concede gli ambiti del consenso.

Token di accesso di esempio

L'esempio seguente mostra un token di accesso codificato in base64:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpc3MiOiJjb25zZW50LnRva2VuLm9yZyIsImlhdCI6MTYxMjg4NDA4NSwiZXhwIjoxNjQ0NDIwMDg1LCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJkb2N0b3IuZ2FicmllbGFAZXhhbXBsZS5jb20iLCJzY29wZSI6Im9pZGMgYWN0b3IvUHJhY3RpdGlvbmVyLzEyMyBhY3Rvci9Hcm91cC85OTkgcHVycC92My9UUkVBVCBlbnYvQXBwL2FiYyJ9.fC7ljkVUUx8fwUOrJuONcrqA-WKC-k_Bclzlgds0Cq6H_gEe3nUjPlSOCTQsIdYB

Dopo aver decodificato il token di accesso, puoi vedere che contiene il seguente payload:

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

Configurare SMARTProxy

SMARTProxy è un proxy open source di Google che fornisce le seguenti funzionalità:

  • Consente al server FHIR dell'API Cloud Healthcare di accettare e convalidare i token di accesso che rispettano il consenso.

  • Consente all'implementazione di FHIR nell'API Cloud Healthcare di includere token di accesso attenti al consenso nell'ambito del modello di gestione e delle autorizzazioni dell'API Cloud Healthcare.

  • Supporta anche le funzionalità dei token per il supporto di SMART on FHIR.

Quando effettui una richiesta per recuperare i dati dall'API Cloud Healthcare tramite SMARTProxy, si verifica quanto segue:

  1. SMARTProxy accetta una richiesta da un client contenente un token che tiene conto del consenso.

  2. SMARTProxy convalida il token che tiene conto del consenso tramite un server di autorizzazione JWT di tua proprietà.

  3. SMARTProxy legge gli ambiti dal token che tiene conto del consenso e li passa all'API Cloud Healthcare tramite l'intestazione HTTP.

  4. L'API Cloud Healthcare riceve le intestazioni e le convalida per applicare le direttive sul consenso alla richiesta. L'API Cloud Healthcare poi restituisce una risposta tramite SMARTProxy al client.

Configurare un account di servizio Google Cloud

Un proxy può avere un solo account di servizio Google Cloud. Se più client utilizzano lo stesso proxy, utilizzeranno lo stesso account di servizio. Presta attenzione quando condividi un account di servizio con più client per i seguenti motivi:

Ad esempio, se chiami direttamente l'API Cloud Healthcare utilizzando il tuo Account Google per l'autenticazione, Cloud Audit Logs registrano il tuo indirizzo email come indirizzo email principale. Quando utilizzi un proxy per chiamare l'API Cloud Healthcare, il proxy utilizza il proprio account di servizio e l'indirizzo email principale è l'indirizzo email dell'account di servizio e l'account originale non è definito.

Audit log

Gli audit log vengono generati quando viene presentata una richiesta di accesso o quando cambia l'applicazione dell'accesso alle risorse.

Accedere ai log di controllo

Se gli audit log sono abilitati nel datastore FHIR, un campo dei metadati consentMode è incluso negli audit log disponibili in Cloud Logging. consentMode può avere uno dei seguenti valori:

  • off: la configurazione del datastore FHIR ha impostato consentConfig.accessEnforced su false e non consente richieste che richiedono il consenso.

  • emptyScope: il datastore FHIR ha consentConfig.accessEnforced impostato su true, ma non è stata inclusa un'intestazione dell'ambito del consenso. Di conseguenza, i consensi non sono stati applicati.

  • enforced: l'archivio FHIR ha consentConfig.accessEnforced impostato su true e l'intestazione dell'ambito del consenso era presente. Di conseguenza, i consensi sono stati valutati e applicati alla richiesta.

  • btg: nella richiesta FHIR è stato fornito btg nell'intestazione dell'ambito del consenso. Di conseguenza, i controlli del consenso sono stati ignorati. Questa richiesta è pensata per essere utilizzata per le emergenze ed è soggetta solo a revisione post-audit.

  • bypass: nella richiesta FHIR è stato fornito solo bypass nell'intestazione dell'ambito del consenso. Di conseguenza, i controlli del consenso sono stati ignorati. Questa richiesta è pensata per essere utilizzata da un flusso di lavoro attendibile (ad esempio un amministratore o un'applicazione attendibile anziché gli utenti finali), in modo che questo log di controllo sia diverso da btg, che viene utilizzato per i controlli di governance dei dati.

Se vuoi, puoi impostare access_determination_log_config su VERBOSE per registrare ulteriori informazioni sul motivo per cui una richiesta viene concessa o rifiutata.

Accedere ai log di controllo delle modifiche all'applicazione delle norme

Quando la risorsa di base del compartimento cambia (ad esempio, viene rimosso il tagemployee di un paziente): il controllo dell'accesso alla risorsa modificata e al relativo compartimento potrebbe cambiare a causa del criterio di applicazione gerarchica dell'amministratore. Verrà attivata la reindicizzazione su tutte le risorse del compartimento. Lo stato di avanzamento dell'indicizzazione per ogni aggiornamento della risorsa di base del compartimento può essere monitorato in Cloud Logging con il filtrojsonPayload.@type="type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry".

Esempio di log di avanzamento dell'indicizzazione ricorsiva

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

jsonPayload.state è lo stato dell'operazione di indicizzazione, jsonPayload.affectedResources è il numero di risorse del compartimento indicizzate di nuovo e jsonPayload.lastUpdated è il timestamp dell'aggiornamento della risorsa paziente. Se l'operazione è appena iniziata, jsonPayload.state="STATE_STARTED" e jsonPayload.affectedResources non saranno presenti.

Vincoli e limiti

Questa sezione mostra i vincoli e i limiti per FHIR R4, ma gli stessi vincoli e limiti si applicano a FHIR STU3.

Tipo Vincoli e limiti
Risorsa Single Consent
  • È supportato un solo Consent.provision, mentre le disposizioni multiple o nidificate non sono supportate.
  • Almeno 1 Consent.provision.actor, massimo 25:
    • Consent.provision.actor.role deve essere http://terminology.hl7.org/CodeSystem/v3-RoleCode.
    • Consent.provision.actor.code deve essere GRANTEE o HPOWATT.
  • Al massimo 1 Consent.provision.purpose:
    • Consent.provision.purpose.system deve essere http://terminology.hl7.org/CodeSystem/v3-ActReason.
    • Consent.provision.purpose.code non è vuoto e contiene al massimo 13 caratteri.
  • Al massimo 1 environment:
    • Consent.provision.extension.url deve essere https://g.co/fhir/medicalrecords/Environment.
    • La lunghezza del sistema e del codice combinati deve essere inferiore a 15 caratteri.
  • Se applichi un filtro in base al tipo di risorsa, Consent.provision.class.system deve essere http://hl7.org/fhir/resource-types.
  • Se applichi un filtro in base all'origine dati, Consent.provision.extension.url deve essere https://g.co/fhir/medicalrecords/DataSource.
  • Se filtri per tag dati, Consent.provision.extension.url deve essere https://g.co/fhir/medicalrecords/DataTag.
    • Il tag dati può essere un'estensione complessa, nidificata fino a un livello, per descrivere un criterio che associa le risorse a tutti i tag specificati (interpretati congiuntamente).
    • Sono supportati al massimo 5 tag nidificati.
  • Massimo 100 valori per tutti gli attributi ripetuti, a meno che non siano descritti in modo diverso in questa riga.
Modello di applicazione
  • Per ogni paziente possono essere applicate contemporaneamente fino a 200 risorse per il consenso active.
  • In ogni negozio possono essere applicate contemporaneamente fino a 200 norme di amministrazione active.
  • Un formato compatto speciale per l'insieme di tutte le direttive per il consenso in tutti i consensi attivi per un determinato paziente non deve superare una soglia di dimensioni impostata. In genere, la capacità è sufficiente per codificare migliaia di direttive per il consenso, a meno che le stringhe di risorse molto lunghe non siano particolarmente numerose. Ad esempio:
    • Centinaia di consensi per origini dati e tag dati univoci, ognuno dei quali è molto lungo, occupano molto spazio.
    • Un singolo paziente con 3000 voci di identificatori di risorse Consent.provision.data.reference univoci in molti Consensi attivi che specificano ciascuno un Consent.provision.actor univoco utilizza lo spazio in modo più aggressivo rispetto alle disposizioni che non specificano alcun vincolo di riferimento ai dati o che contengono molte delle stesse stringhe di riferimento all'attore.
  • Ogni risorsa può avere fino a 1000 direttive per il consenso da tutti i Consensi applicabili.
X-Consent-Scope
  • Minimo una e massimo tre voci actor.
  • Una sola voce purp:
    • Ogni voce purp deve essere nel formato system/code (v3 è il sistema registrato per http://terminology.hl7.org/CodeSystem/v3-ActReason).
    • La lunghezza del codice deve essere inferiore a 13.
  • Una sola voce env:
    • Ogni voce env deve avere il formato system/code.
    • La lunghezza del sistema e del codice combinati deve essere inferiore a 15.
  • btg richiede almeno una voce actor.
  • bypass richiede almeno una voce actor e una voce env.
Metodi supportati
Prestazioni
  • ApplyConsents e ApplyAdminConsents hanno una scalabilità simile o migliore rispetto a ImportResources.
  • Informazioni sulle richieste che richiedono il consenso:
    • Il nostro modello di consenso è stato ottimizzato per il rendimento dell'applicazione delle operazioni CRUD, inclusa la ricerca su larga scala in molte risorse e molti pazienti.
    • La lettura delle singole risorse potrebbe avere un impatto marginale sulla latenza della richiesta, ma il rendimento della ricerca varia in base alla query di base e al numero di ambiti del consenso che determinano un maggior numero di criteri di accesso attivi durante una ricerca.
    • Ti consigliamo di eseguire i tuoi test di prestazioni su una serie di parametri di richiesta FHIR rappresentativi per determinare le caratteristiche di rendimento per i tuoi casi d'uso in base alle caratteristiche dei tuoi dati, ad esempio il numero di risorse di un determinato tipo di risorsa di ricerca nell'archivio FHIR.
    • La nostra soluzione mantiene l'importazione e gli aggiornamenti di tutte le risorse, incluse le risorse per il consenso, in modo leggero, in modo che il throughput durante l'importazione e altre forme di traffico di scrittura possa procedere con un impatto minimo.

Best practice

Le seguenti sezioni descrivono le best practice per l'utilizzo del controllo dell'accesso FHIR.

Best practice generali

  • Non import le risorse FHIR e chiamare ApplyConsents o ApplyAdminConsents in parallelo. Ti consigliamo di importare prima le risorse FHIR e poi di chiamare ApplyConsents o ApplyAdminConsents. Tuttavia, se le risorse da importare non includono risorse relative a pazienti o consenso, il modello di applicazione non sarà interessato e non sarà necessario elaborare i consensi o i criteri di amministrazione.

  • Non creare ricerche personalizzate e chiamare ApplyConsents in parallelo. Ti consigliamo di eseguirli uno dopo l'altro.

  • Se i tuoi flussi di lavoro richiedono di chiamare più ApplyConsents su PatientScope disgiunti, possono essere chiamati in parallelo.

  • ApplyAdminConsents può essere eseguito in parallelo con un numero qualsiasi di ApplyConsents, ma non con un altro ApplyAdminConsents.

  • Quando configuri il proxy, limita l'account di servizio IAM con autorizzazioni di sola lettura per evitare di scrivere i dati di un paziente nei record di un altro paziente.

  • Non utilizzare il proxy per il consenso durante la creazione o l'aggiornamento dei record.

  • Convalida tutte le richieste di scrittura per evitare modifiche impreviste dei dati tra più pazienti.

  • Quando vengono applicati i consensi a cascata, le risorse di base del compartimento devono essere importate prima, seguite dalle risorse rimanenti del compartimento. In alternativa, tutte le risorse del comparto possono essere raggruppate in un unico bundle e importate utilizzando fhir.executeBundle.

Eliminare la risorsa Patient

Quando elimini una risorsa Paziente, se vuoi anche rimuovere l'applicazione del consenso per quel paziente (in particolare quando FhirStore.disableReferentialIntegrity è true), ti consigliamo di seguire questo ordine di operazioni:

  1. Elimina tutte le risorse di consenso appartenenti alla risorsa Paziente.

  2. Chiama ApplyConsents con il filtro PatientScope.

Per configurare un negozio esistente per l'accesso al consenso:

  1. Utilizza UpdateFhirStore per impostare ConsentConfig con l'applicazione del consenso version su V1 e imposta accessEnforced su true.

    curl -X PATCH \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "Content-Type: application/json" \
        --data "{
          'consentConfig': {
            'version': 'V1',
            'accessEnforced': true
          }
        }" "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?update_mask=consentConfig"
  2. Elabora i consensi dei pazienti o le norme di amministrazione

    1. ApplyConsents per i consensi dei pazienti
    curl -X POST \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "Content-Type: application/json" \
        --data "{'validateOnly': false}" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"
    1. ApplyAdminConsents per i criteri amministrativi e i criteri amministrativi gerarchici.
    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"

La frequenza di esecuzione di ApplyConsents o ApplyAdminConsents

  • Quando il campo ConsentConfig non è impostato: il campo ConsentConfig non è impostato sia quando viene creato un archivio FHIR per la prima volta sia quando il campo ConsentConfig viene cancellato. Una volta deselezionato il campo ConsentConfig, devi ripetere la configurazione dello Store per l'accesso in base al consenso prima di effettuare richieste in base al consenso per evitare di valutare criteri di applicazione del consenso obsoleti.

  • Quando cambia il modello di applicazione: quando viene creata, aggiornata o eliminata una risorsa per il consenso, il modello di applicazione cambia. In questi casi, devi chiamare ApplyConsents o ApplyAdminConsents affinché le modifiche vengano applicate.

    • Se puoi tenere traccia delle modifiche relative ai pazienti con consenso, ti consigliamo di utilizzare il filtro PatientScope per evitare di rielaborare l'intero negozio. Questo filtro è utile per aggiornare immediatamente l'applicazione di un piccolo insieme di pazienti.

    • Puoi anche eseguire ApplyConsents periodicamente utilizzando il filtro TimeRange. Questo filtro è utile quando l'aggiornamento immediato non è fondamentale. Ad esempio, la seguente richiesta aggiorna l'applicazione delle modifiche al consenso tra le ore 00:00 UTC del 20/09/2022 e le ore 00:00 UTC del 21/09/2022.

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

Access Policy Viewer mostra i criteri di controllo dell'accesso. Fornisce una tabella contenente ambiti di consenso per rappresentare le regole di controllo dell'accesso FHIR.

Prima di poter utilizzare lo strumento di visualizzazione del consenso FHIR, assicurati di quanto segue:

Per visualizzare FHIR Consent Viewer, completa i seguenti passaggi:

Passaggi successivi