בדף הזה מוסבר איך להשתמש במשאבי הסכמה של FHIR כדי לקבוע את הגישה לנתונים במאגרי FHIR ב-Cloud Healthcare API.
הגדרת מאגר נתונים עם הפעלה של בקרת גישה בפורמט 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(או עם כותרת ריקה).
הגדרת מאגר FHIR חדש באמצעות ConsentConfig
curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json" \ --data "{ 'version': 'R4', 'enableUpdateCreate': true, 'consentConfig': { 'version': 'V1', 'accessEnforced': true } }" "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores?fhirStoreId=FHIR_STORE_ID"
אתם אמורים לקבל תגובת JSON שדומה לזו:
{
"name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID",
"version": "R4",
"enableUpdateCreate": true,
"consentConfig": {
"version": "V1"
}
}
אם כבר יש לכם חנות, משתמשים ב-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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?update_mask=consentConfig"
הגדרת מדיניות באמצעות משאב ההסכמה
כללי המדיניות מיוצגים באמצעות משאב ההסכמה. המטרה והשימוש של שדות המשאבים מתוארים במסמכי מודל הנתונים.
הנה דוגמה לכל המשאבים שאפשר ליצור עבור הדוגמה הזו.
יצירת משאבי FHIR
בדוגמה הבאה אפשר לראות איך להריץ [FHIR bundle](/healthcare-api/docs/how-tos/fhir-bundles) כדי לאכלס את המשאבים הבאים:
- משאב של איש מקצוע בשם Jeffrey Brown
- משאב Patient עם השם Darcy Smith
- משאב Observation שמציג מדידה של המוגלובין של Darcy
(LOINC
718-7) שנאסף על ידי Happy Hospital - משאב Observation שמציג מדידת גלוקוז של Darcy
(LOINC
15074-8). - הסכמה מדארסי לאפשר לג'פרי בראון להשתמש באפליקציה
App/123כדי לגשת לנתונים שלה שנאספו על ידי Happy Hospital - הסכמה מ-Darcy לאפשר ל-Jeffrey Brown לגשת לכל הנתונים שלה לצורך
טיפול חירום
(
ETREAT) - הסכמה מבית החולים Happy Hospital שמאפשרת לג'פרי בראון לגשת לכל הנתונים
במסגרת מחקר ביו-רפואי (
BIORCH) באמצעות האפליקציהApp/golden
cat > bundle.json << 'EOF' { "resourceType": "Bundle", "type": "transaction", "entry": [ { "request": {"method": "PUT", "url": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"}, "resource": { "active": true, "birthDate": "1970-05-23", "gender": "male", "id": "12942879-f89f-41ae-aa80-0b911b649833", "name": [{ "family": "Brown", "given": ["Jeffrey"], "use": "official" }], "resourceType": "Practitioner" } }, { "request": {"method": "PUT", "url": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"}, "resource": { "active": true, "birthDate": "1990-01-01", "gender": "female", "id": "3c6aa096-c054-4c22-b2b4-1e4a4d203de2", "name": [{ "family": "Smith", "given": ["Darcy"], "use": "official" }], "meta": { "tag": [{ "system": "http://terminology.hl7.org/CodeSystem/common-tags", "code": "employee" }] }, "resourceType": "Patient" } }, { "request": {"method": "PUT", "url": "Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"}, "resource": { "id": "7473784b-46a8-470c-b9a6-fe38a01025aa", "meta": {"source": "http://example.com/HappyHospital"}, "code": { "coding": [{ "code": "718-7", "system": "http://loinc.org", "display": "Hemoglobin [Mass/volume] in Blood" }] }, "effectivePeriod": {"start": "2021-12-10T05:30:10+01:00"}, "issued": "2021-12-10T13:30:10+01:00", "resourceType": "Observation", "status": "final", "subject": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"}, "valueQuantity": { "code": "g/dL", "system": "http://unitsofmeasure.org", "unit": "g/dl", "value": 7.2 } } }, { "request": {"method": "PUT", "url": "Observation/68583624-9921-4158-8754-2a306c689abd"}, "resource": { "id": "68583624-9921-4158-8754-2a306c689abd", "code": { "coding": [{ "code": "15074-8", "system": "http://loinc.org", "display": "Glucose [Moles/volume] in Blood" }] }, "effectivePeriod": {"start": "2021-12-01T05:30:10+01:00"}, "issued": "2021-12-01T13:30:10+01:00", "resourceType": "Observation", "status": "final", "subject": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"}, "valueQuantity": { "code": "mmol/L", "system": "http://unitsofmeasure.org", "unit": "mmol/l", "value": 6.3 } } }, { "request": {"method": "PUT", "url": "Consent/10998b60-a252-405f-aa47-0702554ddc8e"}, "resource": { "category": [{ "coding": [{ "code": "59284-0", "system": "http://terminology.hl7.org/CodeSystem/consentcategorycodes" }] }], "id": "10998b60-a252-405f-aa47-0702554ddc8e", "patient": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"}, "policyRule": { "coding": [{ "code": "OPTIN", "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode" }] }, "provision": { "actor": [ { "reference": {"reference": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"}, "role": { "coding": [{ "code": "GRANTEE", "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode" }] } } ], "extension": [ { "url": "https://g.co/fhir/medicalrecords/Environment", "valueCodeableConcept": { "coding": [{ "code": "123", "system": "App" }] } }, { "url": "https://g.co/fhir/medicalrecords/DataSource", "valueUri": "http://example.com/HappyHospital" } ], "type": "permit" }, "resourceType": "Consent", "scope": { "coding": [{ "code": "patient-privacy", "system": "http://terminology.hl7.org/CodeSystem/consentscope" }] }, "status": "active" } }, { "request": {"method": "PUT", "url": "Consent/73c54e8d-2789-403b-9dee-13085c5d5e34"}, "resource": { "category": [{ "coding": [{ "code": "59284-0", "system": "http://terminology.hl7.org/CodeSystem/consentcategorycodes" }] }], "id": "73c54e8d-2789-403b-9dee-13085c5d5e34", "patient": {"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"}, "policyRule": { "coding": [{ "code": "OPTIN", "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode" }] }, "provision": { "actor": [ { "reference": {"reference": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"}, "role": { "coding": [{ "code": "GRANTEE", "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode" }] } } ], "purpose": [{ "code": "ETREAT", "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason" }], "type": "permit" }, "resourceType": "Consent", "scope": { "coding": [{ "code": "patient-privacy", "system": "http://terminology.hl7.org/CodeSystem/consentscope" }] }, "status": "active" } }, { "request": {"method": "PUT", "url": "Consent/5c8e3f8a-9fd5-480d-a08e-f29b89feccde"}, "resource": { "category": [{ "coding": [{ "code": "57017-6", "system": "http://loinc.org" }] }], "id": "5c8e3f8a-9fd5-480d-a08e-f29b89feccde", "patient": {}, "extension": [{ "url": "https://g.co/fhir/medicalrecords/ConsentAdminPolicy" }], "policyRule": { "coding": [{ "code": "OPTIN", "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode" }] }, "provision": { "actor": [ { "reference": {"reference": "Practitioner/12942879-f89f-41ae-aa80-0b911b649833"}, "role": { "coding": [{ "code": "GRANTEE", "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode" }] } } ], "purpose": [{ "code": "BIORCH", "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason" }], "extension": [ { "url": "https://g.co/fhir/medicalrecords/Environment", "valueCodeableConcept": { "coding": [{ "code": "golden", "system": "App" }] } } ], "type": "permit" }, "resourceType": "Consent", "scope": {}, "status": "active" } } ] } EOF curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/fhir+json; charset=utf-8" \ --data @bundle.json \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir"
אתם אמורים לקבל תגובת JSON שדומה לזו:
{
"entry": [
{
"response": {
"etag": "W/\"VERSION_ID\"",
"lastModified": "2022-09-01T17:31:40.423469+00:00",
"location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/12942879-f89f-41ae-aa80-0b911b649833/_history/VERSION_ID",
"status": "201 Created"
}
},
{
"response": {
"etag": "W/\"VERSION_ID\"",
"lastModified": "2022-09-01T17:31:40.423469+00:00",
"location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2/_history/VERSION_ID",
"status": "201 Created"
}
},
{
"response": {
"etag": "W/\"VERSION_ID\"",
"lastModified": "2022-09-01T17:31:40.423469+00:00",
"location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa/_history/VERSION_ID",
"status": "201 Created"
}
},
{
"response": {
"etag": "W/\"VERSION_ID\"",
"lastModified": "2022-09-01T17:31:40.423469+00:00",
"location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/68583624-9921-4158-8754-2a306c689abd/_history/VERSION_ID",
"status": "201 Created"
}
},
{
"response": {
"etag": "W/\"VERSION_ID\"",
"lastModified": "2022-09-01T17:31:40.423469+00:00",
"location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/10998b60-a252-405f-aa47-0702554ddc8e/_history/VERSION_ID",
"status": "201 Created"
}
},
{
"response": {
"etag": "W/\"VERSION_ID\"",
"lastModified": "2022-09-01T17:31:40.423469+00:00",
"location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/73c54e8d-2789-403b-9dee-13085c5d5e34/_history/VERSION_ID",
"status": "201 Created"
}
},
{
"response": {
"etag": "W/\"VERSION_ID\"",
"lastModified": "2022-09-01T17:31:40.423469+00:00",
"location": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/5c8e3f8a-9fd5-480d-a08e-f29b89feccde/_history/VERSION_ID",
"status": "201 Created"
}
}
],
"resourceType": "Bundle",
"type": "transaction-response"
}
הדוגמאות הבאות של משאב הסכמה בתקן 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" } ] } }
בדוגמה הקודמת מוצג משאב הסכמה של מטופל, שבו המטופל f001 נותן הרשאה לרופא f002 למטרה של מתן טיפול קבוע, שמיוצגת על ידי TREAT.
בעל המקצוע מגיע מהמיקום הגיאוגרפי iso3166-1/CA. משאב ההסכמה הזה מאפשר לרופא לגשת לנתוני המטופל אם הנתונים עומדים בכל התנאים הבאים.
- זהו סוג
Encounterעם המזההEncounter/e001. - מקור הנתונים:
http://somesystem.example.org/foo - התג עומד לפחות באחד מהתנאים הבאים (אפשר לתייג משאבים על ידי הגדרת השדות
systemו-codeשל Meta.tags): - יש תג (
system=http://terminology.hl7.org/CodeSystem/common-tagsו-code=actionable) - יש את שני התגים (
system=http://example.com/custom-tagsו-code=archived) and (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" } ] } }
בדוגמה הקודמת, משאב ההסכמה של מדיניות האדמין מעניק הרשאה לרופא f002 במטרה לספק טיפול קבוע שמיוצג על ידי TREAT. בעל המקצוע נמצא במיקום הגיאוגרפי iso3166-1/CA. משאב ההסכמה הזה מאפשר לרופא או לרופאה לגשת לנתוני המטופל או המטופלת אם הנתונים עומדים בכל התנאים הבאים:
- זהו סוג
Encounterעם המזההEncounter/e001. - מקור הנתונים:
http://somesystem.example.org/foo - התג עומד לפחות באחד מהתנאים הבאים:
- יש תג (
system=http://terminology.hl7.org/CodeSystem/common-tagsו-code=actionable) - יש את שני התגים (
system=http://example.com/custom-tagsו-code=archived) and (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" } } ] } }
בדוגמה הקודמת מוצג משאב הסכמה של מדיניות אדמין מדורגת שמעניק הרשאה לרופא f002 במטרה לספק טיפול קבוע שמיוצג על ידי TREAT. בעל המקצוע נמצא במיקום הגיאוגרפי 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/v1/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` של Operation](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get):
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
כשהפעולה מסתיימת, השרת מחזיר תגובה עם סטטוס הפעולה בפורמט JSON:
{
"name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"",
"metadata": {
"@type": "type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata",
"apiMethodName": "google.cloud.healthcare.v1.fhir.FhirStoreService.ApplyConsents",
"createTime": "CREATE_TIME",
"endTime": "END_TIME",
"logsUrl": "https://console.cloud.google.com/logs/query/CLOUD_LOGGING_URL",
"counter": {
"success": "2",
"secondarySuccess": "5"
}
},
"done": true,
"response": {
"@type": "type.googleapis.com/google.cloud.healthcare.v1.fhir.ApplyConsentsResponse",
"consentApplySuccess": "2",
"affectedResources": "5"
}
}
התגובה הזו מציינת שהשרת עיבד בהצלחה 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/v1/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` של Operation](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get):
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
כשהפעולה מסתיימת, השרת מחזיר תגובה עם סטטוס הפעולה בפורמט JSON:
{
"name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"",
"metadata": {
"@type": "type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata",
"apiMethodName": "google.cloud.healthcare.v1.fhir.FhirStoreService.ApplyAdminConsents",
"createTime": "CREATE_TIME",
"endTime": "END_TIME",
"logsUrl": "https://console.cloud.google.com/logs/query/CLOUD_LOGGING_URL",
"counter": {
"success": "1",
"secondarySuccess": "7"
}
},
"done": true,
"response": {
"@type": "type.googleapis.com/google.cloud.healthcare.v1.fhir.ApplyAdminConsentsResponse",
"consentApplySuccess": "1",
"affectedResources": "7"
}
}
התשובה הזו מציינת שהשרת עיבד בהצלחה מדיניות אדמין אחת ועדכן את הגישה בהסכמה ל-7 משאבים (1 רופא, 1 מטופל, 2 תצפיות, 2 הסכמות של מטופלים ומדיניות אדמין אחת).
האכיפה של הסכמות שמאוחסנות במאגר FHIR תיכנס לתוקף רק אחרי שהפונקציה ApplyConsents (להסכמות של מטופלים) או ApplyAdminConsents (למדיניות אדמין ולמדיניות אדמין מדורגת) תופעל ותושלם בהצלחה. אם תוסיפו, תשנו או תסירו הסכמות אחרי שתפעילו את הפונקציה ApplyConsents או ApplyAdminConsents, תצטרכו להפעיל אותה שוב כדי שההסכמות האלה ייכללו במודל האכיפה.
משאבי FHIR עוברים אינדוקס באופן אסינכרוני, ולכן יכול להיות עיכוב קל בין השלמת הפעולה של ApplyConsents או ApplyAdminConsents לבין השתקפות מודל האכיפה בתוצאות החיפוש. העיכוב הזה צפוי רק לבקשות חיפוש.
אם זו הפעם הראשונה שאתם מגדירים אכיפת הסכמה במאגר FHIR, צריך להמתין עד שהפעולה ארוכת הטווח ApplyConsents או ApplyAdminConsents תסתיים לפני ששולחים בקשות עם תמיכה מובנית בסטטוס הסכמה.
כדי להתקשר באמצעות ApplyConsents לחלק מהמטופלים, אפשר להשתמש במסננים הבאים:
PatientScope: כדי להריץ אתApplyConsentsעל רשימה של מזהי מטופלים עם עד 10,000 מטופלים
TimeRange: כדי להריץ אתApplyConsentעל רשימה של מזהי משאבי Patient שמשאבי Consent שלהם מתעדכנים במהלך טווח זמן מסוים
כדי להתקשר אל ApplyAdminConsents: צריך לספק את הרשימה המלאה של כל כללי המדיניות שרוצים להחיל (לא רשימה מצטברת). כתוצאה מכך, רשימה ריקה תבטל את האכיפה של כל מדיניות האדמין בחנות. כל כלל מדיניות צריך להיות שם של גרסת משאב אם מאגר FHIR הוא בעל גרסאות, ושם של משאב אחרת.
אפשר להשתמש בשיטה operations.get כדי לאחזר את ProgressCounter של הפעולה. בסיום התהליך, מוחזר ApplyConsentsResponse שכלול ב-Operation.response.
הדלפקים ב-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: מייצג את מזהה המשאב של משאב ההסכמה
lastUpdated: מייצג את הזמן שבו ההסכמה נאכפה לאחרונה
versionId: מייצג את מזהה הגרסה שמשמש לאכיפת הסכמה
consent-enforcement-status: מייצג את הסטטוס של אכיפת ההסכמה
CheckPatientConsentEnforcementStatus: מחזירהBundle(STU3, R4) שלParameters(STU3, R4) resource שכולל את סטטוס האכיפה של כל ההסכמות של מטופל יחיד
במקרה של מדיניות אדמין, אפשר להשתמש ב-CheckConsentEnforcementStatus רק כדי לבדוק את סטטוס האכיפה של מדיניות אדמין אחת בנושא הסכמה. לחלופין, אפשר להשתמש ב-fhirStores.get כדי לראות את כל מדיניות האדמין הפעילה שחלה על החנות.
סטטוס אכיפת ההסכמה
הערך של consent-enforcement-status יכול להיות כל אחד מהערכים הבאים:
OFF: מייצג את סטטוס האכיפה שמוגדר כברירת מחדל של משאב הסכמה חדש שמעולם לא עבר עיבוד.
ENFORCEABLE: המצב שבו משאב ההסכמה עבר עיבוד בהצלחה.
INACTIVE: מצב לא פעיל שבו המערכת מתעלמת ממשאב ההסכמה.
UNSUPPORTED: המצב של משאב Consent (הסכמה) שעשוי להיות תואם למפרטים של FHIR, אבל לא ניתן לאכיפה. הסיבה לכך היא יישום מוגבל של אכיפת ההסכמה ב-FHIR עם רמת התמיכה הנוכחית בתכונות.
ENFORCEMENT_LIMIT_EXCEEDED: המצב שבו פורמט משאב ההסכמה של FHIR ורמת התמיכה במשאב הם ללא שגיאות, אבל אחד או יותר מהתנאים הבאים מתקיימים:למטופל יש קבוצה גדולה של משאבי הסכמה.
הגודל של הוראות ההסכמה בכל ההסכמות הפעילות גדול מהגודל המקסימלי המותר של הוראות ההסכמה בשרת FHIR כדי לאכוף אותן.
חיפוש עם הקשר של הסכמה
Cloud Healthcare API תומך בחיפושים של משאבי FHIR בחנות FHIR נתונה עם actor, purpose ו-environment כפרמטרים של שאילתות. התשובה מכילה רק את המשאבים שהמשתמש הסכים לשתף.
חיפוש משאבי 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?status=final"
אתם אמורים לקבל תגובת JSON שדומה לזו:
{
"entry": [
{
"fullUrl": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa",
"resource": {
"code": {
"coding": [
{
"code": "718-7",
"display": "Hemoglobin [Mass/volume] in Blood",
"system": "http://loinc.org"
}
]
},
"effectivePeriod": {
"start": "2021-12-10T05:30:10+01:00"
},
"id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
"issued": "2021-12-10T13:30:10+01:00",
"meta": {
"lastUpdated": "2022-09-01T17:31:40.423469+00:00",
"source": "http://example.com/HappyHospital",
"versionId": "VERSION_ID"
},
"resourceType": "Observation",
"status": "final",
"subject": {
"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
},
"valueQuantity": {
"code": "g/dL",
"system": "http://unitsofmeasure.org",
"unit": "g/dl",
"value": 7.2
}
},
"search": {
"mode": "match"
}
}
],
"link": [
{
"relation": "search",
"url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
},
{
"relation": "first",
"url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
},
{
"relation": "self",
"url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
}
],
"resourceType": "Bundle",
"total": 1,
"type": "searchset"
}
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?subject:Patient.name=Darcy"
אתם אמורים לקבל תגובת JSON שדומה לזו:
{
"link": [
{
"relation": "search",
"url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy"
},
{
"relation": "first",
"url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy"
},
{
"relation": "self",
"url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy"
}
],
"resourceType": "Bundle",
"total": 0,
"type": "searchset"
}
השאילתה הקודמת היא חיפוש משורשר. מכיוון שהגישה לתרחיש ההסכמה actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123 נדחתה עבור משאב המטופל Darcy (שמזוהה על ידי 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/v1/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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/68583624-9921-4158-8754-2a306c689abd",
"resource": {
"code": {
"coding": [
{
"code": "15074-8",
"display": "Glucose [Moles/volume] in Blood",
"system": "http://loinc.org"
}
]
},
"effectivePeriod": {
"start": "2021-12-01T05:30:10+01:00"
},
"id": "68583624-9921-4158-8754-2a306c689abd",
"issued": "2021-12-01T13:30:10+01:00",
"meta": {
"lastUpdated": "2022-09-01T17:31:40.423469+00:00",
"versionId": "VERSION_ID"
},
"resourceType": "Observation",
"status": "final",
"subject": {
"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
},
"valueQuantity": {
"code": "mmol/L",
"system": "http://unitsofmeasure.org",
"unit": "mmol/l",
"value": 6.3
}
},
"search": {
"mode": "match"
}
},
{
"fullUrl": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa",
"resource": {
"code": {
"coding": [
{
"code": "718-7",
"display": "Hemoglobin [Mass/volume] in Blood",
"system": "http://loinc.org"
}
]
},
"effectivePeriod": {
"start": "2021-12-10T05:30:10+01:00"
},
"id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
"issued": "2021-12-10T13:30:10+01:00",
"meta": {
"lastUpdated": "2022-09-01T17:31:40.423469+00:00",
"source": "http://example.com/HappyHospital",
"versionId": "VERSION_ID"
},
"resourceType": "Observation",
"status": "final",
"subject": {
"reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
},
"valueQuantity": {
"code": "g/dL",
"system": "http://unitsofmeasure.org",
"unit": "g/dl",
"value": 7.2
}
},
"search": {
"mode": "match"
}
}
],
"link": [
{
"relation": "search",
"url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy"
},
{
"relation": "first",
"url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy"
},
{
"relation": "self",
"url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy"
}
],
"resourceType": "Bundle",
"total": 2,
"type": "searchset"
}
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 purp/v3/TREAT purp/v3/HRESCH" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation?status=final"
אתם אמורים לקבל תגובת 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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner?"
הבדיקות של ההסכמה דולגו כי bypass סופק. אתם אמורים לקבל תגובת JSON שדומה לזו:
{
"entry": [
{
"fullUrl": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/12942879-f89f-41ae-aa80-0b911b649833",
"resource": {
"active": true,
"birthDate": "1970-05-23",
"gender": "male",
"id": "12942879-f89f-41ae-aa80-0b911b649833",
"meta": {
"lastUpdated": "2022-09-01T17:31:40.423469+00:00",
"versionId": "VERSION_ID"
},
"name": [
{
"family": "Brown",
"given": [
"Jeffrey"
],
"use": "official"
}
],
"resourceType": "Practitioner"
},
"search": {
"mode": "match"
}
}
],
"link": [
{
"relation": "search",
"url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
},
{
"relation": "first",
"url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
},
{
"relation": "self",
"url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
}
],
"resourceType": "Bundle",
"total": 1,
"type": "searchset"
}
קבלת משאב עם הקשר של הסכמה
Cloud Healthcare API תומך באחזור משאב FHIR בחנות FHIR נתונה עם actor, purpose ו-environment כפרמטרים של שאילתה. התשובה מכילה רק את המשאבים שהמשתמש הסכים לשתף.
קבלת משאבי 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). - הרופא ג'פרי בראון (מזוהה על ידי
Practitioner/12942879-f89f-41ae-aa80-0b911b649833), שעורך מחקר ביו-רפואי באמצעות אפליקצייתApp/golden, קורא את תאריך הלידה של דרסי (בדוגמה הזו,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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"
מכיוון שהמבקש קיבל הסכמה, התשובה היא התוכן של משאב ה-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
}
}
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "X-Consent-Scope: actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/unknown" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa"
הבקשה נדחית כי הגישה של מגיש הבקשה (`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/v1/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/v1/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
היקפי ההסכמה מועברים אל Cloud Healthcare API באמצעות כותרת ה-HTTP X-Consent-Scope. ממשק Cloud Healthcare API משתמש בכותרת הזו כדי לאכוף בקרת גישה מבוססת-הסכמה לנתונים במאגרי FHIR.
בקשת FHIR יכולה לתמוך במספר מוגבל של היקפי רשומות הסכמה. אפשר לכלול בבקשת FHIR נתונה עד שלושה ערכים של actor, ערך אחד של purp וערך אחד של env.
במקרה של היקפי הרשאות מיוחדים, בקשת FHIR יכולה לתמוך באחת מהאפשרויות הבאות: btg או bypass.
הגדרת כותרות HTTP לאפליקציות מהימנות
הקטע הזה נדרש רק אם משתמשים בשרת הרשאות שנמצא בשליטת הלקוח. במקרה כזה, צריך להשתמש גם ב-SMARTproxy או ב-proxy דומה.
אפליקציות מהימנות מסוימות יכולות לבצע קריאות ישירות ל-Cloud Healthcare API עם היקפי ההסכמה שצוינו בכותרת ה-HTTP. ההגדרה הזו מאפשרת לאכוף את ההסכמה ישירות בלי שיהיה צורך ב-SMARTproxy או ב-proxy אחר כדי לבצע המרה בין שרתי הרשאה חיצוניים לבין Google Cloud.
לדוגמה, יכול להיות שהאפליקציה שלכם רשומה עבור קבוצת משנה של היקפי הרשאות, כמו היקף הרשאות של אפליקציה environment, או שהאפליקציה מציגה ווידג'ט בחירה כדי להגדיר כמה רשומות של היקפי הרשאות, כמו purpose של בעל הגישה.
משתמש מהימן או אפליקציה מהימנה יכולים גם להשתמש בערכי ההיקף btg או bypass, שחלים עליהם ביקורות לאחר ביצוע השינויים.
הגדרת שרת ההרשאות להיקפי הרשאות להסכמה
Cloud Healthcare API מספק תמיכה מובנית באכיפת הסכמה של FHIR על סמך היקפי ההסכמה של הקלט. אדמינים של מאגר FHIR אחראים ליצירה ולהגדרה של שרת הרשאות מחוץ ל-Cloud Healthcare API, שמעניק היקפי הרשאה.
דוגמה לטוקן גישה
בדוגמה הבאה מוצג אסימון גישה שמקודד ב-base64:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpc3MiOiJjb25zZW50LnRva2VuLm9yZyIsImlhdCI6MTYxMjg4NDA4NSwiZXhwIjoxNjQ0NDIwMDg1LCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJkb2N0b3IuZ2FicmllbGFAZXhhbXBsZS5jb20iLCJzY29wZSI6Im9pZGMgYWN0b3IvUHJhY3RpdGlvbmVyLzEyMyBhY3Rvci9Hcm91cC85OTkgcHVycC92My9UUkVBVCBlbnYvQXBwL2FiYyJ9.fC7ljkVUUx8fwUOrJuONcrqA-WKC-k_Bclzlgds0Cq6H_gEe3nUjPlSOCTQsIdYB
אחרי שמפענחים את אסימון הגישה, אפשר לראות שהוא מכיל את מטען הייעודי (payload) הבא:
{
"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 שמספק את התכונות הבאות:
מאפשרת לשרת FHIR של Cloud Healthcare API לקבל ולאמת אסימוני גישה עם תמיכה מובנית בסטטוס הסכמה.
מאפשר להטמעת FHIR ב-Cloud Healthcare API לכלול טוקנים של גישה עם תמיכה מובנית בסטטוס הסכמה כחלק ממודל הניהול והרשאות של Cloud Healthcare API.
הוא תומך גם בתכונות של טוקנים לתמיכה ב-SMART on FHIR.
כששולחים בקשה לאחזור נתונים מ-Cloud Healthcare API דרך SMARTProxy, מתרחש התהליך הבא:
SMARTProxy מקבל בקשה מלקוח שמכילה אסימון עם תמיכה מובנית בסטטוס הסכמה.
SMARTProxy מאמת את האסימון עם תמיכה מובנית בסטטוס הסכמה באמצעות שרת הרשאות JWT שנמצא בבעלותכם.
SMARTProxy קורא את ההיקפים מהאסימון עם תמיכה מובנית בסטטוס הסכמה ומעביר אותם ל-Cloud Healthcare API דרך כותרת ה-HTTP.
Cloud Healthcare API מקבל את הכותרות ומאמת אותן כדי לאכוף את הנחיות ההסכמה בבקשה. לאחר מכן, Cloud Healthcare API מחזיר תגובה דרך SMARTProxy ללקוח.
הגדרת Google Cloud חשבון שירות
לשרת proxy יכול להיות רק חשבון שירות אחד. Google Cloud אם כמה לקוחות משתמשים באותו שרת proxy, הם ישתמשו באותו חשבון שירות. חשוב לנקוט משנה זהירות כשמשתפים חשבון שירות עם כמה לקוחות, מהסיבות הבאות:
כדי לקרוא את נתוני FHIR ב-Cloud Healthcare API, אפשר להגדיר לחשבון השירות הרשאות קריאה וכתיבה רחבות. מידע נוסף על הרשאות זמין במאמר שליטה בגישה למשאבים ב-Cloud Healthcare API. במאמר שיטות מומלצות כלליות מוסבר איך להגדיר שרת proxy.
יומני הביקורת של Cloud
כתובת האימייל של החשבון הראשי מקושרת לחשבון השירות.
לדוגמה, אם אתם קוראים ל-Cloud Healthcare API ישירות באמצעות חשבון Google שלכם לאימות, יומני הביקורת של Cloud ירשמו את כתובת האימייל שלכם ככתובת האימייל העיקרית. כשמשתמשים בשרת proxy כדי לקרוא ל-Cloud Healthcare API, ה-proxy משתמש בחשבון השירות שלו, וכתובת האימייל של הגורם המבצע היא כתובת האימייל של חשבון השירות. החשבון המקורי לא מוגדר.
יומני ביקורת
יומני ביקורת נוצרים כשמתקבלת בקשת גישה או כשמשתנה אכיפת הגישה למשאבים.
גישה ליומני ביקורת
אם הפעלתם יומני ביקורת במאגר FHIR, שדה המטא-נתונים consentMode ייכלל ביומני הביקורת שזמינים ב-Cloud Logging. הערך consentMode יכול להיות אחד מהערכים הבאים:
off: בהגדרות של מאגר FHIR, הערך שלconsentConfig.accessEnforcedהואfalse, ולכן לא ניתן לשלוח בקשות עם תמיכה מובנית בסטטוס ההסכמה.
emptyScope: הערך שלconsentConfig.accessEnforcedבמאגר FHIR הואtrue, אבל לא נכלל שורת כותרות של היקף ההסכמה. כתוצאה מכך, לא נאכפו הסכמות.
enforced: הערך שלconsentConfig.accessEnforcedבמאגר FHIR הואtrue, ושורת הכותרות של היקף ההסכמה הייתה קיימת. כתוצאה מכך, ההסכמות הוערכו ונאכפו בבקשה.
btg: הבקשה ל-FHIR כללה אתbtgבכותרת של היקף ההסכמה. כתוצאה מכך, בדיקות ההסכמה דולגו. הבקשה הזו מיועדת לשימוש במקרי חירום בלבד, והיא כפופה לבדיקה לאחר הביצוע.
bypass: בבקשת FHIR צוין רקbypassבכותרת של היקף ההסכמה. כתוצאה מכך, דילגנו על בדיקות ההסכמה. הבקשה הזו מיועדת לשימוש בתהליך עבודה מהימן (כמו אדמין או אפליקציה מהימנה, ולא משתמשי קצה), כך שיומן הביקורת הזה שונה מbtg, שמשמש לבדיקות של משילות מידע (data governance).
אפשר גם להגדיר את 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במקביל. מומלץ לבצע אותן אחת אחרי השנייה.אם תהליכי העבודה שלכם מחייבים קריאה לכמה
ApplyConsentsב-PatientScopeלא רציפים, אפשר לקרוא להם במקביל.אפשר להריץ את
ApplyAdminConsentsבמקביל לכל מספר שלApplyConsents, אבל לא במקביל ל-ApplyAdminConsentsאחר.כשמגדירים את ה-proxy, צריך להגביל את חשבון השירות של IAM להרשאות קריאה בלבד, כדי למנוע כתיבה של נתונים של מטופל אחד לרשומות של מטופל אחר.
כשיוצרים או מעדכנים רשומות, לא משתמשים בשרת proxy להעברת הסכמה.
אימות של כל בקשות הכתיבה כדי למנוע שינוי לא צפוי של נתונים של מטופלים שונים.
כשמפעילים את האפשרות 'העברת הסכמה', צריך לייבא קודם את משאבי הבסיס של התאים, ואז את שאר משאבי התאים. אפשרות אחרת היא לארוז את כל משאבי התאים בחבילה אחת ולהעביר אותם באמצעות
fhir.executeBundle.
מחיקת משאב של מטופל
כשמוחקים משאב Patient, אם רוצים להסיר גם את אכיפת ההסכמה עבור אותו מטופל (במיוחד אם הערך של FhirStore.disableReferentialIntegrity הוא true), מומלץ לבצע את הפעולות בסדר הבא:
מחיקת כל משאבי ההסכמה ששייכים למשאב המטופל.
מתקשרים אל
ApplyConsentsבאמצעות המסנןPatientScope.
הגדרה של גישת הסכמה בחנות קיימת
כדי להגדיר חנות קיימת לגישה להסכמה, מבצעים את השלבים הבאים:
משתמשים ב-
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/v1/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/v1/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/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyAdminConsents"
כל כמה זמן להריץ את הפונקציות ApplyConsents או ApplyAdminConsents
כשהשדה
ConsentConfigלא מוגדר: השדהConsentConfigלא מוגדר גם כשיוצרים מאגר FHIR חדש וגם כשמסירים את ההגדרה של השדהConsentConfig. אחרי שמבטלים את ההגדרה של השדהConsentConfig, צריך לחזור על השלבים של הגדרת הגישה לחנות לצורך קבלת הסכמה לפני ששולחים בקשות עם תמיכה מובנית בסטטוס הסכמה, כדי להימנע מהערכה של מדיניות אכיפה לא עדכנית בנושא הסכמה.כשמודל האכיפה משתנה: כשיוצרים, מעדכנים או מוחקים משאב הסכמה, מודל האכיפה משתנה. במקרים כאלה, כדי שהשינויים ייכנסו לתוקף, צריך להתקשר אל
ApplyConsentsאו אלApplyAdminConsents.אם אתם יכולים לעקוב אחרי השינויים בסטטוס ההסכמה של המטופלים, מומלץ להשתמש במסנן
PatientScopeכדי להימנע מעיבוד מחדש של כל החנות. המסנן הזה שימושי לרענון מיידי של האכיפה לגבי קבוצה קטנה של מטופלים.אפשר גם להריץ את
ApplyConsentsמעת לעת באמצעות המסנןTimeRange. המסנן הזה שימושי כשאין צורך ברענון מיידי. לדוגמה, הבקשה הבאה מרעננת את האכיפה של שינויים בהסכמה בין השעות 00:00 UTC ב-20 בספטמבר 2022 לבין השעה 00:00 UTC ב-21 בספטמבר 2022.curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json" \ --data "{ 'validateOnly': false, 'timeRange': { 'start': '2022-09-20T00:00:00Z', 'end': '2022-09-21T00:00:00Z', } }" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"
שימוש בתצוגת ההסכמה של FHIR
ב-FHIR Consent Viewer מוצגת מדיניות בקרת גישה. הוא מספק טבלה שמכילה היקפי הסכמה שמייצגים כללי בקרת גישה של FHIR.
לפני שמשתמשים ב-FHIR Consent Viewer, צריך לוודא את הדברים הבאים:
ההגדרה של מאגר FHIR
disableResourceVersioningצריכה להיותfalse. אי אפשר לשנות את ההגדרה הזו אחרי שיוצרים את מאגר FHIR. כדי ליצור מאגר FHIR חדש, אפשר לעיין במאמר יצירת מאגר FHIR.מאגר FHIR מוגדר לאכיפת הסכמה.
כדי לראות את FHIR Consent Viewer, פועלים לפי השלבים הבאים:
המסוף
נכנסים לדף Browser במסוף Google Cloud .
בוחרים את מערך הנתונים שמכיל את מאגר FHIR שרוצים לראות את מדיניות ההסכמה שנאכפת בו.
בדף Data stores, ברשימה Data stores, בוחרים את מאגר ה-FHIR שרוצים לראות את מדיניות ההסכמה שנאכפת בו.
בדף פרטי מאגר הנתונים, לוחצים על הכרטיסייה הסכמה. מוצגים היקפי ההסכמה.