Auf dieser Seite wird beschrieben, wie Sie FHIR-Einwilligungsressourcen 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 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, für welche Version die Erzwingung der Einwilligung verwendet wird den FHIR-Speicher. Dieser Wert kann nur einmal festgelegt werdenCreateFhirStore
oderUpdateFhirStore
Nach der Einrichtung müssen SieApplyConsents
oderApplyAdminConsents
um die Version zu ändern.access_enforced
: Wenn dieser Wert auftrue
gesetzt ist, wird beim Zugriff auf FHIR-Ressourcen der Wert Die bereitgestellten Einwilligungskopfzeilen werden mit den gegebenen Einwilligungsanweisungen abgeglichen von Verbraucherinnen und Verbrauchern.consent_header_handling
: WennPERMIT_EMPTY_SCOPE
(Standardeinstellung) festgelegt ist, lässt der Server Anfragen zu ohne (oder leerer)X-Consent-Scope
-Kopfzeile. WennREQUIRED_ON_READ
festgelegt ist undaccess_enforced
=true
, lehnt der Server alle Anfragen ohne (oder leer)X-Consent-Scope
-Kopfzeile.
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 ein Geschäft haben, verwenden Sie UpdateFhirStore
, um das
ConsentConfig
mit der Einwilligungspflicht version
als
V1
und setze accessEnforced
auf true
.
curl -X PATCH \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json" \ --data "{ 'consentConfig': { 'version': 'V1', 'accessEnforced': true } }" "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?update_mask=consentConfig"
Richtlinien mithilfe der Consent-Ressource definieren
Richtlinien werden in der Einwilligungsressource dargestellt. Die Ressourcenfelder Zweck und Verwendung 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
Im folgenden Beispiel sehen Sie, wie ein [FHIR-Bundle](/healthcare-api/docs/how-tos/fhir-bundles) zum Ausfüllen der folgenden Ressourcen:
- Eine Fachkraft-ressource mit dem Namen Jeffrey Brown
- Eine Patientenressource namens Darcy Smith
- Beobachtungsressource zur Darstellung der Hämoglobinmessung von Darcy
(LOINC
718-7
), die vom Fröhliches Krankenhaus - Eine Beobachtungsressource, die die Blutzuckermessung von Darcy zeigt
(LOINC
15074-8
). - Einwilligung von Darcy zur Genehmigung von Jeffrey Brown unter Verwendung des Antrags
App/123
, um auf ihre vom Happy Hospital erhobenen Daten zuzugreifen - Einwilligung von Darcy, um Jeffrey Brown Zugriff auf ihre Daten für
Notfallbehandlung
(
ETREAT
) - Einwilligung des Happy Hospital, Jeffrey Brown Zugriff auf alle Daten zu gewähren
in der biomedizinischen Forschung (
BIORCH
) mit der AnwendungApp/golden
cat > bundle.json << 'EOF' { "resourceType": "Bundle", "type": "transaction", "entry": [ { "request": {"method": "PUT", "url": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"}, "resource": { "active": true, "birthDate": "1970-05-23", "gender": "male", "id": "12942879-f89f-41ae-aa80-0b911b649833", "name": [{ "family": "Brown", "given": ["Jeffrey"], "use": "official" }], "resourceType": "Practitioner" } }, { "request": {"method": "PUT", "url": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"}, "resource": { "active": true, "birthDate": "1990-01-01", "gender": "female", "id": "3c6aa096-c054-4c22-b2b4-1e4a4d203de2", "name": [{ "family": "Smith", "given": ["Darcy"], "use": "official" }], "meta": { "tag": [{ "system": "http://terminology.hl7.org/CodeSystem/common-tags", "code": "employee" }] }, "resourceType": "Patient" } }, { "request": {"method": "PUT", "url": "Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"}, "resource": { "id": "7473784b-46a8-470c-b9a6-fe38a01025aa", "meta": {"source": "http://example.com/HappyHospital"}, "code": { "coding": [{ "code": "718-7", "system": "http://loinc.org", "display": "Hemoglobin [Mass/volume] in Blood" }] }, "effectivePeriod": {"start": "2021-12-10T05:30:10+01:00"}, "issued": "2021-12-10T13:30:10+01:00", "resourceType": "Observation", "status": "final", "subject": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"}, "valueQuantity": { "code": "g/dL", "system": "http://unitsofmeasure.org", "unit": "g/dl", "value": 7.2 } } }, { "request": {"method": "PUT", "url": "Observation/68583624-9921-4158-8754-2a306c689abd"}, "resource": { "id": "68583624-9921-4158-8754-2a306c689abd", "code": { "coding": [{ "code": "15074-8", "system": "http://loinc.org", "display": "Glucose [Moles/volume] in Blood" }] }, "effectivePeriod": {"start": "2021-12-01T05:30:10+01:00"}, "issued": "2021-12-01T13:30:10+01:00", "resourceType": "Observation", "status": "final", "subject": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"}, "valueQuantity": { "code": "mmol/L", "system": "http://unitsofmeasure.org", "unit": "mmol/l", "value": 6.3 } } }, { "request": {"method": "PUT", "url": "Consent/10998b60-a252-405f-aa47-0702554ddc8e"}, "resource": { "category": [{ "coding": [{ "code": "59284-0", "system": "http://terminology.hl7.org/CodeSystem/consentcategorycodes" }] }], "id": "10998b60-a252-405f-aa47-0702554ddc8e", "patient": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"}, "policyRule": { "coding": [{ "code": "OPTIN", "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode" }] }, "provision": { "actor": [ { "reference": {"reference": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"}, "role": { "coding": [{ "code": "GRANTEE", "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode" }] } } ], "extension": [ { "url": "https://g.co/fhir/medicalrecords/Environment", "valueCodeableConcept": { "coding": [{ "code": "123", "system": "App" }] } }, { "url": "https://g.co/fhir/medicalrecords/DataSource", "valueUri": "http://example.com/HappyHospital" } ], "type": "permit" }, "resourceType": "Consent", "scope": { "coding": [{ "code": "patient-privacy", "system": "http://terminology.hl7.org/CodeSystem/consentscope" }] }, "status": "active" } }, { "request": {"method": "PUT", "url": "Consent/73c54e8d-2789-403b-9dee-13085c5d5e34"}, "resource": { "category": [{ "coding": [{ "code": "59284-0", "system": "http://terminology.hl7.org/CodeSystem/consentcategorycodes" }] }], "id": "73c54e8d-2789-403b-9dee-13085c5d5e34", "patient": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"}, "policyRule": { "coding": [{ "code": "OPTIN", "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode" }] }, "provision": { "actor": [ { "reference": {"reference": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"}, "role": { "coding": [{ "code": "GRANTEE", "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode" }] } } ], "purpose": [{ "code": "ETREAT", "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason" }], "type": "permit" }, "resourceType": "Consent", "scope": { "coding": [{ "code": "patient-privacy", "system": "http://terminology.hl7.org/CodeSystem/consentscope" }] }, "status": "active" } }, { "request": {"method": "PUT", "url": "Consent/5c8e3f8a-9fd5-480d-a08e-f29b89feccde"}, "resource": { "category": [{ "coding": [{ "code": "57017-6", "system": "http://loinc.org" }] }], "id": "5c8e3f8a-9fd5-480d-a08e-f29b89feccde", "patient": {}, "extension": [{ "url": "https://g.co/fhir/medicalrecords/ConsentAdminPolicy" }], "policyRule": { "coding": [{ "code": "OPTIN", "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode" }] }, "provision": { "actor": [ { "reference": {"reference": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"}, "role": { "coding": [{ "code": "GRANTEE", "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode" }] } } ], "purpose": [{ "code": "BIORCH", "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason" }], "extension": [ { "url": "https://g.co/fhir/medicalrecords/Environment", "valueCodeableConcept": { "coding": [{ "code": "golden", "system": "App" }] } } ], "type": "permit" }, "resourceType": "Consent", "scope": {}, "status": "active" } } ] } EOF curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/fhir+json; charset=utf-8" \ --data @bundle.json \ "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir"
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 R4. Einwilligungsressource, 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, bei der ein Patient
f001
erteilt einem Arzt f002
die Berechtigung mit folgenden Berechtigungen:
den Zweck der regulären Behandlung gemäß TREAT
.
Der Arzt kommt am Standort iso3166-1/CA
. Dieses
Die 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
. - 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
) - Hat 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 eine Administratorrichtlinie dar, die die Berechtigung erteilt
an einen Arzt f002
mit dem Zweck, regelmäßig
Testgruppe durch TREAT
. Sie kommt aus der
Standortbestimmung iso3166-1/CA
. Diese Consent-Ressource ermöglicht das
auf die Patientendaten zugreifen, sofern diese allen
folgende Bedingungen:
- 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
) - Hat 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
Genehmigung an einen Arzt f002
mit dem Zweck,
Normalbehandlung durch TREAT
. Die Fachkraft stammt aus
die Standortbestimmung iso3166-1/CA
. Diese Consent-Ressource ermöglicht das
Arzt, der auf die Daten der Patienten mit dem Tag zugreift
employee
Alle Ressourcenkriterien
gilt nur für die Ressourcen in den Fachbereichen, d. h. für die Patientenressource,
steuert, von welchen Ressourcen
kaskadiert wird.
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 den [Vorgangsmethode „get“](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get):
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
Wenn der Vorgang abgeschlossen ist, gibt der Server eine Antwort mit dem Status den Vorgang im JSON-Format:
{ "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 den [Vorgangsmethode „get“](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get):
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
Wenn der Vorgang abgeschlossen ist, gibt der Server eine Antwort mit dem Status den Vorgang im JSON-Format:
{ "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 hat angegeben, dass der Server 1 Administratorrichtlinie erfolgreich verarbeitet hat und aktualisiert den einvernehmlichen Zugriff auf 7 Ressourcen (1 Arzt, 1 Patient, 2 Beobachtungen, 2 Einwilligungen der Patienten und 1 Administratorrichtlinie).
Die Erzwingung für Einwilligungen, die in einem FHIR-Speicher gespeichert sind, tritt nicht in Kraft
bis ApplyConsents
(für Patienteneinwilligungen) oder ApplyAdminConsents
(für Administratoren)
Richtlinien und Administrator-Cascading-Richtlinien) wird aufgerufen und erfolgreich abgeschlossen. Wenn
Sie Einwilligungen hinzufügen, ändern oder entfernen, nachdem Sie ApplyConsents
ausgeführt haben oder
ApplyAdminConsents
ausführen, müssen Sie ihn noch einmal ausführen, damit diese Einwilligungen in
durchsetzen.
FHIR-Ressourcen werden asynchron indexiert, daher kann es zu leichten Verzögerungen kommen.
zwischen dem Abschluss von ApplyConsents
oder ApplyAdminConsents
und dem
wird das Durchsetzungsmodell in den Suchergebnissen widergespiegelt. Diese Verzögerung beträgt nur
zu erwarten ist.
Wenn Sie zum ersten Mal die Erzwingung der Einwilligung für die FHIR einrichten
speichern, warten Sie, bis die ApplyConsents
oder ApplyAdminConsents
abgeschlossen sein, bevor Anfragen auf Einwilligungsbasis gestellt werden.
Um ApplyConsents
für eine Untergruppe von Patienten aufzurufen, können Sie Folgendes verwenden:
Filter:
PatientScope
: umApplyConsents
für eine Liste von Patienten-IDs mit bis zu 10.000 Patienten auszuführenTimeRange
: umApplyConsent
für eine Liste von Patientenressourcen-IDs auszuführen, deren Einwilligung Ressourcen innerhalb eines bestimmten Zeitraums aktualisiert werden
Wenn Sie ApplyAdminConsents
anrufen möchten, müssen Sie uns die vollständige Liste aller
Richtlinien, die Sie anwenden möchten (keine inkrementelle Liste). Daher wird eine leere
die Erzwingung aller Administratorrichtlinien für den Store aufgehoben. Jede Richtlinie
muss ein Ressourcenversionsname sein,
FHIR-Speicher
ist die Versionsverwaltung, andernfalls ein Ressourcenname.
Sie können operations.get
verwenden
zum Abrufen von ProgressCounter
des Vorgangs. Nach Abschluss gibt es eine ApplyConsentsResponse, die im
Operation.response
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 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
Für die Administratorrichtlinie kann CheckConsentEnforcementStatus
nur zur Überprüfung verwendet werden
Erzwingungsstatus einer einzelnen Administratorrichtlinie zur Einwilligung der Nutzer in der EU Alternativ können Sie
kann fhirStores.get
verwenden
um alle aktiven Administratorrichtlinien zu sehen, 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 Einwilligungsressource in denen die Consent-Ressource noch nie zuvor verarbeitet.ENFORCEABLE
: der Status, in dem die Einwilligungs-Ressource erfolgreich verarbeitet wurde.INACTIVE
: ein inaktiver Status, in dem die Einwilligungs-Ressource ignoriert wird.UNSUPPORTED
: Status einer Einwilligungsressource, die möglicherweise FHIR entspricht Spezifikationen enthalten, ist jedoch nicht durchsetzbar. 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 Suchvorgänge nach FHIR-Ressourcen in einer 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
- Praxisexperte Jeffrey Brown (identifiziert von
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) Mit einer vertrauenswürdigen Anwendung durchsuchtApp/123
alle Beobachtungen mitstatus=final
. - Praxisexperte Jeffrey Brown (identifiziert von
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) mit der AnwendungApp/123
wird in allen Beobachtungen von Patient Darcy durchsucht. - Praxisexperte Jeffrey Brown (identifiziert von
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) Mit der AnwendungApp/123
wird in allen Beobachtungen von Patient Darcy zur Notfallbehandlung. - Praxisexperte Jeffrey Brown (identifiziert von
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) sucht Beobachtungen mitstatus=final
für zwei Zwecke: Behandlung und Forschung - Der IT-Administrator eines Krankenhauses sucht mithilfe von
bypass
nach allen Ärzte 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 das Einwilligungsszenario
actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123
der Zugriff auf die Patient Darcy-Ressource verweigert (identifiziert durch
Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2
) den FHIR-Server
gibt keine Beobachtung vom Patienten zurück, als ob der Patient nicht existiert.
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 eine unnötige aus dem „X-Consent-Scope“ in der Anfrage.
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. Ich
sollte eine JSON-Antwort ähnlich der folgenden 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 von FHIR-Ressourcen in einer 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
- Praxisexperte Jeffrey Brown (identifiziert von
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) liest mit der AnwendungApp/123
die Hämoglobinmessung des Patienten (in diesem BeispielObservation/7473784b-46a8-470c-b9a6-fe38a01025aa
). - Praxisexperte Jeffrey Brown (identifiziert von
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) mit einer unbekannten Anwendung liestApp/unknown
die Hämoglobinmessung des Patienten (in diesem Beispiel:Observation/7473784b-46a8-470c-b9a6-fe38a01025aa
). - Praxisexperte Jeffrey Brown (identifiziert von
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) die biomedizinische Forschung mit der AnwendungApp/golden
durchführen, liest das Geburtsdatum von Darcy (in diesem Beispiel:Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2
). - Praxisexperte Jeffrey Brown (identifiziert von
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) fordert unbefugten Notfallzugriff auf Patientenakten mithilfe des Break-the-Glasses an Protokoll. (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 Antragsteller seine Einwilligung erteilt hat, enthält die Antwort den Inhalt der Beobachtungsressource.
{ "code": { "coding": [ { "code": "718-7", "display": "Hemoglobin [Mass/volume] in Blood", "system": "http://loinc.org" } ] }, "effectivePeriod": { "start": "2021-12-10T05:30:10+01:00" }, "id": "7473784b-46a8-470c-b9a6-fe38a01025aa", "issued": "2021-12-10T13:30:10+01:00", "meta": { "lastUpdated": "2022-09-01T17:31:40.423469+00:00", "source": "http://example.com/HappyHospital", "versionId": "VERSION_ID" }, "resourceType": "Observation", "status": "final", "subject": { "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2" }, "valueQuantity": { "code": "g/dL", "system": "http://unitsofmeasure.org", "unit": "g/dl", "value": 7.2 } }
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“) nicht Zustimmung des Patienten erteilt wurde, 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 Antragsteller seine Einwilligung erteilt hat, enthält die Antwort den Inhalt der Patientenressource.
{ "active": true, "birthDate": "1990-01-01", "gender": "female", "id": "3c6aa096-c054-4c22-b2b4-1e4a4d203de2", "meta": { "lastUpdated": "2022-09-01T17:31:40.423469+00:00", "versionId": "VERSION_ID", "tag": [{ "system": "http://terminology.hl7.org/CodeSystem/common-tags", "code": "employee" }] }, "name": [ { "family": "Smith", "given": [ "Darcy" ], "use": "official" } ], "resourceType": "Patient" }
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 für die Einwilligung btg
ist, wird die Einwilligung auf dem Server übersprungen.
Überprü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 der
HTTP-Header „X-Consent-Scope
“ 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 btg
unterstützen, oder
bypass
.
HTTP-Header für vertrauenswürdige Anwendungen festlegen
Dieser Abschnitt ist nur erforderlich, wenn Sie eine vom Kunden kontrollierte Autorisierungsserver. In diesem Fall müssen Sie auch einen SMART-Proxy oder ähnlichen Proxy.
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 ebenfalls
die Bereichseinträge btg
oder bypass
, die den
Überprüfungen nach der Prüfung.
Autorisierungsserver für Einwilligungsbereiche konfigurieren
Die Cloud Healthcare API bietet integrierte Unterstützung für FHIR-Einwilligung basierend auf den eingegebenen Einwilligungsumfängen durch. 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 Folgendes enthält: Nutzlast:
{
"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 Folgendes bereitstellt: Funktionen:
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 Folgendes: Einwilligungsbasierte Zugriffstokens als Teil der Cloud Healthcare API-Verwaltung und Berechtigungsmodell.
Unterstützt auch Tokenfeatures für SMART on FHIR-Unterstützung.
Wenn Sie eine Anfrage zum Abrufen von Daten aus der Cloud Healthcare API stellen über SMARTProxy 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 für Einwilligungsanweisungen für die Anfrage erzwingen Mit der Cloud Healthcare API gibt 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 Kunden denselben Proxy verwenden, dann nutzen die Clients dasselbe Dienstkonto. Verwenden Sie Vorsicht, wenn Sie ein Dienstkonto für mehrere Clients in folgenden Fällen freigeben: Gründe:
Zum Lesen der FHIR-Daten in der Cloud Healthcare API kann das Dienstkonto mit umfassenden Lese- und Schreibberechtigungen konfiguriert sein. Weitere Informationen 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 die Änderungen bei der Zugriffserzwingung.
Auf Audit-Logs zugreifen
Wenn Audit-Logs
aktiviert
Im FHIR-Speicher wird ein consentMode
-Metadatenfeld im Audit-
Logs, die in Cloud Logging verfügbar sind. Das consentMode
kann eines der folgenden Elemente enthalten:
Werte:
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 erteilt die Einwilligung nicht durchgesetzt wurden.enforced
: Im FHIR-Speicher istconsentConfig.accessEnforced
auftrue
festgelegt. und die Überschrift für den Einwilligungsbereich war vorhanden. Deshalb wurden Einwilligungen geprüft und erzwungen.btg
: Bei der FHIR-Anfrage war im Header für den Einwilligungsbereichbtg
angegeben. Als wurden Einwilligungsprüfungen übersprungen. Diese Anfrage ist für die und nur nach einer Prüfung geprüft werden.bypass
: Für die FHIR-Anfrage waren im Einwilligungsbereich nurbypass
angegeben Header. Daher wurden Einwilligungsprüfungen übersprungen. Diese Anfrage ist für von einem vertrauenswürdigen Workflow (z. B. einem Administrator oder einem vertrauenswürdigen Anwendung anstelle von Endnutzern), sodass sich dieses Audit-Log Denbtg
, der für Data-Governance-Prüfungen verwendet wird.
Optional kannst du access_determination_log_config
auf VERBOSE
setzen, um mehr Informationen zu erfassen
warum ein Antrag genehmigt oder abgelehnt wurde.
Audit-Logs zur Zugriffserzwingung für Änderungen
Wenn sich die Ressourcen des Fachbereichs ändern (z. B. beim Entfernen des
employee
-Tag): Die Zugriffssteuerung für die geänderte Ressource und ihr Abteil.
kann sich aufgrund der Richtlinien für die Kaskadierung des Administrators ändern. Dadurch wird eine Neuindexierung auf allen
die entsprechenden Ressourcen. Der Fortschritt bei der Neuindexierung der einzelnen Abteilungen
Ressourcenaktualisierungen können in Cloud Logging mit dem Filter nachverfolgt werden.
jsonPayload.@type="type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry"
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. Für FHIR STU3 gelten jedoch dieselben Einschränkungen und Limits.
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
Das sollten Sie nicht tun: Importieren FHIR-Ressourcen und rufen Sie parallel
ApplyConsents
oderApplyAdminConsents
auf. Wir empfehlen, zuerst die FHIR-Ressourcen zu importieren und dannApplyConsents
oderApplyAdminConsents
. Wenn die Ressourcen, keine Ressourcen für Patient oder Consent enthalten, Erzwingungsmodell nicht Verarbeitung von Einwilligungen oder Administratorrichtlinien ist nicht notwendig.Das sollten Sie nicht tun: Benutzerdefinierte Suchanfragen erstellen und gleichzeitig
ApplyConsents
aufrufen. Wir empfehlen, diese Dinge nacheinander auszuführen.Wenn Ihre Workflows mehrere
ApplyConsents
-Aufrufe bei disjunkten Verbindungen erfordernPatientScope
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 ein mit Leseberechtigungen, um zu vermeiden, dass die Daten eines Patienten in einen anderen geschrieben werden. Patientenakten.
Verwenden Sie zum Erstellen oder Aktualisieren von Einträgen nicht den Consent Proxy.
Validieren Sie alle Schreibanfragen, um unerwartete Änderungen von patientenübergreifenden Daten.
Wenn kaskadierende Einwilligungen erzwungen werden, müssen die Ressourcen der Kompartimentsbasis importiert und dann die verbleibenden Ressourcen für die Abteilungen. Alternativ können alle Ressourcen in einem einzelnen Bundle können zusammengefasst und aufgenommen werden. mit
fhir.executeBundle
.
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 konfiguriert ist: Das Feld „ConsentConfig
“ ist nicht festgelegt. sowohl beim erstmaligen Erstellen eines FHIR-Speichers als auch beim ersten Erstellen desConsentConfig
-Felds ist 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: Einwilligungsressource erstellt, aktualisiert oder gelöscht wird, das Erzwingungsmodell Änderungen. Rufen Sie in solchen Fällen
ApplyConsents
auf oderApplyAdminConsents
, 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 Patientinnen und Patienten.Sie können
ApplyConsents
auch regelmäßig mit demTimeRange
ausführen. aus. Dieser Filter ist nützlich, wenn die sofortige Aktualisierung nicht entscheidend ist. Mit der folgenden Anfrage wird z. B. die Erzwingung bei Einwilligungsänderungen aktualisiert zwischen dem 20.09.2022 (UTC 0:00) und dem 21.09.2022 (00:00 Uhr UTC)curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json" \ --data "{ 'validateOnly': false, 'timeRange': { 'start': '2022-09-20T00:00:00Z', 'end': '2022-09-21T00:00:00Z', } }" \ "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"