Zugriff auf FHIR-Ressourcen in der Cloud Healthcare API steuern

Auf dieser Seite wird beschrieben, wie Sie mithilfe von FHIR-Einwilligungsressourcen den Datenzugriff auf FHIR-Speicher in der Cloud Healthcare API bestimmen.

Führen Sie die folgenden Schritte aus, um einen FHIR-Speicher mit Einwilligungserzwingung zu konfigurieren:

  1. Erstellen Sie einen FHIR-Speicher, falls Sie noch keinen haben.

  2. Legen Sie die folgenden ConsentConfig-Parameter des FHIR-Speichers fest, um die Erzwingung der Einwilligung zu aktivieren:

    • version: Gibt an, welche Version der Einwilligungserzwingung für den FHIR-Speicher verwendet wird. Dieser Wert kann nur einmal von CreateFhirStore oder UpdateFhirStore festgelegt werden. Anschließend müssen Sie ApplyConsents oder ApplyAdminConsents aufrufen, um die Version zu ändern.

    • access_enforced: Wenn der Wert auf true gesetzt ist, werden die bereitgestellten Einwilligungsheader beim Zugriff auf FHIR-Ressourcen anhand der Einwilligungsanweisungen von Nutzern geprüft.

    • consent_header_handling: Wenn PERMIT_EMPTY_SCOPE (Standardeinstellung) festgelegt ist, lässt der Server Anfragen ohne (oder leeren) X-Consent-Scope-Header zu. Wenn REQUIRED_ON_READ und access_enforced = true festgelegt ist, lehnt der Server alle Anfragen ohne (oder leeren) X-Consent-Scope-Header ab.

Neuen FHIR-Speicher mit ConsentConfig einrichten

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"

Sie sollten in etwa folgende JSON-Antwort erhalten:

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

Wenn Sie bereits einen Speicher haben, verwenden Sie UpdateFhirStore, um ConsentConfig mit der version zur Einwilligungserzwingung auf V1 festzulegen und accessEnforced auf true zu setzen.

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"

Richtlinien werden in der Einwilligungsressource dargestellt. Zweck und Verwendung der Ressourcenfelder sind in den Dokumenten zu Datenmodellen beschrieben.

Hier sehen Sie ein Beispiel für alle Ressourcen, die für dieses Beispiel erstellt werden können.

FHIR-Ressourcen erstellen

Das folgende Beispiel zeigt, wie ein [FHIR-Bundle](/healthcare-api/docs/how-tos/fhir-bundles) ausgeführt wird, um die folgenden Ressourcen zu füllen:

  • Eine Fachkraft-ressource mit dem Namen Jeffrey Brown
  • Eine Patientenressource namens Darcy Smith
  • Beobachtungsressource, die die Hämoglobinmessung von Darcy (LOINC718-7) zeigt, die vom Happy Hospital erfasst wurde
  • Eine Beobachtungsressource zur Darstellung der Blutzuckermessung von Darcy (LOINC15074-8).
  • Einwilligung von Darcy, um Jeffrey Brown über die Anwendung App/123 Zugriff auf ihre vom Happy Hospital erhobenen Daten zu gewähren
  • Einwilligung von Darcy, um Jeffrey Brown für die Notfallbehandlung Zugriff auf ihre Daten zu gewähren (ETREAT)
  • Einwilligung des Happy Hospital, um Jeffrey Brown zu erlauben, bei der biomedizinischen Forschung (BIORCH) mit dem Antrag App/golden auf alle Daten zuzugreifen

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"

Sie sollten in etwa folgende JSON-Antwort erhalten:

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

Nachfolgend finden Sie weitere Beispiele für die Einwilligungsressource für R4, die zeigt, wie komplexe Richtlinien dargestellt werden können.

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

