Halaman ini menjelaskan cara menggunakan resource Izin FHIR untuk menentukan akses data penyimpanan FHIR di Cloud Healthcare API.
Mengonfigurasi penyimpanan yang mendukung kontrol akses FHIR
Untuk mengonfigurasi penyimpanan FHIR dengan penerapan izin, selesaikan langkah-langkah berikut:
Buat FHIR store 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 terhadap perintah izin yang diberikan oleh konsumen.consent_header_handling
: Jika ditetapkan kePERMIT_EMPTY_SCOPE
(default), server mengizinkan permintaan tanpa (atau kosong) headerX-Consent-Scope
. Jika ditetapkan keREQUIRED_ON_READ
danaccess_enforced
=true
, server akan menolak semua permintaan tanpa (atau kosong) headerX-Consent-Scope
.
Menyiapkan FHIR store 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/v1/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 pemberlakuan 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?update_mask=consentConfig"
Menentukan Kebijakan Menggunakan Resource Izin
Kebijakan diwakili melalui resource Izin. Tujuan dan penggunaan kolom resource dijelaskan dalam Dokumen Model Data.
Berikut adalah contoh semua resource yang dapat dibuat untuk contoh tertentu ini.
Membuat resource FHIR
Contoh berikut menunjukkan cara menjalankan [FHIR bundle](/healthcare-api/docs/how-tos/fhir-bundles) untuk mengisi resource berikut:
- Sumber daya Praktisi dengan nama Jeffrey Brown
- Resource Pasien dengan nama Darcy Smith
- Resource Pengamatan yang menunjukkan pengukuran hemoglobin Darcy
(LOINC
718-7
) yang dikumpulkan oleh Happy Hospital - Resource Pengamatan yang menunjukkan pengukuran glukosa Darcy
(LOINC
15074-8
). - Izin dari Darcy untuk mengizinkan Jeffrey Brown menggunakan aplikasi
App/123
untuk mengakses datanya yang dikumpulkan oleh Happy Hospital - Izin dari Darcy untuk mengizinkan Jeffrey Brown mengakses datanya untuk
perawatan darurat
(
ETREAT
) - Izin dari Happy Hospital 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/v1/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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/12942879-f89f-41ae-aa80-0b911b649833/_history/VERSION_ID", "status": "201 Created" } }, { "response": { "etag": "W/\"VERSION_ID\"", "lastModified": "2022-09-01T17:31:40.423469+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2/_history/VERSION_ID", "status": "201 Created" } }, { "response": { "etag": "W/\"VERSION_ID\"", "lastModified": "2022-09-01T17:31:40.423469+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa/_history/VERSION_ID", "status": "201 Created" } }, { "response": { "etag": "W/\"VERSION_ID\"", "lastModified": "2022-09-01T17:31:40.423469+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/68583624-9921-4158-8754-2a306c689abd/_history/VERSION_ID", "status": "201 Created" } }, { "response": { "etag": "W/\"VERSION_ID\"", "lastModified": "2022-09-01T17:31:40.423469+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/10998b60-a252-405f-aa47-0702554ddc8e/_history/VERSION_ID", "status": "201 Created" } }, { "response": { "etag": "W/\"VERSION_ID\"", "lastModified": "2022-09-01T17:31:40.423469+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/73c54e8d-2789-403b-9dee-13085c5d5e34/_history/VERSION_ID", "status": "201 Created" } }, { "response": { "etag": "W/\"VERSION_ID\"", "lastModified": "2022-09-01T17:31:40.423469+00:00", "location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/5c8e3f8a-9fd5-480d-a08e-f29b89feccde/_history/VERSION_ID", "status": "201 Created" } } ], "resourceType": "Bundle", "type": "transaction-response" }
Berikut adalah contoh lainnya dari R4 Consent resource yang menunjukkan cara kebijakan yang kompleks dapat direpresentasikan.
Contoh arahan 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 merepresentasikan resource Izin pasien yang di dalamnya pasien
f001
memberikan izin kepada praktisi f002
dengan
tujuan untuk memberikan perawatan rutin yang diwakili oleh TREAT
.
Praktisi berasal dari geolokasi iso3166-1/CA
. Resource
Consent ini mengizinkan praktisi 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 (resource dapat diberi tag dengan menyetel 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 arahan 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 menunjukkan bahwa resource Izin kebijakan admin memberikan izin
kepada praktisi f002
dengan tujuan untuk memberikan perawatan rutin
yang diwakili oleh TREAT
. Praktisi berasal dari
geolokasi iso3166-1/CA
. Resource Izin ini mengizinkan praktisi 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 direktif kebijakan berjenjang 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 menunjukkan resource Izin kebijakan berjenjang admin yang memberikan
izin kepada praktisi f002
dengan tujuan untuk memberikan
perawatan rutin yang diwakili oleh TREAT
. Praktisi berasal dari
geolokasi iso3166-1/CA
. Resource Izin ini mengizinkan praktisi mengakses data kompartemen pasien dengan tag employee
. Semua kriteria resource
hanya berlaku untuk resource dasar kompartemen, yang berarti resource Pasien, karena
mengontrol resource mana yang akan di-cascade dari.
Menerapkan izin pasien atau kebijakan admin
Menerapkan 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/v1/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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
Setelah 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.v1.OperationMetadata", "apiMethodName": "google.cloud.healthcare.v1.fhir.FhirStoreService.ApplyConsents", "createTime": "CREATE_TIME", "endTime": "END_TIME", "logsUrl": "https://console.cloud.google.com/logs/query/CLOUD_LOGGING_URL", "counter": { "success": "2", "secondarySuccess": "5" } }, "done": true, "response": { "@type": "type.googleapis.com/google.cloud.healthcare.v1.fhir.ApplyConsentsResponse", "consentApplySuccess": "2", "affectedResources": "5" } }
Respons ini menunjukkan bahwa server berhasil memproses 2 izin dan memperbarui akses berdasarkan izin dari 5 resource (1 Pasien, 2 Izin, 2 Observasi).
Menerapkan kebijakan admin dengan 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/v1/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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
Setelah 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.v1.OperationMetadata", "apiMethodName": "google.cloud.healthcare.v1.fhir.FhirStoreService.ApplyAdminConsents", "createTime": "CREATE_TIME", "endTime": "END_TIME", "logsUrl": "https://console.cloud.google.com/logs/query/CLOUD_LOGGING_URL", "counter": { "success": "1", "secondarySuccess": "7" } }, "done": true, "response": { "@type": "type.googleapis.com/google.cloud.healthcare.v1.fhir.ApplyAdminConsentsResponse", "consentApplySuccess": "1", "affectedResources": "7" } }
Respons ini menunjukkan bahwa server berhasil memproses 1 kebijakan admin dan memperbarui akses berdasarkan izin 7 resource (1 Praktisi, 1 Pasien, 2 Observasi, 2 Izin pasien, dan 1 kebijakan admin).
Pemberlakuan izin yang disimpan dalam FHIR store tidak akan berlaku
hingga ApplyConsents
(untuk izin pasien) atau ApplyAdminConsents
(untuk kebijakan admin
dan kebijakan admin bertingkat) dipanggil dan berhasil diselesaikan. Jika
Anda 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 ditampilkan dalam hasil penelusuran. Penundaan ini hanya
diharapkan untuk permintaan penelusuran.
Jika ini pertama kalinya Anda menyiapkan penerapan izin di FHIR store, tunggu hingga operasi yang berjalan lama ApplyConsents
atau ApplyAdminConsents
selesai sebelum membuat permintaan yang mendukung izin.
Untuk memanggil ApplyConsents
pada sebagian pasien, Anda dapat menggunakan filter berikut:
PatientScope
: untuk menjalankanApplyConsents
pada daftar ID pasien dengan hingga 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 Anda terapkan (bukan daftar inkremental). Akibatnya, daftar kosong akan membatalkan penegakan dari semua kebijakan admin dari toko. Setiap kebijakan
harus berupa nama versi resource jika
FHIR store
melakukan pembuatan versi, dan nama resource jika tidak.
Anda dapat menggunakan operations.get
untuk mengambil ProgressCounter
operasi. Setelah selesai, 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 , maka ini menunjukkan jumlah resource FHIR yang berhasil diindeks ulang karena efek perubahan izin. |
secondaryFailure |
failedResources |
Jika validateOnly adalah false , ini menunjukkan jumlah resource FHIR yang mungkin mengalami perubahan izin, tetapi gagal diindeks 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
: merepresentasikan ID resource resource IzinlastUpdated
: menunjukkan waktu saat izin terakhir kali diterapkanversionId
: merepresentasikan ID versi yang digunakan untuk penerapan izinconsent-enforcement-status
: menunjukkan status penerapan 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
: merepresentasikan status penerapan default resource Izin baru yang belum pernah diproses.ENFORCEABLE
: status saat resource Izin telah diproses dengan berhasil.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 yang terbatas dari penegakan 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 banyak resource Izin.
Ukuran petunjuk izin di semua izin aktif lebih besar daripada ukuran maksimum yang diizinkan untuk petunjuk izin agar diterapkan oleh server FHIR.
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 telah diberi izin.
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 dengan
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) menggunakan aplikasiApp/123
menelusuri semua Pengamatan dari Pasien Darcy untuk tujuan perawatan darurat. - Praktisi Jeffrey Brown (diidentifikasi dengan
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) menelusuri Pengamatan denganstatus=final
untuk dua tujuan, yaitu perawatan dan riset - 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/v1/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/v1/projects/PROJECT_ID/locations/LOCATION_ID/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa", "resource": { "code": { "coding": [ { "code": "718-7", "display": "Hemoglobin [Mass/volume] in Blood", "system": "http://loinc.org" } ] }, "effectivePeriod": { "start": "2021-12-10T05:30:10+01:00" }, "id": "7473784b-46a8-470c-b9a6-fe38a01025aa", "issued": "2021-12-10T13:30:10+01:00", "meta": { "lastUpdated": "2022-09-01T17:31:40.423469+00:00", "source": "http://example.com/HappyHospital", "versionId": "VERSION_ID" }, "resourceType": "Observation", "status": "final", "subject": { "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2" }, "valueQuantity": { "code": "g/dL", "system": "http://unitsofmeasure.org", "unit": "g/dl", "value": 7.2 } }, "search": { "mode": "match" } } ], "link": [ { "relation": "search", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final" }, { "relation": "first", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final" }, { "relation": "self", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final" } ], "resourceType": "Bundle", "total": 1, "type": "searchset" }
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?subject:Patient.name=Darcy"
Anda akan melihat respons JSON seperti berikut:
{ "link": [ { "relation": "search", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy" }, { "relation": "first", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy" }, { "relation": "self", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy" } ], "resourceType": "Bundle", "total": 0, "type": "searchset" }
Kueri sebelumnya adalah penelusuran berantai. Karena skenario izin
actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123
ditolak aksesnya untuk resource Pasien Darcy (diidentifikasi oleh
Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2
), server FHIR
tidak menampilkan Pengamatan 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/v1/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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/68583624-9921-4158-8754-2a306c689abd", "resource": { "code": { "coding": [ { "code": "15074-8", "display": "Glucose [Moles/volume] in Blood", "system": "http://loinc.org" } ] }, "effectivePeriod": { "start": "2021-12-01T05:30:10+01:00" }, "id": "68583624-9921-4158-8754-2a306c689abd", "issued": "2021-12-01T13:30:10+01:00", "meta": { "lastUpdated": "2022-09-01T17:31:40.423469+00:00", "versionId": "VERSION_ID" }, "resourceType": "Observation", "status": "final", "subject": { "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2" }, "valueQuantity": { "code": "mmol/L", "system": "http://unitsofmeasure.org", "unit": "mmol/l", "value": 6.3 } }, "search": { "mode": "match" } }, { "fullUrl": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa", "resource": { "code": { "coding": [ { "code": "718-7", "display": "Hemoglobin [Mass/volume] in Blood", "system": "http://loinc.org" } ] }, "effectivePeriod": { "start": "2021-12-10T05:30:10+01:00" }, "id": "7473784b-46a8-470c-b9a6-fe38a01025aa", "issued": "2021-12-10T13:30:10+01:00", "meta": { "lastUpdated": "2022-09-01T17:31:40.423469+00:00", "source": "http://example.com/HappyHospital", "versionId": "VERSION_ID" }, "resourceType": "Observation", "status": "final", "subject": { "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2" }, "valueQuantity": { "code": "g/dL", "system": "http://unitsofmeasure.org", "unit": "g/dl", "value": 7.2 } }, "search": { "mode": "match" } } ], "link": [ { "relation": "search", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy" }, { "relation": "first", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy" }, { "relation": "self", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy" } ], "resourceType": "Bundle", "total": 2, "type": "searchset" }
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 purp/v3/TREAT purp/v3/HRESCH" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?status=final"
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 perlu 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/v1/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 yang berikut:
{ "entry": [ { "fullUrl": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/12942879-f89f-41ae-aa80-0b911b649833", "resource": { "active": true, "birthDate": "1970-05-23", "gender": "male", "id": "12942879-f89f-41ae-aa80-0b911b649833", "meta": { "lastUpdated": "2022-09-01T17:31:40.423469+00:00", "versionId": "VERSION_ID" }, "name": [ { "family": "Brown", "given": [ "Jeffrey" ], "use": "official" } ], "resourceType": "Practitioner" }, "search": { "mode": "match" } } ], "link": [ { "relation": "search", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?" }, { "relation": "first", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?" }, { "relation": "self", "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?" } ], "resourceType": "Bundle", "total": 1, "type": "searchset" }
Mendapatkan resource dengan konteks Izin
Cloud Healthcare API mendukung pengambilan resource FHIR di penyimpanan FHIR tertentu dengan actor
, purpose
, dan environment
sebagai parameter kueri. Respons
hanya berisi resource yang telah diberi izin.
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 aplikasiApp/unknown
yang tidak diketahui membaca pengukuran hemoglobin Pasien (dalam contoh ini,Observation/7473784b-46a8-470c-b9a6-fe38a01025aa
). - Praktisi Jeffrey Brown (diidentifikasi dengan
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) 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/v1/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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"
Karena akses batas pemohon (`App/unknown`) tidak diizinkan oleh izin Pasien, permintaan 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
Karena pemohon telah 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/v1/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 penerapan izin yang didukung di Cloud Healthcare API dan cara penerapan akses resource saat Anda membuat permintaan yang mendukung 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. Hingga tiga entri actor
, satu entri purp
, dan satu entri 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 subset cakupan, seperti cakupan environment
aplikasi, atau aplikasi mungkin menampilkan widget pilihan untuk menyetel 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 mendukung izin.
Memungkinkan penerapan FHIR di Cloud Healthcare API menyertakan token akses yang mendukung izin sebagai bagian dari model izin dan pengelolaan Cloud Healthcare API.
Mendukung fitur token untuk dukungan SMART on 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 mendukung izin.
SMARTProxy memvalidasi token yang mendukung izin melalui server otorisasi JWT yang Anda miliki.
SMARTProxy membaca cakupan dari token yang mendukung izin dan meneruskannya ke Cloud Healthcare API melalui header HTTP.
Cloud Healthcare API menerima header dan memvalidasinya untuk menerapkan arahan izin pada permintaan. Cloud Healthcare API kemudian menampilkan respons melalui SMARTProxy ke klien.
Mengonfigurasi akun layanan Google Cloud
Proxy hanya dapat memiliki satu Google Cloud akun layanan. Jika beberapa klien menggunakan proxy yang sama, klien akan menggunakan akun layanan yang sama. Berhati-hatilah saat membagikan akun layanan ke 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 terkait dengan akun layanan.
Misalnya, jika Anda memanggil Cloud Healthcare API secara langsung menggunakan Akun Google Anda untuk autentikasi, maka Cloud Audit Logs 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 utama adalah alamat email akun layanan tersebut dan akun asli tidak ditentukan.
Log audit
Log audit dibuat saat ada permintaan akses atau saat perubahan penerapan akses resource.
Mengakses log audit
Jika log audit
diaktifkan
di FHIR store, kolom metadata consentMode
akan disertakan dalam log audit yang tersedia di Cloud Logging. consentMode
dapat memiliki salah satu nilai berikut:
off
: konfigurasi FHIR store telah menetapkanconsentConfig.accessEnforced
kefalse
dan tidak mengizinkan permintaan yang mendukung izin.emptyScope
: FHIR store memilikiconsentConfig.accessEnforced
yang disetel ketrue
, tetapi header cakupan izin tidak disertakan. Akibatnya, izin tidak diterapkan.enforced
: FHIR store memilikiconsentConfig.accessEnforced
yang ditetapkan ketrue
dan header cakupan izin ada. Akibatnya, izin dievaluasi 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 menyetel access_determination_log_config
ke VERBOSE
untuk mencatat informasi selengkapnya tentang alasan permintaan diberikan atau ditolak.
Log audit perubahan penerapan akses
Saat resource dasar kompartemen berubah (misalnya, menghapus tag employee
pasien): Kontrol akses pada resource yang berubah dan kompartemennya dapat berubah karena Kebijakan Bertingkat Admin. Tindakan ini akan memicu pengindeksan ulang pada semua resource kompartemennya. Progres pengindeksan ulang untuk setiap pembaruan resource dasar kompartemen dapat dilacak di Cloud Logging dengan filter jsonPayload.@type="type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry"
.
Contoh log progres pengindeksan ulang bertingkat
{ "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 limitasi untuk FHIR R4, tetapi batasan dan limitasi yang sama berlaku untuk FHIR STU3.
Jenis | Batasan dan batas |
---|---|
Resource Izin Tunggal |
|
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 mengimpor resource FHIR dan memanggil
ApplyConsents
atauApplyAdminConsents
secara paralel. Sebaiknya impor terlebih dahulu resource FHIR, lalu panggilApplyConsents
atauApplyAdminConsents
. Namun, jika resource yang akan diimpor tidak menyertakan resource Pasien atau Izin, maka model penegakan tidak akan terpengaruh dan pemrosesan 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 berurutan, alur kerja tersebut dapat dipanggil secara paralel.ApplyAdminConsents
dapat berjalan secara paralel dengan sejumlahApplyConsents
, 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 catatan.
Memvalidasi semua permintaan penulisan untuk mencegah modifikasi data lintas pasien yang tidak terduga.
Jika izin berjenjang diterapkan, resource dasar kompartemen harus diimpor terlebih dahulu, diikuti dengan resource kompartemen lainnya. Atau, semua resource kompartemen dapat di-wrap dalam satu paket dan di-ingest menggunakan
fhir.executeBundle
.
Menghapus resource Pasien
Saat menghapus resource Pasien, jika Anda juga ingin menghapus penerapan izin untuk pasien tersebut (terutama saat
FhirStore.disableReferentialIntegrity
bernilai benar), sebaiknya ikuti urutan operasi berikut:
Menghapus semua resource Izin yang dimiliki resource Pasien.
Panggil
ApplyConsents
dengan filterPatientScope
.
Menyiapkan toko yang sudah ada untuk akses izin
Untuk menyiapkan toko yang sudah 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/v1/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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"
ApplyAdminConsents
untuk kebijakan admin dan kebijakan bertingkat 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyAdminConsents"
Seberapa sering menjalankan ApplyConsents atau ApplyAdminConsents
Jika kolom
ConsentConfig
tidak ditetapkan: KolomConsentConfig
tidak ditetapkan baik saat penyimpanan FHIR pertama kali dibuat maupun saat kolomConsentConfig
dihapus. Setelah kolomConsentConfig
tidak disetel, Anda harus mengulangi penyiapan toko untuk akses izin sebelum membuat permintaan yang mendukung izin untuk menghindari evaluasi kebijakan penegakan 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 toko. Filter ini berguna untuk segera memperbarui penegakan sejumlah kecil Pasien.Anda juga dapat menjalankan
ApplyConsents
secara berkala menggunakan filterTimeRange
. Filter ini berguna saat penyegaran segera tidak penting. Misalnya, permintaan berikut memperbarui penegakan untuk perubahan izin antara 00.00 UTC 20-09-2022 dan 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"
Menggunakan tampilan izin FHIR
FHIR Consent Viewer menampilkan kebijakan kontrol akses. Tabel ini menyediakan tabel yang berisi cakupan izin untuk merepresentasikan aturan Kontrol Akses FHIR.
Sebelum Anda dapat menggunakan FHIR Consent Viewer, 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.FHIR store dikonfigurasi untuk penerapan izin.
Untuk melihat FHIR Consent Viewer, selesaikan langkah-langkah berikut:
Konsol
Di Google Cloud console, buka halaman Browser.
Pilih set data yang berisi penyimpanan FHIR yang kebijakan izinnya yang diterapkan ingin Anda lihat.
Di halaman Data stores, pada daftar Data stores, pilih penyimpanan FHIR yang kebijakan izinnya yang diterapkan ingin Anda lihat.
Di halaman Detail penyimpanan data, klik tab Izin. Cakupan izin ditampilkan.