Halaman ini menjelaskan cara menggunakan resource Izin FHIR untuk menentukan akses data dari 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 penyimpanan FHIR jika Anda belum memilikinya.
Tetapkan parameter
ConsentConfig
toko FHIR berikut untuk mengaktifkan penerapan izin:version
: Menentukan versi penerapan izin yang digunakan untuk penyimpanan FHIR. Nilai ini hanya dapat ditetapkan sekali 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 (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 toko 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 ditampilkan melalui Resource izin. Tujuan dan penggunaan kolom resource dijelaskan di Dokumen Model Data.
Berikut contoh dari semua resource yang dapat dibuat untuk contoh khusus ini.
Membuat resource FHIR
Contoh berikut menunjukkan cara mengeksekusi [paket FHIR](/healthcare-api/docs/how-tos/fhir-bundles) untuk mengisi resource berikut:
- Referensi Praktisi dengan nama Jeffrey Brown
- Referensi Pasien bernama Darcy Smith
- Referensi Pengamatan yang menunjukkan pengukuran hemoglobin Darcy
(LOINC
718-7
) yang dikumpulkan oleh Happy Hospital - Referensi 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 - Persetujuan 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/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 lebih banyak contoh Resource izin R4 yang menunjukkan cara kebijakan kompleks ditampilkan.
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 referensi Izin pasien yang mana pasien f001
memberikan izin kepada dokter f002
dengan tujuan memberikan perawatan rutin yang diwakili oleh TREAT
.
Praktisi berasal dari geolokasi iso3166-1/CA
. Resource Izin ini memungkinkan tenaga kesehatan 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
. - Class ini memenuhi setidaknya salah satu kondisi berikut pada tag (resource dapat diberi tag dengan menetapkan kolom
system
dancode
dari 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
) - Label tersebut 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 menunjukkan resource Izin kebijakan admin yang memberikan izin
kepada praktisi f002
dengan tujuan memberikan perlakuan
reguler yang diwakili oleh TREAT
. Praktisi berasal dari
geolokasi iso3166-1/CA
. Resource Izin ini memungkinkan tenaga kesehatan 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
. - Solusi ini 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
) - Label tersebut 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 menurun 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 menurun admin yang memberikan izin kepada praktisi f002
dengan tujuan memberikan perlakuan reguler yang diwakili oleh TREAT
. Praktisi berasal dari
geolokasi iso3166-1/CA
. Resource Izin ini memungkinkan praktisi mengakses data kompartemen pasien dengan tag employee
. Semua kriteria resource
hanya berlaku untuk resource dasar kompartemen, yaitu resource Pasien, karena
resource tersebut mengontrol resource mana yang akan menurun.
Terapkan 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 [Operation `get`](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get):
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
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.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).
Terapkan kebijakan admin paling lambat 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 [Operation `get`](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get):
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
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.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 untuk 7 resource (1 Praktisi, 1 Pasien, 2 Pengamatan, 2 Persetujuan 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 bertingkat admin) dipanggil dan berhasil diselesaikan. Jika menambahkan, mengubah, atau menghapus izin setelah menjalankan ApplyConsents
atau ApplyAdminConsents
, Anda harus menjalankannya lagi agar izin tersebut dapat disertakan dalam model penerapan.
Resource FHIR diindeks secara asinkron, sehingga mungkin ada sedikit penundaan
antara waktu saat ApplyConsents
atau ApplyAdminConsents
selesai, dan saat
model penerapan tercermin dalam hasil penelusuran. Penundaan ini hanya
diperkirakan untuk permintaan penelusuran.
Jika ini adalah pertama kalinya Anda menyiapkan penerapan izin di penyimpanan FHIR, tunggu hingga operasi yang berjalan lama ApplyConsents
atau ApplyAdminConsents
selesai sebelum membuat permintaan berbasis izin.
Untuk memanggil ApplyConsents
pada subkumpulan pasien, Anda dapat menggunakan filter
berikut:
PatientScope
: untuk menjalankanApplyConsents
pada daftar ID pasien yang berisi hingga 10.000 pasienTimeRange
: untuk menjalankanApplyConsent
di 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 tambahan). Akibatnya, daftar
kosong akan membatalkan penerapan dari semua kebijakan admin dari Play Store. Setiap kebijakan
harus berupa nama versi resource jika
penyimpanan FHIR
membuat 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 Consent yang berhasil diproses oleh operasi. |
failure |
consentApplyFailure |
Jumlah resource Consent yang tidak didukung atau tidak valid. Anda dapat melihat log error di Cloud Logging atau saat validateOnly adalah false , memeriksa status penerapan izin menggunakan CheckConsentEnforcementStatus atau CheckPatientConsentEnforcementStatus untuk mengambil detail error. |
secondarySuccess |
affectedResources |
Jika validateOnly adalah false , ini menunjukkan jumlah resource FHIR yang berhasil diindeks ulang karena efek perubahan izin. |
secondaryFailure |
failedResources |
Jika validateOnly adalah false , jenis ini menunjukkan jumlah resource FHIR yang mungkin memiliki 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
: menunjukkan ID resource dari resource ConsentlastUpdated
: menunjukkan waktu saat izin terakhir kali diterapkanversionId
: menunjukkan ID versi yang digunakan untuk penerapan izinconsent-enforcement-status
: merepresentasikan 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 kebijakan Admin izin tunggal. Atau, Anda
dapat menggunakan fhirStores.get
untuk melihat semua kebijakan admin aktif yang diterapkan ke Play Store.
Status Penerapan Izin
consent-enforcement-status
dapat memiliki salah satu nilai berikut:
OFF
: merepresentasikan status penerapan default resource Izin baru tempat resource Izin belum pernah diproses.ENFORCEABLE
: status saat resource Izin telah berhasil diproses.INACTIVE
: status tidak aktif saat resource Consent diabaikan.UNSUPPORTED
: status resource Izin yang mungkin sesuai dengan spesifikasi FHIR, tetapi tidak memiliki kekuatan hukum. Hal ini disebabkan oleh penerapan yang terbatas dari penerapan 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 berlaku:Pasien memiliki sekumpulan besar referensi Izin.
Ukuran perintah izin di semua izin aktif lebih besar daripada ukuran maksimum perintah izin yang diizinkan bagi server FHIR untuk menegakkannya.
Telusuri dengan konteks 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.
Telusuri 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, perlakuan dan riset - Admin 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 akses skenario izin actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123
ditolak untuk resource Pasien Darcy (diidentifikasi oleh Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2
), server FHIR tidak akan 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/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 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/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 pengambilan resource FHIR 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 tidak dikenalApp/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
) melakukan riset biomedis menggunakan aplikasiApp/golden
membaca tanggal lahir Darcy (dalam contoh ini,Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2
). - Praktisi Jeffrey Brown (diidentifikasi oleh
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
) meminta akses darurat tidak sah ke rekam medis pasien, menggunakan protokol "break-the-box". (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 isi resource Observasi.
{ "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"
Permintaan ditolak karena akses batas pemohon (`Aplikasi/tidak diketahui`) tidak diizinkan oleh persetujuan Pasien.
{ "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 Observation.
{ "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 } }
Konfigurasi header izin
Bagian berikut menjelaskan metode penerapan izin yang didukung dalam Cloud Healthcare API dan cara penerapan akses resource saat Anda membuat permintaan berdasarkan izin.
Saat membuat permintaan, server otorisasi Anda bertanggung jawab untuk membuat token akses dengan cakupan izin yang relevan.
Setel 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 sejumlah cakupan entri izin yang terbatas. Hingga tiga
entri actor
, satu dari purp
, dan satu dari env
dapat disertakan dalam permintaan
FHIR tertentu.
Untuk cakupan khusus, permintaan FHIR dapat mendukung salah satu dari btg
, atau
bypass
.
Setel header HTTP untuk aplikasi tepercaya
Bagian ini hanya diperlukan jika Anda menggunakan server otorisasi yang dikontrol pelanggan. Dalam instance ini, Anda juga harus menggunakan SMARTproxy atau proxy serupa.
Beberapa aplikasi tepercaya dapat melakukan panggilan langsung ke Cloud Healthcare API dengan cakupan izin dalam header HTTP yang ditentukan. Hal ini memungkinkan penerapan izin langsung tanpa memerlukan SMARTproxy atau proxy lain untuk melakukan konversi antara server otorisasi eksternal dan Google Cloud.
Misalnya, aplikasi Anda mungkin terdaftar untuk subset cakupan, seperti
cakupan environment
aplikasi, atau aplikasi mungkin menampilkan
widget pemilihan 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 untuk menerima dan memvalidasi token akses berbasis izin.
Mengizinkan implementasi FHIR di Cloud Healthcare API untuk menyertakan token akses berbasis izin sebagai bagian dari model izin dan pengelolaan Cloud Healthcare API.
Mendukung fitur token untuk SMART pada dukungan 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 berbasis izin.
SMARTProxy memvalidasi token berdasarkan izin melalui server otorisasi JWT yang Anda miliki.
SMARTProxy membaca cakupan dari token berbasis 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 tersebut akan menggunakan akun layanan yang sama. Berhati-hatilah saat berbagi akun layanan dengan 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, Cloud Audit Logs akan mencatat alamat email Anda sebagai alamat email utama. Saat Anda menggunakan proxy untuk memanggil Cloud Healthcare API, proxy tersebut akan menggunakan akun layanannya sendiri dan alamat email utamanya adalah alamat email akun layanan, dan akun asalnya 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 berbasis izin.emptyScope
: FHIR store memilikiconsentConfig.accessEnforced
yang ditetapkan ketrue
, tetapi header cakupan izin tidak disertakan. Akibatnya, persetujuan tidak ditegakkan.enforced
: penyimpanan FHIR memilikiconsentConfig.accessEnforced
yang ditetapkan ketrue
dan header cakupan izin ada. Akibatnya, izin dievaluasi dan diterapkan pada permintaan resource di kompartemen pasien (STU3, R4).btg
: permintaan FHIR memilikibtg
yang diberikan di header cakupan izin. Akibatnya, pemeriksaan izin dilewati. Permintaan ini dimaksudkan untuk digunakan untuk keadaan darurat dan tunduk pada tinjauan pasca-audit saja.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.
Jika ingin, Anda dapat menetapkan access_determination_log_config
ke VERBOSE
untuk mencatat informasi selengkapnya
tentang alasan permintaan disetujui atau ditolak.
Log audit perubahan penerapan akses
Jika resource dasar kompartemen berubah (misalnya, menghapus tag
employee
pasien): Kontrol akses pada resource yang diubah dan kompartemennya
dapat berubah karena Kebijakan Cascading Admin. Ini akan memicu pengindeksan ulang
pada semua resource kompartemennya. Progres indeks ulang untuk setiap update 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 indeks 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 batasan
Bagian ini menunjukkan batasan untuk FHIR R4, tetapi batasan dan batas 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 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 izin pemrosesan atau kebijakan admin tidak diperlukan.Jangan buat penelusuran kustom dan panggil
ApplyConsents
secara paralel. Sebaiknya Anda melakukannya satu per satu.Jika alur kerja Anda memerlukan pemanggilan beberapa
ApplyConsents
diPatientScope
yang terpisah, keduanya dapat dipanggil secara paralel.ApplyAdminConsents
dapat berjalan secara paralel dengan sejumlahApplyConsents
, tetapi tidak denganApplyAdminConsents
lainnya.Saat menyiapkan proxy, batasi akun layanan IAM dengan izin hanya baca agar tidak menulis data satu pasien ke catatan pasien lainnya.
Jangan gunakan proxy izin saat membuat atau memperbarui data.
Validasi semua permintaan tulis untuk mencegah modifikasi yang tidak terduga pada data lintas pasien.
Saat izin menurun diterapkan, resource dasar kompartemen harus diimpor terlebih dahulu, diikuti dengan resource kompartemen yang tersisa. Atau, semua resource kompartemen dapat digabungkan dalam satu paket dan diserap menggunakan
fhir.executeBundle
.
Hapus resource Pasien
Saat menghapus resource Pasien, jika Anda juga ingin menghapus penerapan izin untuk pasien tersebut (terutama jika FhirStore.disableReferentialIntegrity
bernilai true), sebaiknya ikuti urutan operasi berikut:
Hapus semua resource Consent milik resource Pasien.
Panggil
ApplyConsents
dengan filterPatientScope
.
Menyiapkan toko yang sudah ada untuk akses izin
Guna 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/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?update_mask=consentConfig"
Memproses persetujuan pasien atau kebijakan admin
ApplyConsents
untuk persetujuan 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 turunan 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 ApplyConsents atau ApplyAdminConsents
Jika kolom
ConsentConfig
tidak disetel: KolomConsentConfig
tidak disetel, baik saat penyimpanan FHIR pertama kali dibuat maupun saat kolomConsentConfig
dihapus. Setelah kolomConsentConfig
tidak disetel, Anda harus mengulangi proses menyiapkan penyimpanan untuk akses izin sebelum membuat permintaan berdasarkan izin agar tidak mengevaluasi kebijakan penerapan izin yang sudah tidak berlaku.Saat model penegakan berubah: Saat resource Consent dibuat, diupdate, atau dihapus, model penerapannya akan berubah. Dalam kasus tersebut, Anda harus memanggil
ApplyConsents
atauApplyAdminConsents
agar perubahan ini dapat diterapkan.Jika Anda dapat memantau Pasien dengan perubahan Izin, sebaiknya gunakan filter
PatientScope
untuk menghindari pemrosesan ulang seluruh toko. Filter ini berguna untuk segera memperbarui penerapan sebagian kecil Pasien.Anda juga dapat menjalankan
ApplyConsents
secara berkala menggunakan filterTimeRange
. Filter ini berguna saat refresh langsung tidak terlalu penting. Misalnya, permintaan berikut memperbarui penerapan untuk perubahan izin antara UTC 00.00-09-20 UTC dan UTC 0AM 2022-09-21.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"