Das vorherige Beispiel stellt eine Einwilligungsressource für Patienten dar, in der ein Patient f001 dem Arzt f002 die Berechtigung erteilt, eine regelmäßige Behandlung anzubieten, die durch TREAT dargestellt wird. Der Arzt kommt am Standort iso3166-1/CA. Diese Consent-Ressource ermöglicht dem Arzt Zugriff auf die Patientendaten, wenn die Daten alle der folgenden Bedingungen erfüllen.

  • Sie ist ein Encounter-Typ mit der ID Encounter/e001.
  • Sie stammt aus der Quelle http://somesystem.example.org/foo.
  • Sie erfüllt mindestens eine der folgenden Bedingungen für das Tag. Ressourcen können durch Festlegen der Felder system und code in Meta.tag getaggt werden:
    • Enthält das Tag (system = http://terminology.hl7.org/CodeSystem/common-tags und code = actionable)
    • Enthält beide Tags (system = http://example.com/custom-tags und code = archived) und (system = http://example.com/custom-tags und code = insensitive)
  • Es hat mindestens eines der folgenden Sicherheitslabels
    • system = http://terminology.hl7.org/CodeSystem/v3-Confidentiality und code ist einer der folgenden Werte: R, N, M, L oder U.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCode und code = PSY.

Beispiel für eine Admin-Richtlinienanweisung

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

Das vorherige Beispiel stellt eine Einwilligungsressource für Administratorrichtlinien dar, die einem Anwender f002 die Berechtigung erteilt, eine regelmäßige Verarbeitung durch TREAT zu ermöglichen. Der Prüfer stammt aus dem Standort iso3166-1/CA. Diese Consent-Ressource ermöglicht dem Arzt den Zugriff auf die Patientendaten, wenn die Daten alle der folgenden Bedingungen erfüllen:

  • Sie ist ein Encounter-Typ mit der ID Encounter/e001.
  • Sie stammt aus der Quelle http://somesystem.example.org/foo.
  • Es muss mindestens eine der folgenden Tag-Bedingungen erfüllen:
    • Enthält das Tag (system = http://terminology.hl7.org/CodeSystem/common-tags und code = actionable)
    • Enthält beide Tags (system = http://example.com/custom-tags und code = archived) und (system = http://example.com/custom-tags und code = insensitive)
  • Es hat mindestens eines der folgenden Sicherheitslabels
    • system = http://terminology.hl7.org/CodeSystem/v3-Confidentiality und code ist einer der folgenden Werte: R, N, M, L oder U.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCode und code = PSY.

Beispiel für eine Richtlinie für kaskadierende Administratorrichtlinien

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

Das vorherige Beispiel stellt eine kaskadierende Administratorrichtlinie für die Einwilligungsressource dar, die einer Fachkraft f002 die Berechtigung erteilt, eine regelmäßige Verarbeitung durch TREAT zu ermöglichen. Der Arzt kommt aus der Standortbestimmung iso3166-1/CA. Diese Consent-Ressource ermöglicht dem Arzt den Zugriff auf die Bereichsdaten von Patienten mit dem Tag employee. Alle Ressourcenkriterien gelten nur für die Ressourcen der Fachbereiche, also die Patientenressource, da sie steuert, von welchen Ressourcen eine Kaskadierung erfolgt.

Einwilligungen von Patienten oder Administratorrichtlinien durchsetzen

Einwilligungen des Patienten bis zum ApplyConsents erzwingen

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"

Sie sollten in etwa folgende JSON-Antwort erhalten:

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

Die Antwort enthält einen Vorgangsnamen. Um den Status des Vorgangs zu verfolgen, können Sie die [Operation `get`-Methode](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get) verwenden:

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"

Wenn der Vorgang abgeschlossen ist, gibt der Server eine Antwort mit dem Status des Vorgangs im JSON-Format zurück:

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

Diese Antwort gibt an, dass der Server zwei Einwilligungen erfolgreich verarbeitet und den Einwilligungs-Zugriff von 5 Ressourcen aktualisiert hat (1 Patient, 2 Einwilligungen, 2 Beobachtungen).

Administratorrichtlinie mit ApplyAdminConsents erzwingen

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"

Sie sollten in etwa folgende JSON-Antwort erhalten:

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

Die Antwort enthält einen Vorgangsnamen. Um den Status des Vorgangs zu verfolgen, können Sie die [Operation `get`-Methode](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get) verwenden:

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"

Wenn der Vorgang abgeschlossen ist, gibt der Server eine Antwort mit dem Status des Vorgangs im JSON-Format zurück:

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

Diese Antwort zeigte an, dass der Server 1 Administratorrichtlinie erfolgreich verarbeitet und den einvernehmlichen Zugriff von 7 Ressourcen aktualisiert hat (1 Arzt, 1 Patient, 2 Beobachtungen, 2 Einwilligungen von Patienten und 1 Administratorrichtlinie).

Die Erzwingung für Einwilligungen, die in einem FHIR-Speicher gespeichert sind, tritt erst in Kraft, wenn ApplyConsents (für die Einwilligung von Patienten) oder ApplyAdminConsents (für Administratorrichtlinien und kaskadierende Administratorrichtlinien) aufgerufen und abgeschlossen wurde. Wenn Sie Einwilligungen hinzufügen, ändern oder entfernen, nachdem Sie ApplyConsents oder ApplyAdminConsents ausgeführt haben, müssen Sie die Einwilligung noch einmal ausführen, damit diese Einwilligungen in das Erzwingungsmodell aufgenommen werden.

FHIR-Ressourcen werden asynchron indexiert. Daher kann es zu einer leichten Verzögerung zwischen dem Abschluss von ApplyConsents oder ApplyAdminConsents und der Darstellung des Erzwingungsmodells in den Suchergebnissen kommen. Diese Verzögerung gilt nur für Suchanfragen.

Wenn Sie die Einwilligungserzwingung zum ersten Mal für den FHIR-Speicher einrichten, warten Sie, bis der lang andauernde ApplyConsents- oder ApplyAdminConsents-Vorgang abgeschlossen ist, bevor Sie Anfragen senden, die die Einwilligung berücksichtigen.

Mit den folgenden Filtern können Sie ApplyConsents für eine Teilmenge von Patienten aufrufen:

  • PatientScope: zum Ausführen von ApplyConsents für eine Liste von Patienten-IDs mit bis zu 10.000 Patienten

  • TimeRange: Zum Ausführen von ApplyConsent für eine Liste von Patientenressourcen-IDs, deren Einwilligungsressourcen innerhalb eines bestimmten Zeitraums aktualisiert werden

Zum Aufrufen von ApplyAdminConsents müssen Sie die vollständige Liste aller Richtlinien angeben, die Sie anwenden möchten (keine inkrementelle Liste). Eine leere Liste führt dazu, dass die Erzwingung aller Administratorrichtlinien aus dem Store aufgehoben wird. Jede Richtlinie muss ein Ressourcenversionsname sein, wenn der FHIR-Speicher die Versionsverwaltung ist, andernfalls ein Ressourcenname.

Mit operations.get können Sie die ProgressCounter des Vorgangs abrufen. Nach Abschluss gibt es eine ApplyConsentsResponse, die in Operation.response enthalten ist. Die Zähler in ProgressCounter und ApplyConsentsResponse bzw. ApplyAdminConsentsResponse sind in der folgenden Tabelle beschrieben.

ProgressCounter ApplyConsentsResponse oder ApplyAdminConsentsResponse Beschreibung
success consentApplySuccess Die Anzahl der Einwilligungsressourcen, die beim Vorgang verarbeitet wurden.
failure consentApplyFailure Die Anzahl der Einwilligungsressourcen, die nicht unterstützt oder ungültig sind. Sie können sich entweder Fehlerlogs in Cloud Logging ansehen oder den Status der Erzwingung der Einwilligung mit CheckConsentEnforcementStatus oder CheckPatientConsentEnforcementStatus prüfen, wenn validateOnly den Wert false hat, um Fehlerdetails abzurufen.
secondarySuccess affectedResources Wenn validateOnly den Wert false hat, steht dieser Wert für die Anzahl der FHIR-Ressourcen, die aufgrund der Auswirkungen der Änderung der Einwilligung neu indexiert wurden.
secondaryFailure failedResources Wenn validateOnly den Wert false hat, steht er für die Anzahl der FHIR-Ressourcen, für die möglicherweise eine Änderung der Einwilligung vorliegt, die aber nicht neu indexiert werden konnten. Das kann sich auf die Suche mit Einwilligungskontext auswirken, aber nicht auf andere Methoden. Zur Anzeige der Fehlerdetails können Sie Fehlerlogs in Cloud Logging ansehen.

Wenn FHIR-Einwilligungs-Ressourcen verarbeitet werden, können Sie die folgenden APIs verwenden, um den Status der Erzwingung für eine einzelne Einwilligung oder alle Einwilligungen eines Patienten zu prüfen:

  • CheckConsentEnforcementStatus: gibt eine Parameters-Ressource (STU3, R4) zurück, die auflistet die folgenden Parameter:

    • id: steht für die Ressourcen-ID der Zustimmungs-Ressource

    • lastUpdated: gibt an, wann die Einwilligung zuletzt erzwungen wurde

    • versionId: Versions-ID, die für die Erzwingung der Einwilligung verwendet wird

    • consent-enforcement-status steht für den Status der Einwilligungsdurchsetzung.

  • CheckPatientConsentEnforcementStatus: gibt einen Bundle (STU3, R4) von der Parameters-Ressource (STU3,R4) zurück, die aus dem Erzwingungsstatus aller Einwilligungen eines einzelnen Patienten besteht

Bei einer Administratorrichtlinie kann CheckConsentEnforcementStatus nur zum Prüfen des Erzwingungsstatus einer einzelnen Einwilligungsadministratorrichtlinie verwendet werden. Alternativ können Sie fhirStores.get verwenden, um alle aktiven Administratorrichtlinien aufzurufen, die für den Store gelten.

consent-enforcement-status kann folgende Werte haben:

  • OFF: Der standardmäßige Erzwingungsstatus einer neuen Consent-Ressource, in der die Consent-Ressource noch nie verarbeitet wurde.

  • ENFORCEABLE: der Status, in dem die Einwilligungs-Ressource erfolgreich verarbeitet wurde.

  • INACTIVE: ein inaktiver Status, in dem die Einwilligungs-Ressource ignoriert wird.

  • UNSUPPORTED: der Status einer Einwilligungsressource, die den FHIR-Spezifikationen entsprechen kann, aber nicht durchsetzbar ist. Dies liegt an der eingeschränkten Implementierung der FHIR-Einwilligungs-erzwingung mit dem aktuellen Maß an Feature-Unterstützung.

  • ENFORCEMENT_LIMIT_EXCEEDED: Der Status, wenn das FHIR-Einwilligungs-Ressourcenformat und die Level an Unterstützung für die Ressource fehlerfrei sind, aber eine oder mehrere der folgenden Bedingungen wahr sind:

    • Der Patient hat eine große Satz von Einwilligungsressourcen.

    • Die Größe der Einwilligungsanweisungen für alle aktiven Einwilligungen ist größer als die maximal zulässige Größe der Einwilligungsanweisungen als dass ein FHIR-Server sie erzwingen könnte.

Die Cloud Healthcare API unterstützt die Suche nach FHIR-Ressourcen in einem bestimmten FHIR-Speicher mit actor, purpose und environment als Abfrageparameter. Die Antwort enthält nur die Ressourcen, für die eingewilligt wurde.

  1. Der Praxisexperte Jeffrey Brown (identifiziert durch Practitioner/12942879-f89f-41ae-aa80-0b911b649833) durchsucht mithilfe einer vertrauenswürdigen Anwendung App/123 alle Beobachtungen mit 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"
    

    Sie sollten in etwa folgende JSON-Antwort erhalten:

    {
      "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. Der Arzt Jeffrey Brown (identifiziert durch Practitioner/12942879-f89f-41ae-aa80-0b911b649833) durchsucht mit der Anwendung App/123 alle Beobachtungen von Patient 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"
    

    Sie sollten in etwa folgende JSON-Antwort erhalten:

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

    Die vorherige Abfrage ist eine verkettete Suche. Da im Einwilligungsszenario actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123 der Zugriff auf die Patient Darcy-Ressource (identifiziert durch Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2) verweigert wird, gibt der FHIR-Server keine Beobachtung vom Patienten zurück, als wäre der Patient nicht vorhanden.

  5. Der Arzt Jeffrey Brown (identifiziert durch Practitioner/12942879-f89f-41ae-aa80-0b911b649833) durchsucht mit der Anwendung App/123 alle Beobachtungen von Patient Darcy zu Notfallbehandlungszwecken.
  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"
    

    Sie sollten in etwa folgende JSON-Antwort erhalten:

    {
      "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. Der Praxisexperte Jeffrey Brown (identifiziert durch Practitioner/12942879-f89f-41ae-aa80-0b911b649833) sucht in Beobachtungen mit status=final zu zwei Zwecken: Behandlung und Forschung
  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"
    

    Sie sollten in etwa folgende JSON-Antwort erhalten:

    {
      "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 diesem Fall sollte der Praxisexperte Jeffrey Brown einen unnötigen Zweck aus dem „X-Consent-Scope“ in der Anfrage entfernen.

  9. Der IT-Administrator eines Krankenhauses verwendet bypass, um nach allen Ärzten im Krankenhaus zu suchen.
  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?"
    

    Da bypass angegeben ist, wurden die Einwilligungsprüfungen übersprungen. Sie sollten in etwa folgende JSON-Antwort erhalten:

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

Die Cloud Healthcare API unterstützt das Abrufen der FHIR-Ressource in einem bestimmten FHIR-Speicher mit actor, purpose und environment als Abfrageparameter. Die Antwort enthält nur die Ressourcen, für die eingewilligt wurde.

  1. Der Arzt Jeffrey Brown (identifiziert durch Practitioner/12942879-f89f-41ae-aa80-0b911b649833) liest mithilfe der Anwendung App/123 die Hämoglobinmessung des Patienten (in diesem Beispiel 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"
    

    Da der Anfragende seine Einwilligung gegeben hat, ist die Antwort der Inhalt der Beobachtungsressource.

    {
      "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. Der Arzt Jeffrey Brown (identifiziert durch Practitioner/12942879-f89f-41ae-aa80-0b911b649833) liest mithilfe der unbekannten Anwendung App/unknown die Hämoglobinmessung des Patienten (in diesem Beispiel 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"
    

    Da der Grenzzugriff des Anfragenden („App/unknown“) durch die Einwilligung des Patienten nicht erlaubt ist, wird die Anfrage abgelehnt.

    {
      "issue": [
        {
          "code": "security",
          "details": {
            "text": "permission_denied"
          },
          "diagnostics": "Consent access denied or the resource being accessed does not exist",
          "severity": "error"
        }
      ],
      "resourceType": "OperationOutcome"
    }
    
  5. Der Arzt Jeffrey Brown (identifiziert durch Practitioner/12942879-f89f-41ae-aa80-0b911b649833), der mit der Anwendung App/golden im Bereich der biomedizinischen Forschung arbeitet, liest das Geburtsdatum von Darcy (in diesem Beispiel 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"
    

    Da der Anfragende seine Einwilligung gegeben hat, ist die Antwort der Inhalt der Patientenressource.

    {
      "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. Der Arzt Jeffrey Brown (identifiziert durch Practitioner/12942879-f89f-41ae-aa80-0b911b649833) fordert mithilfe des „Break-the-Glass“-Protokolls unbefugten Notfallzugriff auf die Patientenakte an. (in diesem Beispiel 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"
    

    Da die Autorisierungsmethode der Einwilligung btg lautet, überspringt der Server die Einwilligungsprüfungen. Die Antwort ist der Inhalt der Ressource vom Typ „Beobachtung“.

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

In den folgenden Abschnitten werden die unterstützten Methoden zur Durchsetzung von Einwilligungen in der Cloud Healthcare API beschrieben und wie der Ressourcenzugriff erzwungen wird, wenn Sie eine Einwilligungssensitive Anfrage stellen.

Bei Stellen einer Anfrage ist Ihr Autorisierungsserver für die Generierung von Zugriffstokens mit dem entsprechenden Einwilligungsbereich verantwortlich.

HTTP-Header festlegen

Einwilligungsbereiche werden mithilfe des HTTP-Headers X-Consent-Scope an die Cloud Healthcare API übergeben. Die Cloud Healthcare API verwendet diesen Header, um die einwilligungsbasierte Zugriffssteuerung für Daten in FHIR-Speichern zu erzwingen.

Eine FHIR-Anfrage kann eine begrenzte Anzahl von Einwilligungs-Eintrags-Bereichen unterstützen. In einer FHIR-Anfrage können bis zu drei Einträge von actor, einer von purp und einer von env, enthalten sein.

Für spezielle Bereiche kann eine FHIR-Anfrage entweder btg oder bypass unterstützen.

HTTP-Header für vertrauenswürdige Anwendungen festlegen

Dieser Abschnitt ist nur erforderlich, wenn Sie einen vom Kunden kontrollierten Autorisierungsserver verwenden. In diesem Fall müssen Sie auch einen SMART-Proxy oder einen ähnlichen Proxy verwenden.

Einige vertrauenswürdige Anwendungen können direkt die Cloud Healthcare API aufrufem mit den Einwilligungsbereichen im angegebenen HTTP-Header senden. Dies ermöglicht die direkte Erzwingung der Einwilligung, ohne dass ein SMARTproxy oder ein anderer Proxy zwischen externen Autorisierungsservern und Google Cloud konvertieren muss.

Beispielsweise kann Ihre Anwendung für eine Teilmenge von Bereichen registriert sein, z. B. ein Anwendungs-environment-Bereich oder die Anwendung kann ein Auswahl-Widget anzeigen, um einige Bereichseinträge wie die purpose der zugreifenden Person festzulegen.

Ein vertrauenswürdiger Nutzer oder eine vertrauenswürdige Anwendung könnte auch die Bereichseinträge btg oder bypass verwenden, die nach einer Prüfung überprüft werden.

Die Cloud Healthcare API bietet integrierte Unterstützung für die FHIR-Einwilligung basierend auf den eingegebenen Einwilligungsbereichen. FHIR-Speicheradministratoren sind dafür verantwortlich, einen Autorisierungsserver außerhalb der Cloud Healthcare API zu erstellen und zu konfigurieren, der Einwilligungsbereiche gewährt.

Beispiel für ein Zugriffstoken

Das folgende Beispiel zeigt ein mit base64 codiertes Zugriffstoken:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpc3MiOiJjb25zZW50LnRva2VuLm9yZyIsImlhdCI6MTYxMjg4NDA4NSwiZXhwIjoxNjQ0NDIwMDg1LCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJkb2N0b3IuZ2FicmllbGFAZXhhbXBsZS5jb20iLCJzY29wZSI6Im9pZGMgYWN0b3IvUHJhY3RpdGlvbmVyLzEyMyBhY3Rvci9Hcm91cC85OTkgcHVycC92My9UUkVBVCBlbnYvQXBwL2FiYyJ9.fC7ljkVUUx8fwUOrJuONcrqA-WKC-k_Bclzlgds0Cq6H_gEe3nUjPlSOCTQsIdYB

Nach der Decodierung des Zugriffstokens sehen Sie, dass es die folgende Nutzlast enthält:

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

SMARTProxy konfigurieren

SMARTProxy ist ein Open-Source-Proxy von Google, der die folgenden Funktionen bietet:

  • Ermöglicht dem Cloud Healthcare API-FHIR-Server, Einwilligungsensitive Zugriffsstokens zu akzeptieren und zu validieren.

  • Ermöglicht der FHIR-Implementierung in der Cloud Healthcare API, Zugriffstokens mit Berücksichtigung der Nutzereinwilligung als Teil des Cloud Healthcare API-Verwaltungs- und Berechtigungsmodells einzubinden.

  • Unterstützt auch Tokenfeatures für SMART on FHIR-Unterstützung.

Wenn Sie eine Anfrage zum Abrufen von Daten aus der Cloud Healthcare API über SMARTProxy stellen, geschieht Folgendes:

  1. SMARTProxy akzeptiert eine Anfrage von einem Client, die ein Einwilligungssensitives Token enthält.

  2. SMARTProxy validiert das Einwilligungs-sensitive-Token über einen Ihrer JWT-Autorisierungsserver.

  3. SMARTProxy liest die Bereiche aus dem Einwilligungs-sensitiven Token und übergibt sie über den HTTP-Header an die Cloud Healthcare API.

  4. Die Cloud Healthcare API empfängt die Header und validiert sie, um Einwilligungsanweisungen für die Anfrage zu erzwingen. Die Cloud Healthcare API gibt dann eine Antwort über den SMARTProxy an den Client zurück.

Google Cloud-Dienstkonto konfigurieren

Ein Proxy kann nur ein einziges Google Cloud-Dienstkonto haben. Wenn mehrere Clients denselben Proxy verwenden, verwenden die Clients dasselbe Dienstkonto. Seien Sie aus folgenden Gründen vorsichtig, wenn Sie ein Dienstkonto für mehrere Clients freigeben:

Wenn Sie beispielsweise die Cloud Healthcare API direkt aufrufen und Ihr Google-Konto zur Authentifizierung nutzen, protokolliert Cloud-Audit-Logs Ihre E-Mail-Adresse als Hauptkonto-E-Mail-Adresse. Wenn Sie einen Proxy zum Aufrufen der Cloud Healthcare API verwenden, verwendet der Proxy sein eigenes Dienstkonto und die Hauptkonto-E-Mail-Adresse ist die E-Mail-Adresse des Dienstkontos und das ursprüngliche Konto ist nicht definiert.

Audit-Logs

Audit-Logs werden generiert, wenn eine Zugriffsanfrage vorliegt oder wenn sich die Zugriffserzwingung für die Ressourcen ändert.

Auf Audit-Logs zugreifen

Wenn Audit-Logs im FHIR-Speicher aktiviert sind, ist in den in Cloud Logging verfügbaren Audit-Logs das Metadatenfeld consentMode enthalten. consentMode kann einen der folgenden Werte haben:

  • off: Für die FHIR-Speicherkonfiguration ist consentConfig.accessEnforced auf false festgelegt und erlaubt keine Einwilligungssensitiven Anfragen.

  • emptyScope: Beim FHIR-Speicher ist consentConfig.accessEnforced auf true festgelegt, aber ein Einwilligungsbereich-Header wurde nicht angegeben. Aus diesem Grund wurde die Einwilligung nicht durchgesetzt.

  • enforced: Für den FHIR-Speicher wurde consentConfig.accessEnforced auf true festgelegt und der Header für den Einwilligungsbereich war vorhanden. Infolgedessen wurden die Einwilligungen geprüft und für die Anfrage erzwungen.

  • btg: Für die FHIR-Anfrage war im Header für den Einwilligungsbereich btg angegeben. Daher wurden Einwilligungsprüfungen übersprungen. Diese Anfrage ist für Notfälle vorgesehen und unterliegt nur einer Prüfprüfung.

  • bypass: Für die FHIR-Anfrage war im Header für den Einwilligungsbereich nur bypass angegeben. Daher wurden Einwilligungsprüfungen übersprungen. Diese Anfrage ist für die Verwendung von einem vertrauenswürdigen Workflow (z. B. einem Administrator oder einer vertrauenswürdigen Anwendung anstelle von Endnutzern) vorgesehen. Aus diesem Grund unterscheidet sich dieses Audit-Log vom btg, das für Data-Governance-Prüfungen verwendet wird.

Optional können Sie access_determination_log_config auf VERBOSE setzen, um weitere Informationen darüber zu erhalten, warum eine Anfrage gewährt oder abgelehnt wurde.

Audit-Logs zur Zugriffserzwingung für Änderungen

Wenn sich die Ressourcenbasis des Fachs ändert (z. B. durch Entfernen des Tags employee eines Patienten): Die Zugriffssteuerung für die geänderte Ressource und das zugehörige Fach kann sich aufgrund der Richtlinie zur kaskadierenden Administratorberechtigung ändern. Dadurch wird eine Neuindexierung für alle zugehörigen Ressourcen ausgelöst. Der Fortschritt der Neuindexierung für jede Aktualisierung der Bereichsbasisressource kann in Cloud Logging mit dem Filter jsonPayload.@type="type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry" verfolgt werden.

Beispiel für ein Fortschrittslog zur kaskadierenden Neuindexierung

{
  "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 ist der Status der Neuindexierung, jsonPayload.affectedResources die Anzahl der neu indexierten Fachressourcen und jsonPayload.lastUpdated der Zeitstempel der Aktualisierung der Patientenressourcen. Wenn der Vorgang gerade erst gestartet wurde, sind jsonPayload.state="STATE_STARTED" und jsonPayload.affectedResources nicht vorhanden.

Einschränkungen und Grenzwerte

Dieser Abschnitt zeigt die Einschränkungen und Limits für FHIR R4. Dieselben Einschränkungen und Limits gelten jedoch auch für FHIR STU3.

Typ Einschränkungen und Limits
Einzelne Einwilligungsressource
  • Es wird nur eine einzelne Consent.provision unterstützt. Mehrere Bereitstellungen oder eine verschachtelte Bereitstellung werden nicht unterstützt.
  • Mindestens 1 Consent.provision.actor, höchstens 25:
    • Consent.provision.actor.role muss http://terminology.hl7.org/CodeSystem/v3-RoleCode lauten.
    • Consent.provision.actor.code muss GRANTEE oder HPOWATT sein.
  • Höchstens 1 Consent.provision.purpose:
    • Consent.provision.purpose.system muss http://terminology.hl7.org/CodeSystem/v3-ActReason lauten.
    • Das Feld „Consent.provision.purpose.code“ darf nicht leer sein und darf höchstens 13 Zeichen enthalten.
  • Höchstens 1 environment:
    • Consent.provision.extension.url muss https://g.co/fhir/medicalrecords/Environment lauten.
    • Die Länge von System und Code kombiniert muss weniger als 15 Zeichen betragen.
  • Beim Filtern nach Ressourcentyp muss Consent.provision.class.system auf http://hl7.org/fhir/resource-types gesetzt sein.
  • Beim Filtern nach Datenquelle muss für Consent.provision.extension.url der Wert https://g.co/fhir/medicalrecords/DataSource festgelegt sein.
  • Wenn nach Daten-Tag gefiltert wird, muss für Consent.provision.extension.url https://g.co/fhir/medicalrecords/DataTag festgelegt werden.
    • Das Daten-Tag kann eine komplexe Erweiterung sein, die bis zu einer Ebene verschachtelt ist, um eine Richtlinie zu beschreiben, die Ressourcen mit allen angegebenen Tags entspricht (konjunktiv interpretiert).
    • Es werden maximal fünf verschachtelte Tags unterstützt.
  • Höchstens 100 Werte für alle wiederholten Attribute, sofern in dieser Zeile nicht anders angegeben.
Erzwingungsmodell
  • Für jeden Patienten können bis zu 200 active Consent-Ressourcen gleichzeitig erzwungen werden.
  • Für jeden Shop können bis zu 200 active-Administratorrichtlinien gleichzeitig erzwungen werden.
  • Ein spezielles kompaktes Format für alle Einwilligungsanweisungen für alle aktiven Einwilligungen eines bestimmten Patienten darf einen festgelegten Schwellenwert nicht überschreiten. Üblicherweise sind genügend Kapazitäten vorhanden, um Tausende von Einwilligungsanweisungen zu codieren, es sei denn, sehr lange Ressourcenstrings sind besonders reichlich vorhanden. Beispiel:
    • Hunderte von Einwilligungen für einzelne Datenquellen und Daten-Tags, von denen jedes sehr lange dauert, nimmt viel Speicherplatz in Anspruch.
    • Ein einzelner Patient mit 3.000 eindeutigen Consent.provision.data.reference-Ressourcenkennungseinträgen über viele aktive Einwilligungen, die jeweils eine eindeutige Consent.provision.actor angeben, nutzt den Platz aggressiver als Bestimmungen, die keine Datenreferenzbeschränkung angeben oder anderweitig viele derselben Akteurereferenzstrings enthalten.
  • Jede Ressource kann bis zu 1.000 Einwilligungs-anweisungen aus allen Einwilligungen enthalten, die für sie gelten.
X-Consent-Scope
  • Mindestens ein und maximal drei Einträge vom Typ „actor“.
  • Maximal ein purp-Eintrag:
    • Jeder purp-Eintrag muss das Format system/code haben (v3 ist das registrierte System für http://terminology.hl7.org/CodeSystem/v3-ActReason).
    • Länge des Codes muss kürzer als 13 sein.
  • Maximal ein env-Eintrag:
    • Jeder env-Eintrag muss das Format system/code haben.
    • Die Länge von System und Code kombiniert muss weniger als 15 sein.
  • Für „btg“ ist mindestens ein Eintrag für „actor“ erforderlich.
  • Für „bypass“ sind mindestens ein Eintrag für „actor“ und „env“ erforderlich.
Unterstützte Methoden
Leistung
  • ApplyConsents und ApplyAdminConsents sind ähnlich oder besser als ImportResources skaliert.
  • In Bezug auf Einwilligungssensitive Anfragen:
    • Unser Einwilligungsmodell wurde für die Durchsetzungsleistung von CRUD-Vorgängen optimiert, einschließlich der Suche in großem Maßstab über viele Ressourcen und viele Patienten hinweg.
    • Ein Lesevorgang für einzelne Ressourcen kann sich geringfügig auf die Anfragelatenz auswirken. Die Suchleistung hängt jedoch von der Basisabfrage und der Anzahl der Einwilligungsbereiche ab, die dazu führt, dass mehr zugreifende Person-kriterien Während einer Suche aktiv sind.
    • Wir empfehlen, eigene Leistungstests für eine Vielzahl repräsentativer FHIR-Anfrageparameter auszuführen, um die Leistungsmerkmale für Ihre Anwendungsfälle anhand der Eigenschaften Ihrer Daten zu bestimmen, z. B. wie viele Ressourcen eines bestimmten Suchressourcentyps im FHIR-Speicher vorhanden sind.
    • Unsere Lösung hält die Aufnahme und Aktualisierungen aller Ressourcen, einschließlich Einwilligungsressourcen, schlank, sodass der Durchsatz während der Aufnahme und anderer Formen des Schreibtraffics mit minimalen Auswirkungen ablaufen kann.

Best Practices

In den folgenden Abschnitten werden Best Practices für die Verwendung der FHIR-Zugriffssteuerung beschrieben.

Allgemeine Best Practices

  • import Sie keine FHIR-Ressourcen und rufen Sie ApplyConsents oder ApplyAdminConsents nicht parallel auf. Wir empfehlen, zuerst FHIR-Ressourcen zu importieren und dann ApplyConsents oder ApplyAdminConsents aufzurufen. Wenn die zu importierenden Ressourcen jedoch keine Ressourcen für Patienten oder Einwilligung enthalten, ist das Erzwingungsmodell nicht betroffen und die Verarbeitung von Einwilligungen oder Administratorrichtlinien ist nicht erforderlich.

  • Erstellen Sie keine benutzerdefinierten Suchanfragen und rufen Sie ApplyConsents nicht parallel auf. Wir empfehlen, diese Dinge nacheinander auszuführen.

  • Wenn für Ihre Workflows mehrere ApplyConsents auf disjunkte PatientScope-Instanzen aufgerufen werden müssen, können sie parallel aufgerufen werden.

  • ApplyAdminConsents kann parallel zu einer beliebigen Anzahl von ApplyConsents ausgeführt werden, aber nicht mit einem anderen ApplyAdminConsents.

  • Schränken Sie beim Einrichten des Proxys das IAM-Dienstkonto mit Leseberechtigungen ein, um zu verhindern, dass die Daten eines Patienten in die Datensätze eines anderen Patienten geschrieben werden.

  • Verwenden Sie zum Erstellen oder Aktualisieren von Einträgen nicht den Consent Proxy.

  • Validieren Sie alle Schreibanfragen, um unerwartete Änderungen patientenübergreifender Daten zu verhindern.

  • Wenn kaskadierende Einwilligungen erzwungen werden, müssen zuerst die Ressourcen der Abteilungen importiert werden, gefolgt von den verbleibenden Ressourcen der Abteilungen. Alternativ können alle Ressourcen in einem einzelnen Bundle zusammengefasst und mit fhir.executeBundle aufgenommen werden.

Patientenressource löschen

Wenn Sie beim Löschen einer Patientenressource auch die Einwilligungserzwingung für diesen Patienten entfernen möchten (insbesondere, wenn FhirStore.disableReferentialIntegrity "true“ ist), sollten Sie folgende Reihenfolge der Vorgänge beachten:

  1. Löschen Sie alle Einwilligung-Ressourcen, die zur Patientenressource gehören.

  2. Rufen Sie ApplyConsents mit dem Filter PatientScope auf.

So richten Sie einen vorhandenen Shop für den Einwilligungszugriff ein:

  1. Nutzen Sie UpdateFhirStore um den ConsentConfig mit der Einwilligungs-Durchsetzung version als V1 festzulegen und legen Sie accessEnforced auf true fest.

    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. Einwilligungen von Patienten oder Administratorrichtlinien verarbeiten

    1. ApplyConsents für Patienteneinwilligungen
    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 für Administratorrichtlinien und kaskadierende Administratorrichtlinien.
    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"
    

Wie oft „ApplyConsents“ oder „ApplyAdminConsents“ ausgeführt werden sollen

  • Wenn das Feld ConsentConfig nicht festgelegt ist: Das Feld ConsentConfig wird sowohl beim erstmaligen Erstellen eines FHIR-Speichers als auch beim Löschen des Felds ConsentConfig gelöscht. Sobald das Feld ConsentConfig nicht festgelegt ist, müssen Sie Folgendes wiederholen: Speicher für den Einwilligungszugriff einrichten, bevor Sie Einwilligungssensitive Anfragen stellen, um eine Auswertung veralteter Einwilligungen-Erzwingungsrichtlinien zu vermeiden.

  • Wenn sich das Erzwingungsmodell ändert: Wenn eine Einwilligungsressource erstellt, aktualisiert oder gelöscht wird, ändert sich das Erzwingungsmodell. In solchen Fällen müssen Sie ApplyConsents oder ApplyAdminConsents aufrufen, damit die Änderungen wirksam werden.

    • Wenn Sie die Patienten mit Änderungen der Einwilligung verfolgen können, empfehlen wir, den Filter PatientScope zu verwenden, um die erneute Verarbeitung des gesamten Speichers zu vermeiden. Dieser Filter ist nützlich, um die Erzwingung einer kleinen Gruppe von Patienten sofort zu aktualisieren.

    • Sie können ApplyConsents auch regelmäßig mit dem Filter TimeRange ausführen. Dieser Filter ist nützlich, wenn die sofortige Aktualisierung nicht entscheidend ist. Mit der folgenden Anfrage wird beispielsweise die Erzwingung für Einwilligungsänderungen zwischen dem 20.09.2022 (UTC 0:00 Uhr) und dem 21.09.2022 (UTC 0:00) aktualisiert.

      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"
      

Nächste Schritte