Auf dieser Seite wird beschrieben, wie Sie mithilfe von FHIR-Einwilligungsressourcen den Datenzugriff auf FHIR-Speicher in der Cloud Healthcare API bestimmen.
Speicher mit aktivierter FHIR-Zugriffssteuerung konfigurieren
Führen Sie die folgenden Schritte aus, um einen FHIR-Speicher mit Einwilligungserzwingung zu konfigurieren:
Erstellen Sie einen FHIR-Speicher, falls Sie noch keinen haben.
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 vonCreateFhirStore
oderUpdateFhirStore
festgelegt werden. Anschließend müssen SieApplyConsents
oderApplyAdminConsents
aufrufen, um die Version zu ändern.access_enforced
: Wenn der Wert auftrue
gesetzt ist, werden die bereitgestellten Einwilligungsheader beim Zugriff auf FHIR-Ressourcen anhand der Einwilligungsanweisungen von Nutzern geprüft.consent_header_handling
: WennPERMIT_EMPTY_SCOPE
(Standardeinstellung) festgelegt ist, lässt der Server Anfragen ohne (oder leeren)X-Consent-Scope
-Header zu. WennREQUIRED_ON_READ
undaccess_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 mithilfe der Consent-Ressource definieren
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 (LOINC
718-7
) zeigt, die vom Happy Hospital erfasst wurde - Eine Beobachtungsressource zur Darstellung der Blutzuckermessung von Darcy (LOINC
15074-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 AntragApp/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.
Beispiel für eine Einwilligungserklärung für Patienten
{ "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 IDEncounter/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
undcode
in Meta.tag getaggt werden: - Enthält das Tag (
system
=http://terminology.hl7.org/CodeSystem/common-tags
undcode
=actionable
) - Enthält beide Tags (
system
=http://example.com/custom-tags
undcode
=archived
) und (system
=http://example.com/custom-tags
undcode
=insensitive
) - Es hat mindestens eines der folgenden Sicherheitslabels
system
=http://terminology.hl7.org/CodeSystem/v3-Confidentiality
undcode
ist einer der folgenden Werte:R
,N
,M
,L
oderU
.system
=http://terminology.hl7.org/CodeSystem/v3-ActCode
undcode
=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 IDEncounter/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
undcode
=actionable
) - Enthält beide Tags (
system
=http://example.com/custom-tags
undcode
=archived
) und (system
=http://example.com/custom-tags
undcode
=insensitive
) - Es hat mindestens eines der folgenden Sicherheitslabels
system
=http://terminology.hl7.org/CodeSystem/v3-Confidentiality
undcode
ist einer der folgenden Werte:R
,N
,M
,L
oderU
.system
=http://terminology.hl7.org/CodeSystem/v3-ActCode
undcode
=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 vonApplyConsents
für eine Liste von Patienten-IDs mit bis zu 10.000 PatientenTimeRange
: Zum Ausführen vonApplyConsent
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 eineParameters
-Ressource (STU3, R4) zurück, die auflistet die folgenden Parameter:id
: steht für die Ressourcen-ID der Zustimmungs-RessourcelastUpdated
: gibt an, wann die Einwilligung zuletzt erzwungen wurdeversionId
: Versions-ID, die für die Erzwingung der Einwilligung verwendet wirdconsent-enforcement-status
steht für den Status der Einwilligungsdurchsetzung.
CheckPatientConsentEnforcementStatus
: gibt einenBundle
(STU3, R4) von derParameters
-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.
Status der Durchsetzung der Einwilligung
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.
Mit Einwilligungs-Kontext suchen
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.
FHIR-Ressourcen mit Einwilligungsbereich suchen
- Der Praxisexperte Jeffrey Brown (identifiziert durch
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) durchsucht mithilfe einer vertrauenswürdigen AnwendungApp/123
alle Beobachtungen mitstatus=final
. - Der Arzt Jeffrey Brown (identifiziert durch
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) durchsucht mit der AnwendungApp/123
alle Beobachtungen von Patient Darcy. - Der Arzt Jeffrey Brown (identifiziert durch
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) durchsucht mit der AnwendungApp/123
alle Beobachtungen von Patient Darcy zu Notfallbehandlungszwecken. - Der Praxisexperte Jeffrey Brown (identifiziert durch
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) sucht in Beobachtungen mitstatus=final
zu zwei Zwecken: Behandlung und Forschung - Der IT-Administrator eines Krankenhauses verwendet
bypass
, um nach allen Ärzten im Krankenhaus zu suchen.
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" }
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.
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" }
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.
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" }
Ressource mit Einwilligungskontext abrufen
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.
FHIR-Ressourcen mit Einwilligungsbereich abrufen
- Der Arzt Jeffrey Brown (identifiziert durch
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) liest mithilfe der AnwendungApp/123
die Hämoglobinmessung des Patienten (in diesem BeispielObservation/7473784b-46a8-470c-b9a6-fe38a01025aa
). - Der Arzt Jeffrey Brown (identifiziert durch
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) liest mithilfe der unbekannten AnwendungApp/unknown
die Hämoglobinmessung des Patienten (in diesem BeispielObservation/7473784b-46a8-470c-b9a6-fe38a01025aa
). - Der Arzt Jeffrey Brown (identifiziert durch
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
), der mit der AnwendungApp/golden
im Bereich der biomedizinischen Forschung arbeitet, liest das Geburtsdatum von Darcy (in diesem BeispielPatient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2
). - 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 BeispielObservation/7473784b-46a8-470c-b9a6-fe38a01025aa
).
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 } }
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" }
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" }
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 } }
Einwilligungsheader konfigurieren
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.
Autorisierungsserver für Einwilligungsbereiche konfigurieren
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:
SMARTProxy akzeptiert eine Anfrage von einem Client, die ein Einwilligungssensitives Token enthält.
SMARTProxy validiert das Einwilligungs-sensitive-Token über einen Ihrer JWT-Autorisierungsserver.
SMARTProxy liest die Bereiche aus dem Einwilligungs-sensitiven Token und übergibt sie über den HTTP-Header an die Cloud Healthcare API.
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:
Zum Lesen der FHIR-Daten in der Cloud Healthcare API kann das Dienstkonto mit umfassenden Lese- und Schreibberechtigungen konfiguriert sein. Weitere Informationen zu Berechtigungen finden Sie unter Zugriff auf Cloud Healthcare API-Ressourcen steuern. Siehe Allgemeine Best Practices zum Einrichten eines Proxys.
Cloud-Audit-Logs
Hauptkonto-E-Mail-Adresse ist mit dem Dienstkonto verknüpft.
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 istconsentConfig.accessEnforced
auffalse
festgelegt und erlaubt keine Einwilligungssensitiven Anfragen.emptyScope
: Beim FHIR-Speicher istconsentConfig.accessEnforced
auftrue
festgelegt, aber ein Einwilligungsbereich-Header wurde nicht angegeben. Aus diesem Grund wurde die Einwilligung nicht durchgesetzt.enforced
: Für den FHIR-Speicher wurdeconsentConfig.accessEnforced
auftrue
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 Einwilligungsbereichbtg
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 nurbypass
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 vombtg
, 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 |
|
Erzwingungsmodell |
|
X-Consent-Scope |
|
Unterstützte Methoden |
|
Leistung |
|
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
oderApplyAdminConsents
nicht parallel auf. Wir empfehlen, zuerst FHIR-Ressourcen zu importieren und dannApplyConsents
oderApplyAdminConsents
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 disjunktePatientScope
-Instanzen aufgerufen werden müssen, können sie parallel aufgerufen werden.ApplyAdminConsents
kann parallel zu einer beliebigen Anzahl vonApplyConsents
ausgeführt werden, aber nicht mit einem anderenApplyAdminConsents
.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:
Löschen Sie alle Einwilligung-Ressourcen, die zur Patientenressource gehören.
Rufen Sie
ApplyConsents
mit dem FilterPatientScope
auf.
Vorhandenen Speicher für Einwilligungs-Zugriff einrichten
So richten Sie einen vorhandenen Shop für den Einwilligungszugriff ein:
Nutzen Sie
UpdateFhirStore
um denConsentConfig
mit der Einwilligungs-Durchsetzungversion
alsV1
festzulegen und legen SieaccessEnforced
auftrue
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"
Einwilligungen von Patienten oder Administratorrichtlinien verarbeiten
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"
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 FeldConsentConfig
wird sowohl beim erstmaligen Erstellen eines FHIR-Speichers als auch beim Löschen des FeldsConsentConfig
gelöscht. Sobald das FeldConsentConfig
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
oderApplyAdminConsents
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 FilterTimeRange
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"