Zugriff auf FHIR-Ressourcen in der Cloud Healthcare API steuern

Auf dieser Seite wird beschrieben, wie Sie FHIR-Einwilligungs-Ressourcen verwenden, um den Datenzugriff von FHIR-Speichern in der Cloud Healthcare API zu 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 Einwilligungserzwingung zu aktivieren:

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

    • access_enforced: Wenn dieser Wert auf true gesetzt ist, werden beim Zugriff auf FHIR-Ressourcen die angegebenen Einwilligungs-Header mit den von den Nutzern angegebenen Einwilligungsanweisungen abgeglichen.

    • consent_header_handling: Wenn dieser Wert auf PERMIT_EMPTY_SCOPE (Standard) gesetzt ist, lässt der Server Anfragen ohne (oder mit leerem) X-Consent-Scope-Header zu. Wenn REQUIRED_ON_READ festgelegt ist und access_enforced = true, lehnt der Server alle Anfragen ohne (oder mit leerem) 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores?fhirStoreId=FHIR_STORE_ID"

Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

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

Wenn Sie bereits ein Geschäft haben, verwenden 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?update_mask=consentConfig"

Richtlinien werden durch die Consent-Ressource dargestellt. Zweck und Verwendung der Ressourcenfelder werden in der Dokumentation zum Datenmodell 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 Sie ein [FHIR-Bundle](/healthcare-api/docs/how-tos/fhir-bundles) ausführen, um die folgenden Ressourcen zu füllen:

  • Eine Fachkraft-ressource mit dem Namen Jeffrey Brown
  • Eine Patientenressource mit dem Namen Darcy Smith
  • Eine Beobachtungsressource mit einer Hämoglobinmessung von Darcy (LOINC718-7), die vom Happy Hospital erfasst wurde
  • Eine Beobachtungsressource mit einer Glucose-Messung von Darcy (LOINC15074-8).
  • Eine Einwilligung von Darcy, um Jeffrey Brown die Verwendung der Anwendung App/123 zu erlauben, um auf ihre vom Happy Hospital erfassten Daten zuzugreifen.
  • Eine Einwilligung von Darcy, um Jeffrey Brown den Zugriff auf all ihre Daten für eine Notfallbehandlung zu erlauben (ETREAT)
  • Eine Einwilligung des Happy Hospital, um Jeffrey Brown den Zugriff auf alle Daten für biomedizinische Forschung zu erlauben (BIORCH) mit der Anwendung 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir"

Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

