Auf dieser Seite wird beschrieben, wie Sie FHIR-Einwilligungsressourcen verwenden, um den Datenzugriff von FHIR-Speichern in der Cloud Healthcare API zu bestimmen.
Speicher mit aktivierter FHIR-Zugriffssteuerung konfigurieren
Führen Sie die folgenden Schritte aus, um einen FHIR-Speicher mit Erzwingung der Einwilligung 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 mitCreateFhirStore
oderUpdateFhirStore
festgelegt werden. Anschließend müssen SieApplyConsents
oderApplyAdminConsents
aufrufen, um die Version zu ändern.access_enforced
: Wenn dieser Wert auftrue
gesetzt ist, werden beim Zugriff auf FHIR-Ressourcen die bereitgestellten Einwilligungsheader mit den von Nutzern vorgegebenen Einwilligungsanweisungen 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 sind, 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
für die Einwilligungserzwingung als V1
festzulegen und für 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 einer Ressource zur Einwilligung definieren
Richtlinien werden durch eine Einwilligungsressource dargestellt. Der Zweck und die Verwendung der Ressourcenfelder werden in den Datenmodelldokumenten beschrieben.
Hier ist ein Beispiel für alle Ressourcen, die für dieses spezielle 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
- Patientenressource namens Darcy Smith
- Eine Beobachtungsressource, die die Hämoglobin-Messung von Darcy (LOINC
718-7
) zeigt, die vom Happy Hospital erfasst wurde - Eine Beobachtungsressource, die die Blutzuckermessung von Darcy (LOINC
15074-8
) zeigt. - Eine Einwilligung von Darcy, die Jeffrey Brown mithilfe der Anwendung
App/123
Zugriff auf ihre vom Happy Hospital erfassten Daten gewährt hat - Eine Einwilligung von Darcy, die Jeffrey Brown erlaubt, auf ihre Daten für Notfallbehandlung zuzugreifen (
ETREAT
) - Eine Einwilligung des Happy Hospital, die Jeffrey Brown den Zugriff auf alle Daten bei der biomedizinischen Forschung (
BIORCH
) mit dem Antrag „App/golden
“ gestattet
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" }
Im Folgenden finden Sie weitere Beispiele für die R4-Ressourcen zur Einwilligung, die zeigen, wie komplexe Richtlinien dargestellt werden können.
Beispiel für eine Richtlinie zur Einwilligung der 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, bei der ein f001
dem Arzt f002
die Berechtigung erteilt, eine regelmäßige Behandlung anzubieten, dargestellt durch TREAT
.
Der Arzt gehört zur Standortbestimmung iso3166-1/CA
. Diese Einwilligungsressource ermöglicht es dem Arzt, auf die Patientendaten zuzugreifen, sofern die Daten alle der folgenden Bedingungen erfüllen.
- Sie ist ein
Encounter
-Typ mit der IDEncounter/e001
. - Es stammt aus der Quelle
http://somesystem.example.org/foo
. - Er erfüllt mindestens eine der folgenden Bedingungen für das Tag (Ressourcen können getaggt werden, indem die Felder
system
undcode
von Meta.tags festgelegt 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 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 Einwilligungsressource für die Administratorrichtlinie dar, die einem Arzt die Berechtigung f002
mit dem Zweck der regelmäßigen Behandlung gewährt, dargestellt durch TREAT
. Der Arzt hat den Standort iso3166-1/CA
. Diese Ressource zur Einwilligung ermöglicht dem Arzt, auf die Patientendaten zuzugreifen, wenn die Daten alle der folgenden Bedingungen erfüllen:
- Sie ist ein
Encounter
-Typ mit der IDEncounter/e001
. - Es stammt aus der Quelle
http://somesystem.example.org/foo
. - Sie erfüllt mindestens eine der folgenden Bedingungen für das Tag:
- 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 kaskadierende Administratorrichtlinie
{ "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 Einwilligungsressource für Administratoren dar, die einem Arzt f002
die Berechtigung erteilt, eine reguläre Behandlung zur Verfügung zu stellen, dargestellt durch TREAT
. Fachkräfte kommen aus der Standortbestimmung iso3166-1/CA
. Diese Consent-Ressource ermöglicht dem Arzt, auf die Fachdaten von Patienten mit dem Tag employee
zuzugreifen. Alle Ressourcenkriterien gelten nur für die Ressourcen des Fachbereichs, d. h. die Patientenressource, da sie steuert, von welchen Ressourcen sie kaskadieren können.
Einwilligungen von Patienten oder Admin-Richtlinien erzwingen
Einwilligungen des Patienten bis 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. Sie können den Status des Vorgangs mit der [Operation `get`-Methode](/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/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 bis zum 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. Sie können den Status des Vorgangs mit der [Operation `get`-Methode](/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/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, dass der Server 1 Administratorrichtlinie erfolgreich verarbeitet und den einvernehmlichen Zugriff von 7 Ressourcen aktualisiert hat (1 Praktiker, 1 Patient, 2 Beobachtungen, 2 Einwilligungen der Patienten und 1 Administratorrichtlinie).
Die Erzwingung von Einwilligungen, die in einem FHIR-Speicher gespeichert sind, wird erst wirksam, wenn ApplyConsents
(für Patienteneinwilligungen) oder ApplyAdminConsents
(für Administratorrichtlinien und kaskadierende Richtlinien für Administratoren) 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 sie in das Erzwingungsmodell aufgenommen wird.
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 ist nur für Suchanfragen zu erwarten.
Wenn Sie die Erzwingung der Einwilligung für den FHIR-Speicher zum ersten Mal einrichten, sollten Sie warten, bis der lang andauernde Vorgang ApplyConsents
oder ApplyAdminConsents
abgeschlossen ist, bevor Sie Anfragen senden, bei denen die Einwilligung berücksichtigt wird.
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 in einem bestimmten Zeitraum aktualisiert werden
Zum Aufrufen von ApplyAdminConsents
: Sie müssen die vollständige Liste aller Richtlinien angeben, die Sie anwenden möchten (keine inkrementelle Liste). Daher wird bei einer leeren Liste die Erzwingung aller Administratorrichtlinien aus dem Store aufgehoben. Jede Richtlinie muss ein Ressourcenversionsname sein, wenn der FHIR-Speicher eine Versionsverwaltung hat, andernfalls ein Ressourcenname.
Mit operations.get
können Sie den ProgressCounter
des Vorgangs abrufen. Nach Abschluss wird eine ApplyConsentsResponse ausgegeben, 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 Einwilligungsressourcen, die beim Vorgang erfolgreich verarbeitet wurden. |
failure |
consentApplyFailure |
Die Anzahl der Einwilligungsressourcen, die nicht unterstützt werden oder ungültig sind. Sie können sich entweder Fehlerlogs in Cloud Logging ansehen oder, wenn validateOnly den Wert false hat, mit CheckConsentEnforcementStatus oder CheckPatientConsentEnforcementStatus den Status der Erzwingung der Einwilligung prüfen, um Fehlerdetails abzurufen. |
secondarySuccess |
affectedResources |
Wenn validateOnly den Wert false hat, stellt er die Anzahl der FHIR-Ressourcen dar, die aufgrund der Auswirkungen der Änderung der Einwilligung neu indexiert wurden. |
secondaryFailure |
failedResources |
Wenn validateOnly den Wert false hat, steht dies für die Anzahl der FHIR-Ressourcen, für die möglicherweise eine Einwilligungsänderung vorliegt, die aber nicht neu indexiert werden konnten. Das kann sich auf die Suche mit Einwilligungskontext auswirken, nicht aber auf andere Methoden. Die Fehlerdetails finden Sie in den Fehlerlogs in Cloud Logging. |
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
: Zeitpunkt, zu dem die Einwilligung zuletzt erzwungen wurdeversionId
: steht für die Versions-ID, die zur Durchsetzung der Einwilligung verwendet wirdconsent-enforcement-status
: stellt den Status der Durchsetzung der Einwilligung dar
CheckPatientConsentEnforcementStatus
: gibt einenBundle
(STU3, R4) von derParameters
-Ressource (STU3,R4) zurück, die aus dem Erzwingungsstatus aller Einwilligungen eines einzelnen Patienten besteht
Für die Administratorrichtlinie kann CheckConsentEnforcementStatus
nur zum Prüfen des Erzwingungsstatus einer einzelnen Richtlinie zur Einwilligungsverwaltung verwendet werden. Alternativ können Sie fhirStores.get
verwenden, um alle aktiven Administratorrichtlinien aufzurufen, die auf den Store angewendet werden.
Status der Durchsetzung der Einwilligung
consent-enforcement-status
kann folgende Werte haben:
OFF
: stellt den standardmäßigen Erzwingungsstatus einer neuen Einwilligungsressource dar, in der die Einwilligungsressource 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 Praktiker Jeffrey Brown (gekennzeichnet durch
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) sucht über eine vertrauenswürdige AnwendungApp/123
in allen Beobachtungen mitstatus=final
. - Der Mediziner Jeffrey Brown (gekennzeichnet durch
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) mit der AnwendungApp/123
durchsucht alle Beobachtungen von Patient Darcy. - Der Arzt Jeffrey Brown (gekennzeichnet durch
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) mit der AnwendungApp/123
durchsucht alle Beobachtungen von Patient Darcy für Notfallbehandlungszwecke. - Der Praxisexperte Jeffrey Brown (
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
identifiziert) sucht nach Beobachtungen mitstatus=final
für zwei Zwecke: Behandlung und Forschung - Ein IT-Administrator eines Krankenhauses sucht mit
bypass
nach allen Medizinern im Krankenhaus.
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 dem Einwilligungsszenario actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123
der Zugriff auf die Patient Darcy-Ressource verweigert wird (identifiziert durch Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2
), gibt der FHIR-Server keine Beobachtung vom Patienten zurück, so als ob der Patient nicht vorhanden wäre.
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 Praktiker 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 einer 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 (gekennzeichnet 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 Mediziner Jeffrey Brown (gekennzeichnet durch
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) verwendet die unbekannte AnwendungApp/unknown
und liest die Hämoglobinmessung des Patienten (in diesem BeispielObservation/7473784b-46a8-470c-b9a6-fe38a01025aa
). - Der Praktiker Jeffrey Brown (identifiziert durch
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
), der mit der AnwendungApp/golden
biomedizinische Forschungen durchführt, liest Darcy's BirthDate (in diesem BeispielPatient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2
). - Der Arzt Jeffrey Brown (durch
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
identifiziert) fordert mit dem „Break-the-Glass“-Protokoll den unbefugten Zugriff auf die Patientenakte im Notfall 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 dem Antragsteller die Einwilligung erteilt wurde, bezieht sich die Antwort auf 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 } }
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 Anforderers („App/unknown“) nicht durch die Einwilligung des Patienten 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 dem Anfragenden die Einwilligung erteilt wurde, handelt es sich bei der Antwort um 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" }
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
ist, überspringt der Server die Einwilligungsprüfungen. Die Antwort ist 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 } }
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.
Bei speziellen Bereichen kann eine FHIR-Anfrage btg
oder bypass
unterstützen.
HTTP-Header für vertrauenswürdige Anwendungen festlegen
Dieser Abschnitt ist nur erforderlich, wenn Sie einen vom Kunden gesteuerten Autorisierungsserver verwenden. In dieser Instanz müssen Sie außerdem 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 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 kann auch die Bereichseinträge btg
oder bypass
verwenden, die nach dem Audit überprüft werden.
Autorisierungsserver für Einwilligungsbereiche konfigurieren
Die Cloud Healthcare API bietet integrierte Unterstützung für die FHIR-Einwilligungserzwingung 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 Zugriffstoken, das in base64 codiert ist:
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, Consent-basierte Zugriffstokens als Teil des Verwaltungs- und Berechtigungsmodells der Cloud Healthcare API 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 in der Anfrage durchzusetzen. Die Cloud Healthcare API gibt dann über den SMARTProxy eine Antwort 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, nutzen 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 des 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 gestellt wird oder wenn sich die Zugriffserzwingung für die Ressourcen ändert.
Auf Audit-Logs zugreifen
Wenn Audit-Logs im FHIR-Speicher aktiviert sind, enthalten die in Cloud Logging verfügbaren Audit-Logs das Metadatenfeld consentMode
. 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. Infolgedessen wurde die Einhaltung von Einwilligungen nicht durchgesetzt.enforced
: Für den FHIR-Speicher istconsentConfig.accessEnforced
auftrue
festgelegt und der Header für den Einwilligungsbereich war vorhanden. Infolgedessen wurden die Einwilligungen im Hinblick auf das Ersuchen geprüft und durchgesetzt.btg
: Bei der FHIR-Anfrage wurde im Header des Einwilligungsbereichsbtg
angegeben. Daher wurden Einwilligungsprüfungen übersprungen. Diese Anfrage ist für Notfälle gedacht und unterliegt einer Prüfung nach der Prüfung.bypass
: Bei der FHIR-Anfrage wurde im Header des Einwilligungsbereichs nurbypass
angegeben. Daher wurden Einwilligungsprüfungen übersprungen. Diese Anfrage ist für die Verwendung von einem vertrauenswürdigen Workflow vorgesehen (z. B. einem Administrator oder einer vertrauenswürdigen Anwendung anstelle von Endnutzern), sodass sich dieses Audit-Log vombtg
unterscheidet, der 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 erfassen, warum eine Anfrage genehmigt oder abgelehnt wird.
Auf Audit-Logs zu Änderungen der Erzwingung zugreifen
Wenn sich die Ressource der Fachgruppe ändert (z. B. durch Entfernen des employee
-Tags eines Patienten), kann sich die Zugriffssteuerung für die geänderte Ressource und ihr Fach aufgrund der Admin-Kaskadierungsrichtlinie ändern. Dadurch wird die Neuindexierung aller Fachressourcen ausgelöst. Der Fortschritt der Neuindexierung jeder Bereichsaktualisierung kann in Cloud Logging mit dem Filter jsonPayload.@type="type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry"
verfolgt werden.
Beispiel für ein Log für die kaskadierende 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
ist die Anzahl der neu indexierten Fachressourcen und jsonPayload.lastUpdated
der Zeitstempel der Aktualisierung der Patientenressourcen. Wenn der Vorgang gerade gestartet wurde, 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 angezeigt. Für FHIR STU3 gelten jedoch dieselben Einschränkungen und Limits.
Typ | Einschränkungen und Limits |
---|---|
Einzelne Einwilligungsressource |
|
Durchsetzungsmodell |
|
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 Patienten- oder Einwilligungsressourcen 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
für disjunktePatientScope
aufgerufen werden müssen, können sie parallel aufgerufen werden.ApplyAdminConsents
kann parallel mit einer beliebigen Anzahl vonApplyConsents
ausgeführt werden, aber nicht mit einem weiterenApplyAdminConsents
.Beschränken Sie beim Einrichten des Proxys das IAM-Dienstkonto mit Leseberechtigungen, damit die Daten eines Patienten nicht in die Datensätze eines anderen Patienten geschrieben werden.
Verwenden Sie den Consent-Proxy nicht beim Erstellen oder Aktualisieren von Datensätzen.
Alle Schreibanfragen validieren, um unerwartete Änderungen an patientenübergreifenden Daten zu verhindern.
Wenn kaskadierende Einwilligungen erzwungen werden, müssen zuerst die Basisressourcen der Abteilungen importiert werden, gefolgt von den verbleibenden Bereichsressourcen. Alternativ können alle Fachressourcen 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:
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
Führen Sie die folgenden Schritte aus, um einen vorhandenen Speicher für den Zugriff auf die Einwilligung einzurichten:
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"
Patienteneinwilligungen oder Admin-Richtlinien verarbeiten
ApplyConsents
für Einwilligungen von Patienten
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 Richtlinien für Administratoren.
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"
Häufigkeit der Ausführung von „ApplyConsents“ oder „ApplyAdminConsents“
Wenn das Feld
ConsentConfig
nicht festgelegt ist, wird das FeldConsentConfig
sowohl beim ersten 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, ändert sich das Erzwingungsmodell, wenn eine Einwilligungsressource erstellt, aktualisiert oder gelöscht wird. In solchen Fällen müssen Sie
ApplyConsents
oderApplyAdminConsents
aufrufen, damit diese Ä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 eine sofortige Aktualisierung nicht entscheidend ist. Mit der folgenden Anfrage wird beispielsweise die Erzwingung für Einwilligungsänderungen zwischen 00:00 Uhr 2022-09-20 und 00:00 Uhr 2022-09-21 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"