이 페이지에서는 FHIR 동의 리소스를 사용하여 Cloud Healthcare API에서 FHIR 스토어의 데이터 액세스를 확인하는 방법을 설명합니다.
FHIR 액세스 제어가 사용 설정된 스토어 구성
동의 시행으로 FHIR 스토어를 구성하려면 다음 단계를 완료합니다.
FHIR 스토어가 아직 없으면 만듭니다.
동의 시행을 사용 설정하기 위해 다음 FHIR 스토어의
ConsentConfig
매개변수를 설정합니다.version
: FHIR 스토어에 사용할 동의 시행 버전을 지정합니다.CreateFhirStore
또는UpdateFhirStore
에서 이 값을 한 번만 설정할 수 있습니다. 설정한 후에 버전을 변경하려면ApplyConsents
또는ApplyAdminConsents
를 호출해야 합니다.access_enforced
:true
로 설정하면 FHIR 리소스에 액세스할 때 제공된 동의 헤더를 소비자가 제공한 동의 지시문과 확인합니다.consent_header_handling
:PERMIT_EMPTY_SCOPE
(기본값)로 설정된 경우 서버에서X-Consent-Scope
헤더가 없거나 비어 있는 요청을 허용합니다.REQUIRED_ON_READ
및access_enforced
=true
로 설정한 경우 서버는X-Consent-Scope
헤더가 없거나 비어 있는 모든 요청을 거부합니다.
ConsentConfig
로 새 FHIR 스토어 설정
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"
다음과 비슷한 JSON 응답이 표시됩니다.
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID", "version": "R4", "enableUpdateCreate": true, "consentConfig": { "version": "V1" } }
기존 저장소가 있는 경우 UpdateFhirStore
를 사용하여 동의 시행 version
이 V1
인 ConsentConfig
를 설정하고 accessEnforced
를 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"
동의 리소스를 사용하여 정책 정의
정책은 동의 리소스를 통해 표현됩니다. 리소스 필드의 목적과 용도는 데이터 모델 문서에 설명되어 있습니다.
다음은 이 특정 예시에 대해 만들 수 있는 모든 리소스의 예시입니다.
FHIR 리소스 만들기
다음 샘플은 [FHIR 번들](/healthcare-api/docs/how-tos/fhir-bundles)을 실행하여 다음 리소스를 채우는 방법을 보여줍니다.
- 제프리 브라운이라는 이름의 실무자 리소스
- 다르시 스미스라는 이름의 환자 리소스
- 행복 병원에서 수집한 다르시 환자의 헤모글로빈 측정 수치를 보여주는 관찰 리소스(LOINC
718-7
) - 다르시 환자의 혈당 측정 수치를 보여주는 관찰 리소스(LOINC
15074-8
). - 제프리 브라운이 애플리케이션
App/123
을 사용하여 행복 병원에서 수집된 다르시 환자의 데이터에 액세스하도록 허용하는 다르시 환자 동의 - 제프리 브라운이 응급 치료 시 다르시 환자의 데이터에 액세스하도록 허용하는 다르시 환자의 동의(
ETREAT
) App/golden
애플리케이션으로 생물 의학 연구(BIORCH
)를 수행할 때 제프리 브라운이 모든 데이터에 액세스하도록 허용하는 행복 병원의 동의
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"
다음과 비슷한 JSON 응답이 표시됩니다.
{ "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" }
다음은 복잡한 정책을 표현하는 방법을 보여주는 R4 동의 리소스의 추가 예시입니다.
샘플 환자 동의 지시문
{ "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" } ] } }
앞의 예시는 TREAT
로 표현되는 정기 치료를 제공하기 위한 목적으로 f001
환자가 f002
실무자에게 권한을 부여하는 환자 동의 리소스를 나타냅니다.
실무자의 위치정보는 iso3166-1/CA
입니다. 이 동의 리소스는 데이터가 다음 조건을 모두 충족할 경우 실무자의 환자 데이터 액세스를 허용합니다.
- ID가
Encounter/e001
인Encounter
유형입니다. - 소스
http://somesystem.example.org/foo
에서 제공됩니다. - 태그의 다음 조건 중 하나 이상을 충족합니다(Meta.tag의
system
및code
필드를 설정하여 리소스에 태그를 지정할 수 있음). - 태그(
system
=http://terminology.hl7.org/CodeSystem/common-tags
및code
=actionable
)가 있음 - 태그(
system
=http://example.com/custom-tags
및code
=archived
) 및 태그(system
=http://example.com/custom-tags
및code
=insensitive
)가 모두 있음 - 다음 보안 라벨 중 하나 이상이 있음
system
=http://terminology.hl7.org/CodeSystem/v3-Confidentiality
이고,code
는R
,N
,M
,L
,U
중 하나입니다.system
=http://terminology.hl7.org/CodeSystem/v3-ActCode
및code
=PSY
.
샘플 관리자 정책 지시문
{ "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" } ] } }
앞의 예시는 TREAT
로 표현되는 정기 치료를 제공하기 위한 목적으로 f002
실무자에게 권한을 부여하는 관리자 정책 동의 리소스를 나타냅니다. 실무자의 위치정보는 iso3166-1/CA
입니다. 이 동의 리소스는 데이터가 다음 조건을 모두 충족할 경우 실무자의 환자 데이터 액세스를 허용합니다.
- ID가
Encounter/e001
인Encounter
유형입니다. - 소스
http://somesystem.example.org/foo
에서 제공됩니다. - 태그에서 다음 조건 중 하나를 충족합니다.
- 태그(
system
=http://terminology.hl7.org/CodeSystem/common-tags
및code
=actionable
)가 있음 - 태그(
system
=http://example.com/custom-tags
및code
=archived
) 및 태그(system
=http://example.com/custom-tags
및code
=insensitive
)가 모두 있음 - 다음 보안 라벨 중 하나 이상이 있음
system
=http://terminology.hl7.org/CodeSystem/v3-Confidentiality
이고,code
는R
,N
,M
,L
,U
중 하나입니다.system
=http://terminology.hl7.org/CodeSystem/v3-ActCode
및code
=PSY
.
관리자 단계식 정책 지시문 샘플
{ "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" } } ] } }
앞의 예시는 TREAT
로 표현되는 정기 치료를 제공하기 위한 목적으로 f002
실무자에게 권한을 부여하는 관리자 단계식 정책 동의 리소스를 나타냅니다. 실무자의 위치정보는 iso3166-1/CA
입니다. 이 동의 리소스는 employee
태그가 있는 환자의 구획 데이터에 대한 실무자의 액세스를 허용합니다. 모든 리소스 기준은 단계식으로 진행할 리소스를 제어하므로 구획 기본 리소스, 즉 환자 리소스에만 적용됩니다.
환자 동의 또는 관리자 정책 시행
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"
다음과 비슷한 JSON 응답이 표시됩니다.
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" }
응답에 작업 이름이 포함됩니다. 작업 상태를 추적하려면 [작업 `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"
작업이 완료되면 서버가 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" } }
이 응답은 서버에서 동의 2개가 성공적으로 처리되고 리소스 5개(환자 1개, 동의 2개, 관찰 2개)에 대한 동의된 액세스 권한이 업데이트되었음을 나타냅니다.
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"
다음과 비슷한 JSON 응답이 표시됩니다.
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" }
응답에 작업 이름이 포함됩니다. 작업 상태를 추적하려면 [작업 `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"
작업이 완료되면 서버가 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" } }
이 응답은 서버에서 1개의 관리자 정책이 성공적으로 처리되고 7개 리소스(실무자 1개, 환자 1개, 관찰 2개, 환자 동의 2개, 관리자 정책 1개)에 대해 동의된 액세스 권한이 업데이트되었음을 나타냅니다.
FHIR 스토어 내에 저장된 동의에 대한 시행은 ApplyConsents
(환자 동의) 또는 ApplyAdminConsents
(관리자 정책 및 관리자 단계식 정책)가 호출되고 성공적으로 완료될 때까지 적용되지 않습니다. ApplyConsents
또는 ApplyAdminConsents
를 실행한 후 동의를 추가, 수정, 삭제할 경우에는 시행 모델에 포함되도록 해당 동의에 대해 이를 다시 실행해야 합니다.
FHIR 리소스는 비동기적으로 색인이 생성되므로, ApplyConsents
또는 ApplyAdminConsents
가 완료되는 시점과 시행 모델이 검색 결과에 반영되는 시점 사이에 약간의 지연이 있을 수 있습니다. 이러한 지연은 검색 요청의 경우에만 예상됩니다.
FHIR 스토어에 동의 시행을 처음 설정할 경우에는 동의 인식 요청을 수행하기 전에 ApplyConsents
또는 ApplyAdminConsents
장기 실행 작업이 완료될 때까지 기다립니다.
환자 하위 집합에서 ApplyConsents
를 호출하려면 다음 필터를 사용하면 됩니다.
PatientScope
: 환자 수가 최대 10,000명인 환자 ID 목록에서ApplyConsents
를 실행합니다.TimeRange
: 특정 기간 범위 동안 동의 리소스가 업데이트된 환자 리소스 ID 목록에서ApplyConsent
를 실행합니다.
ApplyAdminConsents
를 호출하려면 증분 목록이 아니라 적용하려는 모든 정책의 전체 목록을 제공해야 합니다. 따라서 목록이 비어 있으면 저장소의 모든 관리자 정책에서 시행이 무효화됩니다. FHIR 스토어가 버전을 관리하는 경우 각 정책은 리소스 버전 이름이어야 하고 그렇지 않으면 리소스 이름이어야 합니다.
operations.get
을 사용해서 작업의 ProgressCounter
를 검색할 수 있습니다. 완료 시 Operation.response
에 포함된 ApplyConsentsResponse가 있습니다.
다음 표에서는 ProgressCounter
및 ApplyConsentsResponse
또는 ApplyAdminConsentsResponse
의 카운터에 대해 설명합니다.
ProgressCounter |
ApplyConsentsResponse 또는 ApplyAdminConsentsResponse |
설명 |
---|---|---|
success |
consentApplySuccess |
작업이 성공적으로 처리된 동의 리소스 수입니다. |
failure |
consentApplyFailure |
지원되지 않거나 잘못된 동의 리소스 수입니다. Cloud Logging에서 오류 로그를 보거나 validateOnly 가 false 이면 CheckConsentEnforcementStatus 또는 CheckPatientConsentEnforcementStatus 를 사용하여 동의 시행 상태를 검사하여 오류 세부정보를 검색할 수 있습니다. |
secondarySuccess |
affectedResources |
validateOnly 가 false 이면 동의 변경의 효과로 인해 성공적으로 다시 색인이 생성된 FHIR 리소스의 수를 나타냅니다. |
secondaryFailure |
failedResources |
validateOnly 가 false 이면 동의가 변경될 수 있지만 색인을 재생성할 수 없는 FHIR 리소스의 수를 나타냅니다. 이는 동의 컨텍스트로 검색에 영향을 미칠 수 있지만 다른 메서드에는 영향을 주지 않습니다. 오류 세부정보를 확인하려면 Cloud Logging의 오류 로그를 보면 됩니다. |
FHIR 동의 리소스가 처리되면 다음 API를 사용하여 단일 동의 또는 환자의 모든 동의에 대해 시행 상태를 확인할 수 있습니다.
CheckConsentEnforcementStatus
: 다음 매개변수를 나열하는Parameters
(STU3, R4) 리소스를 반환합니다.id
: 동의 리소스의 리소스 ID를 나타냅니다.lastUpdated
: 동의가 마지막으로 시행된 시간을 나타냅니다.versionId
: 동의 시행에 사용된 버전 ID를 나타냅니다.consent-enforcement-status
: 동의 시행 상태를 나타냅니다.
CheckPatientConsentEnforcementStatus
: 단일 환자의 모든 동의에 대한 시행 상태로 구성되는Parameters
(STU3, R4) 리소스의Bundle
(STU3, R4)을 반환합니다.
관리자 정책의 경우 단일 동의 관리자 정책의 시행 상태를 확인하기 위해 CheckConsentEnforcementStatus
만 사용할 수 있습니다. 또는 fhirStores.get
을 사용해서 저장소에 적용된 모든 활성 관리자 정책을 볼 수 있습니다.
동의 시행 상태
consent-enforcement-status
에 다음 값이 포함될 수 있습니다.
OFF
: 동의 리소스가 처리되지 않은 새 동의 리소스의 기본 시행 상태를 나타냅니다.ENFORCEABLE
: 동의 리소스가 성공적으로 처리된 상태입니다.INACTIVE
: 동의 리소스가 무시된 비활성 상태입니다.UNSUPPORTED
: FHIR 사양을 준수할 수 있지만 유효하지 않은 동의 리소스의 상태입니다. 이것은 현재 기능 지원 수준에서 FHIR 동의 시행의 구현이 제한되기 때문입니다.ENFORCEMENT_LIMIT_EXCEEDED
: FHIR 동의 리소스 형식 및 리소스의 지원 수준에 오류가 발생하지 않지만 다음 조건 중 하나 이상이 true일 때의 상태입니다.환자에게 대규모 동의 리소스 집합이 있습니다.
모든 활성 동의 간의 동의 지시문 크기가 FHIR 서버에서 시행할 수 있는 동의 지시문에 허용되는 최대 크기보다 큽니다.
동의 컨텍스트로 검색
Cloud Healthcare API는 지정된 FHIR 스토어에서 actor
, purpose
, environment
를 쿼리 매개변수로 사용하여 FHIR 리소스에 대한 검색을 지원합니다. 응답에는 동의된 리소스만 포함됩니다.
동의 범위로 FHIR 리소스 검색
- 실무자인 제프리 브라운(
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
으로 식별)이 신뢰할 수 있는 애플리케이션App/123
을 사용하여status=final
로 모든 관찰값을 검색합니다. - 실무자인 제프리 브라운(
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
으로 식별됨)이 애플리케이션App/123
을 사용하여 다르시 환자의 모든 관찰값을 검색합니다. - 실무자인 제프리 브라운(
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
으로 식별)이 응급 치료 목적으로 애플리케이션App/123
을 사용하여 다르시 환자의 모든 관찰값을 검색합니다. - 실무자인 제프리 브라운(
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
으로 식별됨)이 치료 및 연구의 두 가지 목적으로status=final
인 관찰값을 검색합니다. - 병원 IT 관리자는
bypass
를 사용하여 병원의 모든 실무자를 검색합니다.
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"
다음과 비슷한 JSON 응답이 표시됩니다.
{ "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"
다음과 비슷한 JSON 응답이 표시됩니다.
{ "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" }
앞의 쿼리는 연결된 검색입니다. 동의 시나리오 actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123
은 다르시 환자 리소스(Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2
로 식별됨)에 대해 액세스가 거부되기 때문에 FHIR 서버는 환자가 존재하지 않는 것처럼 환자로부터 관찰값을 반환하지 않습니다.
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"
다음과 비슷한 JSON 응답이 표시됩니다.
{ "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"
다음과 비슷한 JSON 응답이 표시됩니다.
{ "issue": [ { "code": "security", "details": { "text": "permission_denied" }, "diagnostics": "the maximum number of allowed consent purpose scopes is 1, got 2", "severity": "error" } ], "resourceType": "OperationOutcome" }
이 경우 실무자인 제프리 브라운은 해당 요청의 `X-Consent-Scope`에서 불필요한 목적을 삭제해야 합니다.
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?"
bypass
가 제공되었으므로 동의 검사를 건너뛰었습니다. 다음과 비슷한 JSON 응답이 표시됩니다.
{ "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" }
동의 컨텍스트로 리소스 가져오기
Cloud Healthcare API는 지정된 FHIR 스토어에서 actor
, purpose
, environment
를 쿼리 매개변수로 사용하여 FHIR 리소스를 가져오는 것을 지원합니다. 응답에는 동의된 리소스만 포함됩니다.
동의 범위로 FHIR 리소스 가져오기
- 실무자인 제프리 브라운(
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
으로 식별)이 애플리케이션App/123
을 사용하여 환자의 헤모글로빈 측정 수치를 읽습니다(이 예시에서는Observation/7473784b-46a8-470c-b9a6-fe38a01025aa
). - 실무자인 제프리 브라운(
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
으로 식별됨)이 알 수 없는 애플리케이션App/unknown
을 사용하여 환자의 헤모글로빈 측정 수치를 읽습니다(이 예시에서는Observation/7473784b-46a8-470c-b9a6-fe38a01025aa
). App/golden
애플리케이션을 사용해서 생물 의학 연구를 수행하는 실무자 제프리 브라운(Practitioner/12942879-f89f-41ae-aa80-0b911b649833
으로 식별)이 다르시의 생년월일(이 예시에서는Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2
) 정보를 읽습니다.- 실무자인 제프리 브라운(
Practitioner/12942879-f89f-41ae-aa80-0b911b649833
로 식별)은 '긴급 상황' 프로토콜을 사용하여 환자 레코드에 대한 긴급 무단 액세스를 요청합니다. (이 예시에서는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"
요청자에게 동의가 제공되었으므로 관찰 리소스의 콘텐츠가 응답됩니다.
{ "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"
요청자의 경계 액세스(`App/unknown`)가 환자 동의에 따라 허용되지 않았으므로 요청이 거부됩니다.
{ "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"
요청자에게 동의가 제공되었으므로 환자 리소스의 콘텐츠가 응답됩니다.
{ "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"
동의 승인 방법이 btg
이므로 서버에서 동의 검사를 건너뜁니다. 관찰 리소스 콘텐츠가 응답됩니다.
{ "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 } }
동의 헤더 구성
다음 섹션에서는 Cloud Healthcare API에서 지원되는 동의 시행 메서드와 동의 인식 요청을 수행할 때 리소스 액세스가 시행되는 방식을 설명합니다.
요청을 수행할 때 승인 서버는 관련 동의 범위를 사용하여 액세스 토큰을 생성해야 합니다.
HTTP 헤더 설정
동의 범위는 X-Consent-Scope
HTTP 헤더를 사용하여 Cloud Healthcare API로 전달됩니다. Cloud Healthcare API는 이 헤더를 사용하여 FHIR 스토어의 데이터에 동의 기반 액세스 제어를 시행합니다.
FHIR 요청은 제한된 개수의 동의 항목 범위를 지원할 수 있습니다. 지정된 FHIR 요청에 actor
항목 최대 3개, purp
항목 하나, env
항목 하나를 포함할 수 있습니다.
특수 범위의 경우 FHIR 요청에서 btg
또는 bypass
중 하나를 지원할 수 있습니다.
신뢰할 수 있는 애플리케이션을 위한 HTTP 헤더 설정
이 섹션은 고객 제어 승인 서버를 사용하는 경우에만 필요합니다. 이 경우에는 SMARTproxy 또는 비슷한 프록시를 사용해야 합니다.
일부 신뢰할 수 있는 애플리케이션은 지정된 HTTP 헤더의 동의 범위를 사용하여 Cloud Healthcare API를 직접 호출할 수 있습니다. 이렇게 하면 외부 승인 서버와 Google Cloud 사이의 전환을 위해 SMARTproxy 또는 기타 프록시가 없어도 직접 동의 시행이 가능합니다.
예를 들어 애플리케이션이 범위 하위 집합(예: 애플리케이션 environment
범위)에 등록되거나 접근자의 purpose
와 같은 일부 범위 항목을 설정하는 선택 위젯을 제공할 수 있습니다.
또한 신뢰할 수 있는 사용자 또는 신뢰할 수 있는 애플리케이션은 사후 감사 검토에 따라 달라지는 btg
또는 bypass
범위 항목을 사용할 수 있습니다.
동의 범위에 대한 승인 서버 구성
Cloud Healthcare API는 입력 동의 범위를 기반으로 FHIR 동의 시행에 대한 지원을 기본 제공합니다. FHIR 스토어 관리자는 동의 범위를 부여하는 Cloud Healthcare API 외부에서 승인 서버를 만들고 구성해야 합니다.
샘플 액세스 토큰
다음 샘플은 base64로 인코딩된 액세스 토큰을 보여줍니다.
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpc3MiOiJjb25zZW50LnRva2VuLm9yZyIsImlhdCI6MTYxMjg4NDA4NSwiZXhwIjoxNjQ0NDIwMDg1LCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJkb2N0b3IuZ2FicmllbGFAZXhhbXBsZS5jb20iLCJzY29wZSI6Im9pZGMgYWN0b3IvUHJhY3RpdGlvbmVyLzEyMyBhY3Rvci9Hcm91cC85OTkgcHVycC92My9UUkVBVCBlbnYvQXBwL2FiYyJ9.fC7ljkVUUx8fwUOrJuONcrqA-WKC-k_Bclzlgds0Cq6H_gEe3nUjPlSOCTQsIdYB
액세스 토큰을 디코딩한 후에 다음 페이로드가 포함된 것을 볼 수 있습니다.
{
"iss": "consent.token.org",
"iat": 1612884085,
"exp": 1644420085,
"aud": "www.example.com",
"sub": "doctor.gabriela@example.com",
"scope": "oidc actor/Practitioner/123 actor/Group/999 purp/v3/TREAT env/App/abc"
}
SMARTProxy 구성
SMARTProxy는 다음 기능을 제공하는 Google의 오픈소스 프록시입니다.
Cloud Healthcare API FHIR 서버가 동의 인식 액세스 토큰을 수락하고 유효성을 검증할 수 있도록 합니다.
Cloud Healthcare API의 FHIR 구현이 Cloud Healthcare API 관리 및 권한 모델의 일부로서 동의 인식 액세스 토큰을 포함할 수 있게 합니다.
FHIR에서 SMART의 토큰 기능도 지원합니다.
사용자가 SMARTProxy를 통해 Cloud Healthcare API에서 데이터를 검색하도록 요청하면, 다음이 수행됩니다.
SMARTProxy가 동의 인식 토큰이 포함된 클라이언트의 요청을 수락합니다.
SMARTProxy가 사용자 소유 JWT 승인 서버를 통해 동의 인식 토큰을 검증합니다.
SMARTProxy는 동의 인식 토큰에서 범위를 읽고 HTTP 헤더를 통해 Cloud Healthcare API로 전달합니다.
Cloud Healthcare API는 헤더를 수신하고 이를 검증하여 요청에 대해 동의 지시문을 시행합니다. 그런 후 Cloud Healthcare API가 SMARTProxy를 통해 클라이언트에 응답을 반환합니다.
Google Cloud 서비스 계정 구성
프록시에는 Google Cloud 서비스 계정이 하나만 포함될 수 있습니다. 여러 클라이언트에 동일한 프록시가 사용되는 경우 클라이언트에 동일한 서비스 계정이 사용됩니다. 다음과 같은 이유로 여러 클라이언트와 서비스 계정을 공유할 때는 주의해야 합니다.
Cloud Healthcare API에서 FHIR 데이터를 읽기 위해 광범위한 읽기 및 쓰기 권한을 갖도록 서비스 계정을 구성할 수 있습니다. 권한에 대한 자세한 내용은 Cloud Healthcare API 리소스에 대한 액세스 제어를 참조하세요. 프록시 설정은 일반 권장사항을 참조하세요.
Cloud 감사 로그
주 구성원 이메일 주소가 서비스 계정에 연결되어 있습니다.
예를 들어 인증을 위해 Google 계정을 사용하여 Cloud Healthcare API를 직접 호출할 경우 Cloud 감사 로그가 이메일 주소를 주 구성원 이메일 주소로 로깅합니다. 프록시를 사용하여 Cloud Healthcare API를 호출하면 프록시에 해당 고유 서비스 계정이 사용되고, 주 구성원 이메일 주소가 서비스 계정의 이메일 주소가 되고, 원본 계정은 정의되지 않습니다.
감사 로그
감사 로그는 액세스 요청이 있거나 리소스의 액세스 시행이 변경될 때 생성됩니다.
감사 로그 액세스
감사 로그가 FHIR 스토어에 사용 설정되어 있는 경우 consentMode
메타데이터 필드가 Cloud Logging에서 제공되는 감사 로그에 포함됩니다. consentMode
는 다음 값 중 하나를 포함할 수 있습니다.
off
: FHIR 스토어 구성에서consentConfig.accessEnforced
가false
로 설정되고 동의 인식 요청을 허용하지 않습니다.emptyScope
: FHIR 스토어에서consentConfig.accessEnforced
가true
로 설정되었지만 동의 범위 헤더가 포함되지 않았습니다. 따라서 동의가 시행되지 않았습니다.enforced
: FHIR 스토어에서consentConfig.accessEnforced
가true
로 설정되었고 동의 범위 헤더가 제공되었습니다. 따라서 동의가 평가되었고 요청에 의해 시행되었습니다.btg
: FHIR 요청에서 동의 범위 헤더에btg
를 제공했습니다. 따라서 동의 검사를 건너뛰었습니다. 이 요청은 긴급 상황에만 사용되며 감사 후 검토에만 적용됩니다.bypass
: FHIR 요청에서 동의 범위 헤더에bypass
만 제공했습니다. 따라서 동의 검사를 건너뛰었습니다. 이 요청은 신뢰할 수 있는 워크플로(예: 관리자 또는 신뢰할 수 있는 애플리케이션)에게 사용되므로 이 감사 로그는 데이터 거버넌스 검사에 사용되는btg
와 다릅니다.
원하는 경우 access_determination_log_config
를 VERBOSE
로 설정하여 요청이 부여되거나 거부되는 이유에 대한 추가 정보를 기록할 수 있습니다.
액세스 시행 변경 감사 로그
구획 기본 리소스가 변경되는 경우(예: 환자의 employee
태그 삭제): 변경된 리소스 및 해당 구획의 액세스 제어가 관리자 단계식 정책으로 인해 변경됩니다. 모든 구획 리소스에서 색인 재생성을 트리거합니다. 각 구획 기본 리소스 업데이트의 색인 재생성 진행 상황은 jsonPayload.@type="type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry"
필터를 사용하여 Cloud Logging에서 추적할 수 있습니다.
단계식 색인 재생성 진행 상황 로그 샘플
{ "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
는 색인 재생성 작업의 상태이고, jsonPayload.affectedResources
는 색인이 재생성된 구획 리소스의 수이고, jsonPayload.lastUpdated
는 환자 리소스 업데이트의 타임스탬프입니다. 작업이 방금 시작되었으면 jsonPayload.state="STATE_STARTED"
및 jsonPayload.affectedResources
가 표시되지 않습니다.
제약조건 및 제한사항
이 섹션에서는 FHIR R4에 대한 제약조건과 한도를 보여주지만 FHIR STU3에 동일한 제약조건과 한도가 적용됩니다.
유형 | 제약조건 및 한도 |
---|---|
단일 동의 리소스 |
|
시행 모델 |
|
X-Consent-Scope |
|
지원되는 메서드 |
|
성능 |
|
권장사항
다음 섹션에서는 FHIR 액세스 제어를 사용할 때의 권장사항에 대해 설명합니다.
일반 권장사항
FHIR 리소스 가져오기와
ApplyConsents
또는ApplyAdminConsents
호출을 동시에 수행하지 마세요. 먼저 FHIR 리소스를 가져온 후ApplyConsents
또는ApplyAdminConsents
를 호출하는 것이 좋습니다. 하지만 가져올 리소스에 환자 또는 동의 리소스가 포함되지 않은 경우에는 시행 모델이 영향을 받지 않으며 동의 또는 관리자 정책 처리가 필요하지 않습니다.커스텀 검색 만들기와
ApplyConsents
호출을 동시에 수행하지 마세요. 하나씩 차례대로 수행하는 것이 좋습니다.워크플로에서 분리된
PatientScope
에서 여러ApplyConsents
를 호출해야 하는 경우 이를 동시에 호출할 수 있습니다.ApplyAdminConsents
는 임의 개수의ApplyConsents
와 함께 동시에 실행될 수 있지만 다른ApplyAdminConsents
와 동시에 실행될 수는 없습니다.프록시를 설정할 때 한 환자의 데이터가 다른 환자의 레코드에 기록되지 않도록 읽기 전용 권한으로 IAM 서비스 계정을 제한합니다.
레코드를 만들거나 업데이트할 때 동의 프록시를 사용하지 마세요.
모든 쓰기 요청의 유효성을 검사하여 환자 간 데이터가 예기치 않게 수정되지 않도록 합니다.
단계식 동의가 시행되면 구획 기본 리소스를 먼저 가져온 다음에 나머지 구획 리소스를 가져와야 합니다. 또는 모든 구획 리소스를 단일 번들 내에 래핑하고
fhir.executeBundle
을 사용하여 수집할 수 있습니다.
환자 리소스 삭제
환자 리소스를 삭제할 때 환자의 동의 시행을 삭제하려면(특히 FhirStore.disableReferentialIntegrity
가 true인 경우) 다음 작업 순서를 따르는 것이 좋습니다.
환자 리소스에 속하는 모든 동의 리소스를 삭제합니다.
PatientScope
필터를 사용하여ApplyConsents
를 호출합니다.
동의 액세스를 위한 기존 저장소 설정
동의 액세스를 위해 기존 저장소를 설정하려면 다음 단계를 수행합니다.
UpdateFhirStore
를 사용하여ConsentConfig
를 동의 시행version
을V1
로 사용하도록 설정하고accessEnforced
를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"
환자 동의 또는 관리자 정책 처리
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"
- 관리자 정책 및 관리자 단계식 정책을 위한
ApplyAdminConsents
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"
ApplyConsents 또는 ApplyAdminConsents 실행 빈도
ConsentConfig
필드가 설정되지 않은 경우:ConsentConfig
필드는 FHIR 스토어가 처음 생성될 때와ConsentConfig
필드가 삭제될 때 설정되지 않습니다.ConsentConfig
필드가 설정되지 않은 경우 동의 인식 요청을 수행하기 전에 동의 액세스에 필요한 저장소 설정을 반복하여 오래된 동의 시행 정책을 평가하지 않도록 해야 합니다.시행 모델을 변경한 경우: 동의 리소스가 생성, 업데이트 또는 삭제되면 시행 모델이 변경됩니다. 이러한 경우
ApplyConsents
또는ApplyAdminConsents
를 호출하여 변경사항을 적용해야 합니다.동의가 변경된 환자를 추적할 수 있는 경우 전체 저장소를 다시 처리하지 않도록
PatientScope
필터를 사용하는 것이 좋습니다. 이 필터는 작은 환자 집합의 시행을 즉시 새로고침하는 데 유용합니다.TimeRange
필터를 사용하여ApplyConsents
를 주기적으로 실행할 수도 있습니다. 이 필터는 즉시 새로고침이 중요하지 않은 경우에 유용합니다. 예를 들어 다음 요청은 2022년 9월 20일 자정(UTC)과 2022년 9월 21일 자정(UTC) 사이의 동의 변경사항을 새로 시행합니다.curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json" \ --data "{ 'validateOnly': false, 'timeRange': { 'start': '2022-09-20T00:00:00Z', 'end': '2022-09-21T00:00:00Z', } }" \ "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"