{
  "entry": [
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1/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/v1/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/v1/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/v1/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/v1/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/v1/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/v1/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"
}

Im Folgenden finden Sie weitere Beispiele für die Consent-Ressource (R4), die zeigen, 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 obige Beispiel stellt eine Einwilligungsressource für Patienten dar, in der ein Patient f001 einer Fachkraft f002 Berechtigung gewährt, um eine reguläre Behandlung bereitzustellen, die durch TREAT dargestellt wird. Die Fachkraft stammt aus dem Standort iso3166-1/CA. Diese Einwilligungsressource ermöglicht es dem Fachkraft, auf die Patientendaten zuzugreifen, 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üllen mindestens eine der folgenden Bedingungen für das Tag (Ressourcen können durch Festlegen der Felder system und code von Meta.tags getaggt werden):
    • Hat das Tag (system = http://terminology.hl7.org/CodeSystem/common-tags und code = actionable)
    • Beide Tags sind vorhanden (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, U.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCode und code = PSY.

Beispiel für eine Administratorrichtlinienanweisung

{
  "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 Consent-Ressource für eine Administratorrichtlinie dar, die einer Fachkraft f002 die Berechtigung erteilt, eine reguläre Behandlung bereitzustellen, die durch TREAT dargestellt wird. Die Fachkraft stammt aus dem Standort iso3166-1/CA. Diese Einwilligungsressource ermöglicht es dem Fachkraft, auf die Patientendaten zuzugreifen, 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üllen mindestens eine der folgenden Bedingungen für das Tag:
    • Hat das Tag (system = http://terminology.hl7.org/CodeSystem/common-tags und code = actionable)
    • Beide Tags sind vorhanden (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, U.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCode und code = PSY.

Beispiel für eine kaskadierende Richtlinienanweisung für Administratoren

{
  "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 Consent-Ressource für eine kaskadierende Administratorrichtlinie dar, die einer Fachkraft f002 die Berechtigung erteilt, eine reguläre Behandlung bereitzustellen, die durch TREAT dargestellt wird. Die Fachkraft stammt aus dem Standort iso3166-1/CA. Diese Einwilligungsressource ermöglicht es dem Arzt, auf die Compartment-Daten von Patienten mit dem Tag employee zuzugreifen. Alle Ressourcenkriterien gelten nur für die Basisressourcen des Bereichs, d. h. die Patientenressource, da sie steuert, von welchen Ressourcen kaskadiert werden soll.

Patienteneinwilligungen oder Administratorrichtlinien erzwingen

Einwilligungen des Patienten durchsetzen durch 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"

Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

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

Die Antwort enthält einen Vorgangsnamen. Sie können den Status des Vorgangs mit der [Methode „get“ für Vorgänge](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get) verfolgen:

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://healthcare.googleapis.com/v1/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.v1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1.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.v1.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 durch 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyAdminConsents"

Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

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

Die Antwort enthält einen Vorgangsnamen. Sie können den Status des Vorgangs mit der [Methode „get“ für Vorgänge](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get) verfolgen:

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://healthcare.googleapis.com/v1/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.v1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1.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.v1.fhir.ApplyAdminConsentsResponse",
    "consentApplySuccess": "1",
    "affectedResources": "7"
  }
}

Diese Antwort gibt an, dass der Server eine Administratorrichtlinie erfolgreich verarbeitet und den Einwilligungs-Zugriff von 7 Ressourcen aktualisiert hat (1 Arzt, 1 Patient, 2 Beobachtungen, 2 Patienteneinwilligungen und 1 Administratorrichtlinie).

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

FHIR-Ressourcen werden asynchron indexiert. Daher kann es zu einer geringfügigen Verzögerung zwischen dem Zeitpunkt, an dem ApplyConsents oder ApplyAdminConsents abgeschlossen ist, und dem Zeitpunkt kommen, an dem das Erzwingungsmodell in den Suchergebnissen angezeigt wird. Diese Verzögerung ist nur bei Suchanfragen zu erwarten.

Wenn Sie zum ersten Mal die Durchsetzung von Einwilligungen im FHIR-Speicher einrichten, warten Sie, bis der lang andauernde Vorgang ApplyConsents oder ApplyAdminConsents abgeschlossen ist, bevor Sie Einwilligungssensitive Anfrderungen stellen.

Wenn Sie ApplyConsents für eine Teilmenge von Patienten aufrufen möchten, können Sie die folgenden Filter verwenden:

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

  • TimeRange: ApplyConsent für eine Liste von Patientenressourcen-IDs ausführen, deren Einwilligungsressourcen in einem bestimmten Zeitraum aktualisiert werden

Wenn Sie ApplyAdminConsents aufrufen möchten, müssen Sie die vollständige Liste aller Richtlinien angeben, die Sie anwenden möchten (keine inkrementelle Liste). Wenn die Liste leer ist, wird die Durchsetzung aller Administratorrichtlinien des Stores aufgehoben. Jede Richtlinie muss ein Ressourcenversionsname sein, wenn die FHIR-Speicher versioniert werden, andernfalls ein Ressourcenname.

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

ProgressCounter ApplyConsentsResponse oder ApplyAdminConsentsResponse Beschreibung
success consentApplySuccess Die Anzahl der Consent-Ressourcen, die durch den Vorgang erfolgreich verarbeitet wurden.
failure consentApplyFailure Die Anzahl der Einwilligungsressourcen, die nicht unterstützt oder ungültig sind. Sie haben folgende Möglichkeiten: Fehlerlogs in Cloud Logging aufrufen oder wenn validateOnly jedoch false ist, prüfen Sie den Status der Erzwingung von Einwilligungen mit CheckConsentEnforcementStatus oder CheckPatientConsentEnforcementStatus, um Fehlerdetails abzurufen.
secondarySuccess affectedResources Wenn validateOnly den Wert false hat, steht er für die Anzahl der FHIR-Ressourcen, die aufgrund der Einwilligungsänderung erfolgreich neu indexiert wurden.
secondaryFailure failedResources Wenn validateOnly den Wert false hat, steht er für die Anzahl der FHIR-Ressourcen, die möglicherweise eine Einwilligungsänderung haben, aber nicht neu indexiert werden konnten. Dies kann sich auf die Suche mit Einwilligungskontext auswirken, nicht aber auf andere Methoden. Wenn Sie die Fehlerdetails sehen möchten, können Sie Fehlerlogs in Cloud Logging aufrufen.

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: Der Zeitpunkt, zu dem die Einwilligung zuletzt erzwungen wurde.

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

    • consent-enforcement-status: Stellt den Status der Erzwingung der Einwilligung dar.

  • 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 der Administratorrichtlinie kann CheckConsentEnforcementStatus nur verwendet werden, um den Erzwingungsstatus einer einzelnen Administratorrichtlinie zur Einwilligung zu prüfen. Alternativ können Sie fhirStores.get verwenden, um alle aktiven Administratorrichtlinien aufzurufen, die auf den Store angewendet werden.

consent-enforcement-status kann folgende Werte haben:

  • OFF: der Standard-Erzwingungsstatus einer neuen Einwilligungs-Ressource, bei dem die Einwilligungs-Ressource 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 Einwilligungs-Ressource, die möglicherweise den FHIR-Spezifikationen entspricht, 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. Fachkraft Jeffrey Brown (identifiziert durch Practitioner/12942879-f89f-41ae-aa80-0b911b649833) verwendet eine vertrauenswürdige Anwendung App/123 und sucht 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?status=final"

    Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

    {
      "entry": [
        {
          "fullUrl": "https://healthcare.googleapis.com/v1/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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
        }
      ],
      "resourceType": "Bundle",
      "total": 1,
      "type": "searchset"
    }
    
  3. Fachkraft Jeffrey Brown (identifiziert durch Practitioner/12942879-f89f-41ae-aa80-0b911b649833) verwendet die Anwendung App/123 und sucht alle Beobachtungen von Patientin 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?subject:Patient.name=Darcy"

    Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

    {
      "link": [
        {
          "relation": "search",
          "url": "https://healthcare.googleapis.com/v1/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/v1/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/v1/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 dem Einwilligungsszenario actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123 der Zugriff auf die Patient-Darcy-Ressource (durch Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2 identifiziert) verweigert wird, gibt der FHIR-Server keine Beobachtung vom Patienten zurück, als ob der Patient nicht existiert.

  5. Fachkraft Jeffrey Brown (identifiziert durch Practitioner/12942879-f89f-41ae-aa80-0b911b649833) verwendet die Anwendung App/123 und sucht nach allen Beobachtungen des Patienten 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?subject:Patient.name=Darcy"

    Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

    {
      "entry": [
        {
          "fullUrl": "https://healthcare.googleapis.com/v1/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/v1/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/v1/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/v1/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/v1/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. Fachkraft Jeffrey Brown (identifiziert durch Practitioner/12942879-f89f-41ae-aa80-0b911b649833) sucht nach 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?status=final"

    Sie sollten eine JSON-Antwort ähnlich wie diese 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 Fachkraft Jeffrey Brown den unnötigen Zweck aus dem `X-Consent-Scope` in der Anfrage entfernen.

  9. Ein IT-Administrator eines Krankenhauses verwendet bypass, um nach allen Ärzten und medizinischen Fachkräften 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/v1/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 eine JSON-Antwort ähnlich der folgenden erhalten:

    {
      "entry": [
        {
          "fullUrl": "https://healthcare.googleapis.com/v1/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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1/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 von 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. Fachkraft Jeffrey Brown (identifiziert durch Practitioner/12942879-f89f-41ae-aa80-0b911b649833) verwendet die Anwendung App/123, liest die Hämoglobin-Messung 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"

    Da der Anfragende die Einwilligung erhalten hat, enthält die Antwort den 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. Fachkraft Jeffrey Brown (identifiziert durch Practitioner/12942879-f89f-41ae-aa80-0b911b649833) verwendet die unbekannte Anwendung App/unknown und liest die Hämoglobin-Messung 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/v1/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`) nicht durch die Einwilligung des Patienten zugelassen 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. Fachkraft Jeffrey Brown (identifiziert durch Practitioner/12942879-f89f-41ae-aa80-0b911b649833) führt mit der Anwendung App/golden biomedizinische Forschung durch und 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"

    Da der Anfragende die Einwilligung erhalten hat, enthält die Antwort den 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. Fachkraft Jeffrey Brown (identifiziert durch Practitioner/12942879-f89f-41ae-aa80-0b911b649833) beantragt mithilfe des „Break-the-Glass“-Protokolls einen unbefugten Notfallzugriff auf die Patientenakte. 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/v1/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 ist, überspringt der Server die Einwilligungsprüfungen. Die Antwort ist der Inhalt der Observation-Ressource.

    {
      "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 über den HTTP-Header 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.

Bei speziellen Bereichen 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 SMARTproxy 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 Cloudkonvertieren 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 kann auch die Bereichseinträge btg oder bypass verwenden, die nach der Prüfung überprüft werden.

Die Cloud Healthcare API bietet integrierte Unterstützung für die Erzwingung von FHIR-Einwilligungen 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 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, einwilligungsfsensitive Zugriffstokens als Teil des Verwaltungs- und Berechtigungsmodells der Cloud Healthcare API zu inkludieren.

  • 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, passiert 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 Google Cloud Dienstkonto haben. Wenn mehrere Clients denselben Proxy verwenden, verwenden sie dasselbe Dienstkonto. Seien Sie vorsichtig, wenn Sie ein Dienstkonto für mehrere Kunden freigeben. Das hat folgende Gründe:

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 erfolgt oder sich die Zugriffsrichtlinien für die Ressourcen ändern.

Auf Audit-Logs zugreifen

Wenn Audit-Logs für den 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. Daher wurden keine Einwilligungen erzwungen.

  • enforced: Beim FHIR-Speicher ist consentConfig.accessEnforced auf true festgelegt und der Einwilligungsbereich-Header war vorhanden. Daher wurden Einwilligungen für die Anfrage ausgewertet und durchgesetzt.

  • btg: In der FHIR-Anfrage wurde btg im Einwilligungsbereich-Header angegeben. Daher wurden die Einwilligungsprüfungen übersprungen. Diese Anfrage ist für Notfälle vorgesehen und unterliegt nur einer nachträglichen Prüfung.

  • bypass: In der FHIR-Anfrage wurde im Einwilligungsbereich-Header nur bypass angegeben. Daher wurden die Prüfungen auf Einwilligung übersprungen. Diese Anfrage ist für einen vertrauenswürdigen Workflow (z. B. einen Administrator oder eine vertrauenswürdige Anwendung anstelle von Endnutzern) vorgesehen, damit sich dieses Audit-Log von der btg unterscheidet, die für Prüfungen zur Datenverwaltung verwendet wird.

Optional können Sie access_determination_log_config auf VERBOSE festlegen, um weitere Informationen dazu aufzuzeichnen, warum eine Anfrage genehmigt oder abgelehnt wird.

Audit-Logs für Änderungen bei der Erzwingung des Zugriffs aufrufen

Wenn sich die Basisressource des Compartments ändert (z. B. durch Entfernen des employee-Tags eines Patienten): Die Zugriffssteuerung für die geänderte Ressource und ihr Compartment kann sich aufgrund der Admin-Cascading-Richtlinie ändern. Dadurch wird die Neuindexierung aller Ressourcen des Bereichs ausgelöst. Der Reindexierungsfortschritt für jede Aktualisierung der Compartment-Basisressource kann in Cloud Logging mit dem Filter jsonPayload.@type="type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry" verfolgt werden.

Beispiel für ein Log zum Fortschritt der 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 des Reindexierungsvorgangs, jsonPayload.affectedResources ist die Anzahl der neu indexierten Fachressourcen und jsonPayload.lastUpdated ist der Zeitstempel der Aktualisierung der Patientenressource. Wenn der Vorgang gerade erst begonnen hat, sind jsonPayload.state="STATE_STARTED" und jsonPayload.affectedResources nicht vorhanden.

Einschränkungen und Grenzwerte

In diesem Abschnitt werden die Einschränkungen und Limits für FHIR R4 beschrieben. Dieselben Einschränkungen und Limits gelten jedoch auch für FHIR STU3.

Typ Einschränkungen und Grenzwerte
Einzelne Consent-Ressource
  • 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.
    • Consent.provision.purpose.code ist nicht leer und enthält höchstens 13 Zeichen.
  • 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.
  • Wenn nach Ressourcentyp gefiltert wird, muss Consent.provision.class.system http://hl7.org/fhir/resource-types sein.
  • Wenn Sie nach Datenquelle filtern, muss Consent.provision.extension.url gleich https://g.co/fhir/medicalrecords/DataSource sein.
  • Wenn Sie nach Datentag filtern, muss Consent.provision.extension.url https://g.co/fhir/medicalrecords/DataTag sein.
    • 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 5 verschachtelte Tags unterstützt.
  • Höchstens 100 Werte für alle wiederkehrenden Attribute, sofern in dieser Zeile nicht anders beschrieben.
Erzwingungsmodell
  • Für jeden Patienten können bis zu 200 active-Einwilligungsressourcen gleichzeitig erzwungen werden.
  • Für jeden Speicher können bis zu 200 active-Administratorrichtlinien gleichzeitig erzwungen werden.
  • Ein spezielles kompaktes Format für die Menge aller Einwilligungsanweisungen für alle aktiven Einwilligungen für einen bestimmten Patienten darf einen festgelegten Schwellenwert für die Größe nicht überschreiten. In der Regel ist genügend Kapazität vorhanden, um Tausende von Einwilligungsanweisungen zu codieren, es sei denn, sehr lange Ressourcen-Strings sind besonders häufig. Beispiel:
    • Hunderte von Einwilligungen für eindeutige Datenquellen und Datentags, die jeweils sehr lang sind, verbrauchen viel Speicherplatz.
    • Ein einzelner Patient mit 3.000 eindeutigen Consent.provision.data.reference-Ressourcenkennzeichnungseinträgen für viele aktive Einwilligungen, die jeweils eine eindeutige Consent.provision.actor angeben, verwendet aggressiver Speicherplatz als Bestimmungen, die keine Datenverweisbeschränkung angeben oder andernfalls viele der gleichen Akteur-Verweis-Strings 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 actor-Einträge.
  • 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).
    • Die Länge des Codes muss weniger als 13 Zeichen betragen.
  • 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.
  • btg erfordert mindestens einen actor-Eintrag.
  • bypass erfordert mindestens einen actor-Eintrag und einen env-Eintrag.
Unterstützte Methoden
Leistung
  • ApplyConsents und ApplyAdminConsents lassen sich ähnlich oder besser skalieren als ImportResources.
  • 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

  • Importieren Sie nicht gleichzeitig FHIR-Ressourcen und rufen ApplyConsents oder ApplyAdminConsents auf. Wir empfehlen, zuerst FHIR-Ressourcen zu importieren und dann ApplyConsents oder ApplyAdminConsents aufzurufen. Wenn die zu importierenden Ressourcen jedoch keine Patienten- oder Einwilligungsressourcen enthalten, ist das Erzwingungsmodell nicht betroffen und das Verarbeiten von Einwilligungen oder Administratorrichtlinien ist nicht erforderlich.

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

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

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

  • Beschränken Sie beim Einrichten des Proxys das IAM-Dienstkonto mit schreibgeschützten Berechtigungen, um zu vermeiden, dass die Daten eines Patienten in die Aufzeichnungen eines anderen Patienten geschrieben werden.

  • Verwenden Sie den Consent Proxy nicht, wenn Sie Datensätze erstellen oder aktualisieren.

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

  • Wenn kaskadierende Einwilligungen erzwungen werden, müssen Compartment-Basisressourcen zuerst importiert werden, gefolgt von den verbleibenden Compartment-Ressourcen. Alternativ können alle Ressourcen des Compartments in einem einzigen 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. Rufe ApplyConsents mit dem Filter PatientScope auf.

So richten Sie einen vorhandenen Speicher für den Einwilligungs-Zugriff 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/v1/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/v1/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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyAdminConsents"

Häufigkeit der Ausführung von „ApplyConsents“ oder „ApplyAdminConsents“

  • Wenn das Feld ConsentConfig nicht festgelegt ist: Das Feld ConsentConfig ist sowohl beim ersten Erstellen eines FHIR-Speichers als auch beim Löschen des Felds ConsentConfig nicht festgelegt. 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 Durchsetzungsmodell ändert: Wenn eine Consent-Ressource erstellt, aktualisiert oder gelöscht wird, ändert sich das Durchsetzungsmodell. In solchen Fällen müssen Sie ApplyConsents oder ApplyAdminConsents anrufen, 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 Durchsetzung für eine kleine 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 eine sofortige Aktualisierung nicht erforderlich ist. Beispielsweise aktualisiert die folgende Anfrage die Erzwingung für Änderungen der Einwilligung zwischen dem 20.09.2022 0 Uhr und dem 21.09.2022 0 Uhr UTC.

      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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"

Im FHIR Consent Viewer werden Zugriffssteuerungsrichtlinien angezeigt. Sie enthält eine Tabelle mit Einwilligungsbereichen, die FHIR-Zugriffssteuerungsregeln darstellen.

Bevor Sie den FHIR Consent Viewer verwenden können, müssen Sie Folgendes sicherstellen:

Führen Sie die folgenden Schritte aus, um die FHIR Consent Viewer aufzurufen:

Nächste Schritte