Halaman ini menjelaskan cara menggunakan resource Izin FHIR untuk menentukan akses data penyimpanan FHIR di Cloud Healthcare API.
Mengonfigurasi penyimpanan yang mengaktifkan kontrol akses FHIR
Untuk mengonfigurasi penyimpanan FHIR dengan penerapan izin, selesaikan langkah-langkah berikut:
Buat penyimpanan FHIR jika Anda belum memilikinya.
Tetapkan parameter
ConsentConfig
penyimpanan FHIR berikut untuk mengaktifkan penerapan izin:version
: Menentukan versi penerapan izin yang digunakan untuk FHIR store. Nilai ini hanya dapat ditetapkan satu kali olehCreateFhirStore
atauUpdateFhirStore
. Setelah ditetapkan, Anda harus memanggilApplyConsents
atauApplyAdminConsents
untuk mengubah versi.access_enforced
: Jika ditetapkan ketrue
, saat mengakses resource FHIR, header izin yang diberikan akan diverifikasi berdasarkan perintah izin yang diberikan oleh konsumen.consent_header_handling
: Jika ditetapkan kePERMIT_EMPTY_SCOPE
(default), server akan mengizinkan permintaan tanpa headerX-Consent-Scope
(atau kosong). Jika ditetapkan keREQUIRED_ON_READ
danaccess_enforced
=true
, server akan menolak semua permintaan tanpa headerX-Consent-Scope
(atau kosong).
Menyiapkan penyimpanan FHIR baru dengan ConsentConfig
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"
Anda akan melihat respons JSON seperti berikut:
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID", "version": "R4", "enableUpdateCreate": true, "consentConfig": { "version": "V1" } }
Jika Anda sudah memiliki toko, gunakan UpdateFhirStore
untuk menetapkan
ConsentConfig
dengan penerapan izin version
sebagai
V1
dan tetapkan accessEnforced
ke 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"
Menentukan Kebijakan Menggunakan Resource Izin
Kebijakan direpresentasikan melalui Resource izin. Tujuan dan penggunaan kolom resource dijelaskan dalam Dokumen Model Data.
Berikut adalah contoh semua resource yang dapat dibuat untuk contoh khusus ini.
Membuat resource FHIR
Contoh berikut menunjukkan cara menjalankan [paket FHIR](/healthcare-api/docs/how-tos/fhir-bundles) untuk mengisi resource berikut:
- Referensi Praktisi dengan nama Jeffrey Brown
- Resource Pasien dengan nama Darcy Smith
- Resource Pengamatan yang menunjukkan pengukuran hemoglobin Darcy
(LOINC
718-7
) yang dikumpulkan oleh Rumah Sakit Happy - Resource Pengamatan yang menampilkan pengukuran glukosa Darcy
(LOINC
15074-8
). - Izin dari Darcy untuk mengizinkan Jeffrey Brown menggunakan aplikasi
App/123
untuk mengakses datanya yang dikumpulkan oleh Rumah Sakit Happy - Izin dari Darcy untuk mengizinkan Jeffrey Brown mengakses datanya untuk
perawatan darurat
(
ETREAT
) - Izin dari Rumah Sakit Happy untuk mengizinkan Jeffrey Brown mengakses semua data
saat melakukan riset biomedis (
BIORCH
) dengan aplikasiApp/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"
Anda akan melihat respons JSON seperti berikut:
{ "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" }
Berikut adalah contoh lain dari Resource izin R4 yang menunjukkan cara kebijakan yang kompleks dapat direpresentasikan.
Contoh perintah izin pasien
{ "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" } ] } }
Contoh sebelumnya mewakili resource Izin pasien tempat pasien
f001
memberikan izin kepada praktisi f002
dengan
tujuan memberikan perawatan rutin yang diwakili oleh TREAT
.
Praktisi berasal dari geolokasi iso3166-1/CA
. Resource
Izin ini mengizinkan praktisi mengakses data pasien jika
data memenuhi semua kondisi berikut.
- Ini adalah jenis
Encounter
dengan IDEncounter/e001
. - Data ini berasal dari sumber
http://somesystem.example.org/foo
. - Memenuhi setidaknya salah satu kondisi berikut pada tag (resource dapat diberi tag dengan menetapkan kolom
system
dancode
Meta.tag): - Memiliki tag (
system
=http://terminology.hl7.org/CodeSystem/common-tags
dancode
=actionable
) - Memiliki kedua tag (
system
=http://example.com/custom-tags
dancode
=archived
) dan (system
=http://example.com/custom-tags
dancode
=insensitive
) - Memiliki setidaknya salah satu label keamanan berikut
system
=http://terminology.hl7.org/CodeSystem/v3-Confidentiality
dancode
adalah salah satu dariR
,N
,M
,L
,U
.system
=http://terminology.hl7.org/CodeSystem/v3-ActCode
dancode
=PSY
.
Contoh perintah kebijakan admin
{ "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" } ] } }
Contoh sebelumnya mewakili resource Izin kebijakan admin yang memberikan izin
kepada praktisi f002
dengan tujuan memberikan perlakuan
rutin yang diwakili oleh TREAT
. Praktisi berasal dari
geolokasi iso3166-1/CA
. Referensi Izin ini mengizinkan
praktikus mengakses data pasien jika data tersebut memenuhi semua
kondisi berikut:
- Ini adalah jenis
Encounter
dengan IDEncounter/e001
. - Data ini berasal dari sumber
http://somesystem.example.org/foo
. - Memenuhi setidaknya salah satu kondisi berikut pada tag:
- Memiliki tag (
system
=http://terminology.hl7.org/CodeSystem/common-tags
dancode
=actionable
) - Memiliki kedua tag (
system
=http://example.com/custom-tags
dancode
=archived
) dan (system
=http://example.com/custom-tags
dancode
=insensitive
) - Memiliki setidaknya salah satu label keamanan berikut
system
=http://terminology.hl7.org/CodeSystem/v3-Confidentiality
dancode
adalah salah satu dariR
,N
,M
,L
,U
.system
=http://terminology.hl7.org/CodeSystem/v3-ActCode
dancode
=PSY
.
Contoh perintah kebijakan cascading admin
{ "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" } } ] } }
Contoh sebelumnya mewakili resource Izin kebijakan cascading admin yang memberikan
izin kepada praktisi f002
dengan tujuan memberikan
pengobatan rutin yang diwakili oleh TREAT
. Praktisi berasal dari
geolokasi iso3166-1/CA
. Referensi Izin ini memungkinkan
praktikus mengakses data kompartemen pasien dengan tag
employee
. Semua kriteria resource
hanya berlaku untuk resource dasar kompartemen, yang berarti resource Pasien, karena
mengontrol resource yang akan di-cascade.
Menerapkan izin pasien atau kebijakan admin
Terapkan izin pasien paling lambat ApplyConsents
curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json" \ --data "{'validateOnly': false}" \ "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"
Anda akan melihat respons JSON seperti berikut:
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" }
Respons berisi nama operasi. Untuk melacak status operasi, Anda dapat menggunakan [Metode `get` Operasi](/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"
Saat operasi selesai, server akan menampilkan respons dengan status operasi dalam format JSON:
{ "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" } }
Respons ini menunjukkan bahwa server berhasil memproses 2 izin dan memperbarui akses konsensual dari 5 resource (1 Pasien, 2 Izin, 2 Pengamatan).
Menerapkan kebijakan admin oleh ApplyAdminConsents
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"
Anda akan melihat respons JSON seperti berikut:
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" }
Respons berisi nama operasi. Untuk melacak status operasi, Anda dapat menggunakan [Metode `get` Operasi](/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"
Saat operasi selesai, server akan menampilkan respons dengan status operasi dalam format JSON:
{ "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" } }
Respons ini menunjukkan bahwa server berhasil memproses 1 kebijakan admin dan memperbarui akses konsensual dari 7 resource (1 Praktisi, 1 Pasien, 2 Pengamatan, 2 Izin pasien, dan 1 kebijakan admin).
Penegakan izin yang disimpan dalam penyimpanan FHIR tidak akan berlaku
hingga ApplyConsents
(untuk izin pasien) atau ApplyAdminConsents
(untuk kebijakan admin
dan kebijakan cascading admin) dipanggil dan berhasil diselesaikan. Jika
menambahkan, mengubah, atau menghapus izin setelah menjalankan ApplyConsents
atau
ApplyAdminConsents
, Anda harus menjalankannya lagi agar izin tersebut disertakan dalam
model penegakan.
Resource FHIR diindeks secara asinkron, sehingga mungkin ada sedikit penundaan
antara waktu saat ApplyConsents
atau ApplyAdminConsents
selesai dan saat
model penegakan diterapkan dalam hasil penelusuran. Penundaan ini hanya
diperkirakan untuk permintaan penelusuran.
Jika ini adalah pertama kalinya Anda menyiapkan penerapan izin di penyimpanan FHIR, tunggu operasi ApplyConsents
atau ApplyAdminConsents
yang berjalan lama selesai sebelum membuat permintaan yang mempertimbangkan izin.
Untuk memanggil ApplyConsents
pada sebagian pasien, Anda dapat menggunakan filter
berikut:
PatientScope
: untuk menjalankanApplyConsents
pada daftar ID pasien dengan maksimal 10.000 pasienTimeRange
: untuk menjalankanApplyConsent
pada daftar ID resource Pasien yang resource Izinnya diperbarui selama rentang waktu tertentu
Untuk memanggil ApplyAdminConsents
: Anda harus memberikan daftar lengkap semua
kebijakan yang ingin diterapkan (bukan daftar inkremental). Akibatnya, daftar
kosong akan membatalkan penegakan dari semua kebijakan admin dari Play Store. Setiap kebijakan
harus berupa nama versi resource jika
penyimpanan FHIR
memiliki versi, dan nama resource jika tidak.
Anda dapat menggunakan operations.get
untuk mengambil ProgressCounter
operasi. Setelah selesai, akan ada ApplyConsentsResponse yang disertakan dalam
Operation.response
.
Penghitung di ProgressCounter
dan ApplyConsentsResponse
atau
ApplyAdminConsentsResponse
dijelaskan dalam tabel berikut.
ProgressCounter |
ApplyConsentsResponse atau ApplyAdminConsentsResponse |
Deskripsi |
---|---|---|
success |
consentApplySuccess |
Jumlah resource Izin yang berhasil diproses oleh operasi. |
failure |
consentApplyFailure |
Jumlah resource Izin yang tidak didukung atau tidak valid. Anda dapat melihat log error di Cloud Logging atau saat validateOnly adalah false , periksa status penerapan izin menggunakan CheckConsentEnforcementStatus atau CheckPatientConsentEnforcementStatus untuk mengambil detail error. |
secondarySuccess |
affectedResources |
Jika validateOnly adalah false , nilai ini menunjukkan jumlah resource FHIR yang berhasil diindeks ulang karena efek perubahan izin. |
secondaryFailure |
failedResources |
Jika validateOnly adalah false , nilai ini menunjukkan jumlah resource FHIR yang mungkin memiliki perubahan izin, tetapi gagal melakukan pengindeksan ulang. Hal ini dapat memengaruhi penelusuran dengan konteks izin, tetapi tidak memengaruhi metode lainnya. Untuk melihat detail error, Anda dapat melihat log error di Cloud Logging. |
Saat resource Izin FHIR diproses, Anda dapat menggunakan API berikut untuk memeriksa status penegakan untuk satu izin atau semua izin dari pasien:
CheckConsentEnforcementStatus
: menampilkan resourceParameters
(STU3, R4) yang mencantumkan parameter berikut:id
: mewakili ID resource dari resource IzinlastUpdated
: menunjukkan waktu saat izin terakhir kali diterapkanversionId
: mewakili ID versi yang digunakan untuk penegakan izinconsent-enforcement-status
: mewakili status penegakan izin
CheckPatientConsentEnforcementStatus
: menampilkanBundle
(STU3, R4) dari resourceParameters
(STU3, R4) yang terdiri dari status penegakan semua izin dari satu pasien
Untuk kebijakan admin, CheckConsentEnforcementStatus
hanya dapat digunakan untuk memeriksa
status penerapan satu kebijakan admin Izin. Atau, Anda
dapat menggunakan fhirStores.get
untuk melihat semua kebijakan admin aktif yang diterapkan ke toko.
Status Penerapan Izin
consent-enforcement-status
dapat memiliki salah satu nilai berikut:
OFF
: mewakili status penerapan default resource Izin baru yang resource Izinnya belum pernah diproses.ENFORCEABLE
: status saat resource Izin berhasil diproses.INACTIVE
: status tidak aktif saat resource Izin diabaikan.UNSUPPORTED
: status resource Izin yang mungkin sesuai dengan spesifikasi FHIR, tetapi tidak dapat diterapkan. Hal ini disebabkan oleh penerapan pembatasan izin FHIR dengan tingkat dukungan fitur saat ini.ENFORCEMENT_LIMIT_EXCEEDED
: status saat format resource izin FHIR dan tingkat dukungan untuk resource bebas error, tetapi satu atau beberapa kondisi berikut benar:Pasien memiliki kumpulan besar resource Consent.
Ukuran perintah izin di semua izin aktif lebih besar dari ukuran maksimum perintah izin yang diizinkan untuk server FHIR menerapkannya.
Konteks Penelusuran dengan Izin
Cloud Healthcare API mendukung penelusuran resource FHIR di penyimpanan FHIR tertentu dengan actor
, purpose
, dan environment
sebagai parameter kueri. Respons
hanya berisi resource yang diizinkan.
Menelusuri resource FHIR dengan cakupan izin
- Praktisi Jeffrey Brown (diidentifikasi oleh
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) menggunakan aplikasi tepercayaApp/123
menelusuri semua Pengamatan denganstatus=final
. - Praktisi Jeffrey Brown (diidentifikasi oleh
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) menggunakan aplikasiApp/123
menelusuri semua Pengamatan dari Pasien Darcy. - Praktisi Jeffrey Brown (diidentifikasi oleh
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) menggunakan aplikasiApp/123
menelusuri semua Pengamatan dari Pasien Darcy untuk tujuan perawatan darurat. - Praktisi Jeffrey Brown (diidentifikasi oleh
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) menelusuri Pengamatan denganstatus=final
untuk dua tujuan, yaitu dan riset pengobatan - Administrator IT rumah sakit menggunakan
bypass
untuk menelusuri semua Praktisi di rumah sakit.
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"
Anda akan melihat respons JSON seperti berikut:
{ "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"
Anda akan melihat respons JSON seperti berikut:
{ "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" }
Kueri sebelumnya adalah penelusuran berantai. Karena skenario izin
actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123
ditolak aksesnya untuk resource Darcy Pasien (diidentifikasi oleh
Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2
), server FHIR
tidak menampilkan Observasi dari Pasien seolah-olah Pasien tidak ada.
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"
Anda akan melihat respons JSON seperti berikut:
{ "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"
Anda akan melihat respons JSON seperti berikut:
{ "issue": [ { "code": "security", "details": { "text": "permission_denied" }, "diagnostics": "the maximum number of allowed consent purpose scopes is 1, got 2", "severity": "error" } ], "resourceType": "OperationOutcome" }
Dalam hal ini, Praktisi Jeffrey Brown harus menghapus tujuan yang tidak diperlukan dari `X-Consent-Scope` dalam permintaan.
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?"
Karena bypass
diberikan, pemeriksaan izin dilewati. Anda
akan menerima respons JSON yang mirip dengan berikut ini:
{ "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" }
Mendapatkan resource dengan konteks Izin
Cloud Healthcare API mendukung resource FHIR get di penyimpanan FHIR tertentu dengan actor
, purpose
, dan environment
sebagai parameter kueri. Respons
hanya berisi resource yang diizinkan.
Mendapatkan resource FHIR dengan cakupan izin
- Praktisi Jeffrey Brown (diidentifikasi oleh
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) menggunakan aplikasiApp/123
membaca pengukuran hemoglobin Pasien (dalam contoh ini,Observation/7473784b-46a8-470c-b9a6-fe38a01025aa
). - Praktisi Jeffrey Brown (diidentifikasi oleh
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) menggunakan aplikasi yang tidak diketahuiApp/unknown
membaca pengukuran hemoglobin Pasien (dalam contoh ini,Observation/7473784b-46a8-470c-b9a6-fe38a01025aa
). - Praktisi Jeffrey Brown (diidentifikasi oleh
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) yang melakukan riset biomedis menggunakan aplikasiApp/golden
membaca birthDate Darcy (dalam contoh ini,Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2
). - Praktisi Jeffrey Brown (diidentifikasi oleh
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) meminta akses darurat yang tidak sah ke catatan pasien, menggunakan protokol "break-the-glass". (dalam contoh ini,Observation/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"
Karena pemohon diberi izin, responsnya adalah konten resource Pengamatan.
{ "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"
Karena akses batas peminta (`App/unknown`) tidak diizinkan oleh izin Pasien, permintaan akan ditolak.
{ "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"
Karena pemohon diberi izin, responsnya adalah konten resource Pasien.
{ "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"
Karena metode otorisasi izin adalah btg
, server akan melewati pemeriksaan
izin. Responsnya adalah konten resource Pengamatan.
{ "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 } }
Mengonfigurasi header izin
Bagian berikut menjelaskan metode penegakan izin yang didukung di Cloud Healthcare API dan cara akses resource diterapkan saat Anda membuat permintaan yang mempertimbangkan izin.
Saat membuat permintaan, server otorisasi Anda bertanggung jawab untuk membuat token akses dengan cakupan izin yang relevan.
Menetapkan header HTTP
Cakupan izin diteruskan ke Cloud Healthcare API menggunakan
header HTTP X-Consent-Scope
. Cloud Healthcare API menggunakan header ini untuk
menerapkan kontrol akses berbasis izin pada data di penyimpanan FHIR.
Permintaan FHIR dapat mendukung cakupan entri izin dalam jumlah terbatas. Maksimal tiga
entri actor
, satu purp
, dan satu env
dapat disertakan dalam permintaan
FHIR tertentu.
Untuk cakupan khusus, permintaan FHIR dapat mendukung salah satu dari btg
, atau
bypass
.
Menetapkan header HTTP untuk aplikasi tepercaya
Bagian ini hanya diperlukan jika Anda menggunakan server otorisasi yang dikontrol pelanggan. Dalam hal ini, Anda juga harus menggunakan SMARTproxy atau proxy serupa.
Beberapa aplikasi tepercaya dapat melakukan panggilan langsung ke Cloud Healthcare API dengan cakupan izin di header HTTP yang ditentukan. Hal ini memungkinkan penegakan izin langsung tanpa memerlukan SMARTproxy atau proxy lain untuk mengonversi antara server otorisasi eksternal dan Google Cloud.
Misalnya, aplikasi Anda mungkin terdaftar untuk sebagian cakupan, seperti
cakupan environment
aplikasi, atau aplikasi mungkin menampilkan
widget pilihan untuk menetapkan beberapa entri cakupan seperti purpose
pengakses.
Pengguna tepercaya atau aplikasi tepercaya juga dapat menggunakan
entri cakupan btg
atau bypass
, yang tunduk pada
peninjauan pasca-audit.
Mengonfigurasi server otorisasi untuk cakupan izin
Cloud Healthcare API menyediakan dukungan bawaan untuk penerapan Izin FHIR berdasarkan cakupan izin input. Administrator penyimpanan FHIR bertanggung jawab untuk membuat dan mengonfigurasi server otorisasi di luar Cloud Healthcare API yang memberikan cakupan izin.
Contoh token akses
Contoh berikut menunjukkan token akses yang dienkode dalam base64:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpc3MiOiJjb25zZW50LnRva2VuLm9yZyIsImlhdCI6MTYxMjg4NDA4NSwiZXhwIjoxNjQ0NDIwMDg1LCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJkb2N0b3IuZ2FicmllbGFAZXhhbXBsZS5jb20iLCJzY29wZSI6Im9pZGMgYWN0b3IvUHJhY3RpdGlvbmVyLzEyMyBhY3Rvci9Hcm91cC85OTkgcHVycC92My9UUkVBVCBlbnYvQXBwL2FiYyJ9.fC7ljkVUUx8fwUOrJuONcrqA-WKC-k_Bclzlgds0Cq6H_gEe3nUjPlSOCTQsIdYB
Setelah mendekode token akses, Anda dapat melihat bahwa token tersebut berisi payload berikut:
{
"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"
}
Mengonfigurasi SMARTProxy
SMARTProxy adalah proxy open source dari Google yang menyediakan fitur berikut:
Mengizinkan server FHIR Cloud Healthcare API menerima dan memvalidasi token akses yang mempertimbangkan izin.
Memungkinkan implementasi FHIR di Cloud Healthcare API untuk menyertakan token akses yang mempertimbangkan izin sebagai bagian dari pengelolaan dan model izin Cloud Healthcare API.
Mendukung fitur token untuk dukungan SMART di FHIR juga.
Saat Anda membuat permintaan untuk mengambil data dari Cloud Healthcare API melalui SMARTProxy, hal berikut akan terjadi:
SMARTProxy menerima permintaan dari klien yang berisi token yang mengetahui izin.
SMARTProxy memvalidasi token yang mengetahui izin melalui server otorisasi JWT yang Anda miliki.
SMARTProxy membaca cakupan dari token yang mengetahui izin dan meneruskannya ke Cloud Healthcare API melalui header HTTP.
Cloud Healthcare API menerima header dan memvalidasinya untuk menerapkan perintah izin pada permintaan. Cloud Healthcare API kemudian menampilkan respons melalui SMARTProxy ke klien.
Mengonfigurasi akun layanan Google Cloud
Proxy hanya dapat memiliki satu akun layanan Google Cloud. Jika beberapa klien menggunakan proxy yang sama, klien akan menggunakan akun layanan yang sama. Berhati-hatilah saat membagikan akun layanan kepada beberapa klien karena alasan berikut:
Untuk membaca data FHIR di Cloud Healthcare API, akun layanan dapat dikonfigurasi agar memiliki izin baca dan tulis yang luas. Untuk mengetahui informasi selengkapnya tentang izin, lihat Mengontrol akses ke resource Cloud Healthcare API. Lihat Praktik terbaik umum untuk menyiapkan proxy.
Cloud Audit Logs
Alamat email utama terikat dengan akun layanan.
Misalnya, jika Anda memanggil Cloud Healthcare API secara langsung menggunakan Akun Google Anda untuk autentikasi, Log Audit Cloud akan mencatat alamat email Anda sebagai alamat email utama. Saat Anda menggunakan proxy untuk memanggil Cloud Healthcare API, proxy akan menggunakan akun layanannya sendiri dan alamat email akun utama adalah alamat email akun layanan dan akun asli tidak ditentukan.
Log audit
Log audit dibuat saat ada permintaan akses atau saat penerapan akses resource berubah.
Mengakses log audit
Jika log audit diaktifkan di penyimpanan FHIR, kolom metadata consentMode
akan disertakan dalam log audit yang tersedia di Cloud Logging. consentMode
dapat memiliki salah satu nilai
berikut:
off
: konfigurasi penyimpanan FHIR memilikiconsentConfig.accessEnforced
yang ditetapkan kefalse
dan tidak mengizinkan permintaan yang mempertimbangkan izin.emptyScope
: penyimpanan FHIR memilikiconsentConfig.accessEnforced
yang ditetapkan ketrue
, tetapi header cakupan izin tidak disertakan. Akibatnya, izin tidak diterapkan.enforced
: penyimpanan FHIR memilikiconsentConfig.accessEnforced
yang ditetapkan ketrue
dan header cakupan izin ada. Akibatnya, izin dinilai dan diterapkan pada permintaan.btg
: permintaan FHIR memilikibtg
yang diberikan di header cakupan izin. Akibatnya, pemeriksaan izin dilewati. Permintaan ini dimaksudkan untuk digunakan dalam keadaan darurat dan hanya tunduk pada peninjauan pasca-audit.bypass
: permintaan FHIR hanya memilikibypass
yang diberikan di header cakupan izin. Akibatnya, pemeriksaan izin dilewati. Permintaan ini dimaksudkan untuk digunakan oleh alur kerja tepercaya (seperti administrator atau aplikasi tepercaya, bukan pengguna akhir) sehingga log audit ini berbeda denganbtg
, yang digunakan untuk pemeriksaan tata kelola data.
Secara opsional, Anda dapat menetapkan access_determination_log_config
ke VERBOSE
untuk mencatat informasi selengkapnya tentang alasan permintaan disetujui atau ditolak.
Log audit perubahan penerapan akses
Saat resource dasar kompartemen berubah (misalnya, menghapus tag
employee
pasien): Kontrol akses pada resource yang diubah dan kompartemennya
dapat berubah karena Kebijakan Cascading Admin. Tindakan ini akan memicu pengindeksan ulang pada semua
resource kompartemennya. Progres pengindeksan ulang untuk setiap pembaruan resource basis kompartemen dapat dilacak di Cloud Logging dengan filter jsonPayload.@type="type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry"
.
Contoh log progres pengindeksan ulang cascade
{ "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
adalah status operasi pengindeksan ulang, jsonPayload.affectedResources
adalah jumlah resource kompartemen yang diindeks ulang, dan jsonPayload.lastUpdated
adalah stempel waktu pembaruan resource pasien. Jika operasi baru saja dimulai, jsonPayload.state="STATE_STARTED"
, dan jsonPayload.affectedResources
tidak akan ada.
Batasan dan keterbatasan
Bagian ini menunjukkan batasan dan batas untuk FHIR R4, tetapi batasan dan batas yang sama berlaku untuk FHIR STU3.
Jenis | Batasan dan kendala |
---|---|
Resource Single Consent |
|
Model penerapan |
|
X-Consent-Scope |
|
Metode yang didukung |
|
Performa |
|
Praktik terbaik
Bagian berikut menjelaskan praktik terbaik saat menggunakan Kontrol Akses FHIR.
Praktik terbaik umum
Jangan import resource FHIR dan panggil
ApplyConsents
atauApplyAdminConsents
secara paralel. Sebaiknya impor resource FHIR terlebih dahulu, lalu panggilApplyConsents
atauApplyAdminConsents
. Namun, jika resource yang akan diimpor tidak menyertakan resource Pasien atau Izin, model penegakan tidak akan terpengaruh dan memproses izin atau kebijakan admin tidak diperlukan.Jangan membuat penelusuran kustom dan memanggil
ApplyConsents
secara paralel. Sebaiknya Anda melakukannya satu per satu.Jika alur kerja Anda memerlukan pemanggilan beberapa
ApplyConsents
padaPatientScope
yang tidak tumpang-tindih,ApplyConsents
tersebut dapat dipanggil secara paralel.ApplyAdminConsents
dapat berjalan secara paralel dengan jumlahApplyConsents
apa pun, tetapi tidak denganApplyAdminConsents
lain.Saat menyiapkan proxy, batasi akun layanan IAM dengan izin hanya baca untuk menghindari penulisan data satu pasien ke catatan pasien lain.
Jangan gunakan proxy izin saat membuat atau memperbarui data.
Validasi semua permintaan tulis untuk mencegah modifikasi data lintas pasien yang tidak terduga.
Saat izin cascading diterapkan, resource dasar kompartemen harus diimpor terlebih dahulu, diikuti dengan resource kompartemen lainnya. Atau, semua resource kompartemen dapat digabungkan dalam satu paket dan diserap menggunakan
fhir.executeBundle
.
Menghapus resource Pasien
Saat menghapus resource Pasien, jika Anda juga ingin menghapus penerapan izin untuk pasien tersebut (terutama jika FhirStore.disableReferentialIntegrity
bernilai benar), sebaiknya ikuti urutan operasi ini:
Menghapus semua resource Izin yang termasuk dalam resource Pasien.
Panggil
ApplyConsents
dengan filterPatientScope
.
Menyiapkan penyimpanan yang ada untuk akses izin
Untuk menyiapkan toko yang ada untuk akses izin, selesaikan langkah-langkah berikut:
Gunakan
UpdateFhirStore
untuk menetapkanConsentConfig
dengan penerapan izinversion
sebagaiV1
dan tetapkanaccessEnforced
ketrue
.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"
Memproses izin pasien atau kebijakan admin
ApplyConsents
untuk izin pasien
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
untuk kebijakan admin dan kebijakan cascading admin.
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"
Seberapa sering menjalankan ApplyConsents atau ApplyAdminConsents
Saat kolom
ConsentConfig
tidak ditetapkan: KolomConsentConfig
tidak ditetapkan saat penyimpanan FHIR pertama kali dibuat dan saat kolomConsentConfig
dihapus. Setelah kolomConsentConfig
dibatalkan penetapannya, Anda harus mengulangi menyiapkan toko untuk akses izin sebelum membuat permintaan berbasis izin untuk menghindari evaluasi kebijakan penerapan izin yang sudah tidak berlaku.Saat model penegakan berubah: Saat resource Izin dibuat, diperbarui, atau dihapus, model penegakan akan berubah. Dalam kasus tersebut, Anda harus memanggil
ApplyConsents
atauApplyAdminConsents
agar perubahan ini diterapkan.Jika Anda dapat melacak perubahan Pasien dengan Izin, sebaiknya gunakan filter
PatientScope
untuk menghindari pemrosesan ulang seluruh penyimpanan. Filter ini berguna untuk segera memuat ulang penerapan sekumpulan kecil Pasien.Anda juga dapat menjalankan
ApplyConsents
secara berkala menggunakan filterTimeRange
. Filter ini berguna jika pembaruan langsung tidak penting. Misalnya, permintaan berikut akan memuat ulang penerapan untuk perubahan izin antara pukul 00.00 UTC 20-09-2022 dan pukul 00.00 UTC 21-09-2022.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"
Menggunakan tampilan izin FHIR
FHIR Consent Viewer menampilkan kebijakan kontrol akses. Kelas ini menyediakan tabel yang berisi cakupan izin untuk mewakili aturan Kontrol Akses FHIR.
Sebelum Anda dapat menggunakan Penampil Izin FHIR, pastikan hal berikut:
Setelan
disableResourceVersioning
penyimpanan FHIR harusfalse
. Setelan ini tidak dapat diubah setelah FHIR store dibuat. Untuk membuat penyimpanan FHIR baru, lihat Membuat penyimpanan FHIR.Penyimpanan FHIR dikonfigurasi untuk penegakan izin.
Untuk melihat FHIR Consent Viewer, selesaikan langkah-langkah berikut:
Konsol
Di konsol Google Cloud, buka halaman Browser.
Pilih set data yang berisi penyimpanan FHIR yang kebijakan izin yang diterapkannya ingin Anda lihat.
Di halaman Penyimpanan data, dalam daftar Penyimpanan data, pilih penyimpanan FHIR yang kebijakan izin yang diterapkannya ingin Anda lihat.
Di halaman Detail penyimpanan data, klik tab Izin. Cakupan izin ditampilkan.