Cloud Healthcare API에서 FHIR 리소스에 대한 액세스 제어

이 페이지에서는 FHIR 동의 리소스를 사용하여 Cloud Healthcare API에서 FHIR 저장소의 데이터 액세스를 확인하는 방법을 설명합니다.

동의 시행으로 FHIR 저장소를 구성하려면 다음 단계를 완료합니다.

  1. FHIR 저장소가 아직 없으면 만듭니다.

  2. 동의 시행을 사용 설정하기 위해 다음 FHIR 저장소의 ConsentConfig 매개변수를 설정합니다.

    • version: FHIR 저장소에 사용할 동의 시행 버전을 지정합니다. CreateFhirStore 또는 UpdateFhirStore에서 이 값을 한 번만 설정할 수 있습니다. 설정한 후에 버전을 변경하려면 ApplyConsents 또는 ApplyAdminConsents를 호출해야 합니다.

    • access_enforced: true로 설정하면 FHIR 리소스에 액세스할 때 제공된 동의 헤더를 소비자가 제공한 동의 지시문과 확인합니다.

    • consent_header_handling: PERMIT_EMPTY_SCOPE(기본값)로 설정된 경우 서버에서 X-Consent-Scope 헤더가 없거나 비어 있는 요청을 허용합니다. REQUIRED_ON_READaccess_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를 사용하여 동의 시행 versionV1ConsentConfig를 설정하고 accessEnforcedtrue로 설정합니다.

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)을 실행하여 다음 리소스를 채우는 방법을 보여줍니다.

  • 제프리 브라운이라는 이름의 실무자 리소스
  • 다르시 스미스라는 이름의 환자 리소스
  • 행복 병원에서 수집한 다르시 환자의 헤모글로빈 측정 수치를 보여주는 관찰 리소스(LOINC718-7)
  • 다르시 환자의 혈당 측정 수치를 보여주는 관찰 리소스(LOINC15074-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/e001Encounter 유형입니다.
  • 소스 http://somesystem.example.org/foo에서 제공됩니다.
  • 태그의 다음 조건 중 하나 이상을 충족합니다(Meta.tagsystemcode 필드를 설정하여 리소스에 태그를 지정할 수 있음).
    • 태그(system = http://terminology.hl7.org/CodeSystem/common-tagscode = actionable)가 있음
    • 태그(system = http://example.com/custom-tagscode = archived) 태그(system = http://example.com/custom-tagscode = insensitive)가 모두 있음
  • 다음 보안 라벨 중 하나 이상이 있음
    • system = http://terminology.hl7.org/CodeSystem/v3-Confidentiality이고, codeR, N, M, L, U 중 하나입니다.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCodecode = 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/e001Encounter 유형입니다.
  • 소스 http://somesystem.example.org/foo에서 제공됩니다.
  • 태그에서 다음 조건 중 하나를 충족합니다.
    • 태그(system = http://terminology.hl7.org/CodeSystem/common-tagscode = actionable)가 있음
    • 태그(system = http://example.com/custom-tagscode = archived) 태그(system = http://example.com/custom-tagscode = insensitive)가 모두 있음
  • 다음 보안 라벨 중 하나 이상이 있음
    • system = http://terminology.hl7.org/CodeSystem/v3-Confidentiality이고, codeR, N, M, L, U 중 하나입니다.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCodecode = 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에서 오류 로그를 보거나 validateOnlyfalse이면 CheckConsentEnforcementStatus 또는 CheckPatientConsentEnforcementStatus를 사용하여 동의 시행 상태를 검사하여 오류 세부정보를 검색할 수 있습니다.
secondarySuccess affectedResources validateOnlyfalse이면 동의 변경의 효과로 인해 성공적으로 다시 색인이 생성된 FHIR 리소스의 수를 나타냅니다.
secondaryFailure failedResources validateOnlyfalse이면 동의가 변경될 수 있지만 색인을 재생성할 수 없는 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 리소스에 대한 검색을 지원합니다. 응답에는 동의된 리소스만 포함됩니다.

  1. 실무자인 제프리 브라운(Practitioner/12942879-f89f-41ae-aa80-0b911b649833으로 식별)이 신뢰할 수 있는 애플리케이션 App/123을 사용하여 status=final로 모든 관찰값을 검색합니다.
  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/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"
    }
    
  3. 실무자인 제프리 브라운(Practitioner/12942879-f89f-41ae-aa80-0b911b649833으로 식별됨)이 애플리케이션 App/123을 사용하여 다르시 환자의 모든 관찰값을 검색합니다.
  4. 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 서버는 환자가 존재하지 않는 것처럼 환자로부터 관찰값을 반환하지 않습니다.

  5. 실무자인 제프리 브라운(Practitioner/12942879-f89f-41ae-aa80-0b911b649833으로 식별)이 응급 치료 목적으로 애플리케이션 App/123을 사용하여 다르시 환자의 모든 관찰값을 검색합니다.
  6. 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"
    }
    
  7. 실무자인 제프리 브라운(Practitioner/12942879-f89f-41ae-aa80-0b911b649833으로 식별됨)이 치료 연구의 두 가지 목적으로 status=final인 관찰값을 검색합니다.
  8. 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`에서 불필요한 목적을 삭제해야 합니다.

  9. 병원 IT 관리자는 bypass를 사용하여 병원의 모든 실무자를 검색합니다.
  10. 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 리소스를 가져오는 것을 지원합니다. 응답에는 동의된 리소스만 포함됩니다.

  1. 실무자인 제프리 브라운(Practitioner/12942879-f89f-41ae-aa80-0b911b649833으로 식별)이 애플리케이션 App/123을 사용하여 환자의 헤모글로빈 측정 수치를 읽습니다(이 예시에서는 Observation/7473784b-46a8-470c-b9a6-fe38a01025aa).
  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/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
      }
    }
    
  3. 실무자인 제프리 브라운(Practitioner/12942879-f89f-41ae-aa80-0b911b649833으로 식별됨)이 알 수 없는 애플리케이션 App/unknown을 사용하여 환자의 헤모글로빈 측정 수치를 읽습니다(이 예시에서는 Observation/7473784b-46a8-470c-b9a6-fe38a01025aa).
  4. 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"
    }
    
  5. App/golden 애플리케이션을 사용해서 생물 의학 연구를 수행하는 실무자 제프리 브라운(Practitioner/12942879-f89f-41ae-aa80-0b911b649833으로 식별)이 다르시의 생년월일(이 예시에서는 Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2) 정보를 읽습니다.
  6. 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"
    }
    
  7. 실무자인 제프리 브라운(Practitioner/12942879-f89f-41ae-aa80-0b911b649833로 식별)은 '긴급 상황' 프로토콜을 사용하여 환자 레코드에 대한 긴급 무단 액세스를 요청합니다. (이 예시에서는 Observation/7473784b-46a8-470c-b9a6-fe38a01025aa)
  8. 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에서 데이터를 검색하도록 요청하면, 다음이 수행됩니다.

  1. SMARTProxy가 동의 인식 토큰이 포함된 클라이언트의 요청을 수락합니다.

  2. SMARTProxy가 사용자 소유 JWT 승인 서버를 통해 동의 인식 토큰을 검증합니다.

  3. SMARTProxy는 동의 인식 토큰에서 범위를 읽고 HTTP 헤더를 통해 Cloud Healthcare API로 전달합니다.

  4. Cloud Healthcare API는 헤더를 수신하고 이를 검증하여 요청에 대해 동의 지시문을 시행합니다. 그런 후 Cloud Healthcare API가 SMARTProxy를 통해 클라이언트에 응답을 반환합니다.

Google Cloud 서비스 계정 구성

프록시에는 Google Cloud 서비스 계정이 하나만 포함될 수 있습니다. 여러 클라이언트에 동일한 프록시가 사용되는 경우 클라이언트에 동일한 서비스 계정이 사용됩니다. 다음과 같은 이유로 여러 클라이언트와 서비스 계정을 공유할 때는 주의해야 합니다.

예를 들어 인증을 위해 Google 계정을 사용하여 Cloud Healthcare API를 직접 호출할 경우 Cloud 감사 로그가 이메일 주소를 주 구성원 이메일 주소로 로깅합니다. 프록시를 사용하여 Cloud Healthcare API를 호출하면 프록시에 해당 고유 서비스 계정이 사용되고, 주 구성원 이메일 주소가 서비스 계정의 이메일 주소가 되고, 원본 계정은 정의되지 않습니다.

감사 로그

감사 로그는 액세스 요청이 있거나 리소스의 액세스 시행이 변경될 때 생성됩니다.

감사 로그 액세스

감사 로그가 FHIR 저장소에 사용 설정되어 있는 경우 consentMode 메타데이터 필드가 Cloud Logging에서 제공되는 감사 로그에 포함됩니다. consentMode는 다음 값 중 하나를 포함할 수 있습니다.

  • off: FHIR 저장소 구성에서 consentConfig.accessEnforcedfalse로 설정되고 동의 인식 요청을 허용하지 않습니다.

  • emptyScope: FHIR 저장소에서 consentConfig.accessEnforcedtrue로 설정되었지만 동의 범위 헤더가 포함되지 않았습니다. 따라서 동의가 시행되지 않았습니다.

  • enforced: FHIR 저장소에서 consentConfig.accessEnforcedtrue로 설정되었고 동의 범위 헤더가 제공되었습니다. 따라서 동의가 평가되었고 요청에 의해 시행되었습니다.

  • btg: FHIR 요청에서 동의 범위 헤더에 btg를 제공했습니다. 따라서 동의 검사를 건너뛰었습니다. 이 요청은 긴급 상황에만 사용되며 감사 후 검토에만 적용됩니다.

  • bypass: FHIR 요청에서 동의 범위 헤더에 bypass만 제공했습니다. 따라서 동의 검사를 건너뛰었습니다. 이 요청은 신뢰할 수 있는 워크플로(예: 관리자 또는 신뢰할 수 있는 애플리케이션)에게 사용되므로 이 감사 로그는 데이터 거버넌스 검사에 사용되는 btg와 다릅니다.

원하는 경우 access_determination_log_configVERBOSE로 설정하여 요청이 부여되거나 거부된 이유에 대한 자세한 정보를 기록할 수 있습니다.

액세스 시행 변경 감사 로그

구획 기본 리소스가 변경되는 경우(예: 환자의 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에 동일한 제약조건과 한도가 적용됩니다.

유형 제약조건 및 한도
단일 동의 리소스
  • 단일 Consent.provision만 지원되며 여러 프로비전이나 중첩된 프로비전은 지원되지 않습니다.
  • Consent.provision.actor 최소 1개 이상, 최대 25개:
    • Consent.provision.actor.rolehttp://terminology.hl7.org/CodeSystem/v3-RoleCode여야 합니다.
    • Consent.provision.actor.codeGRANTEE 또는 HPOWATT이어야 합니다.
  • Consent.provision.purpose 최대 1개:
    • Consent.provision.purpose.systemhttp://terminology.hl7.org/CodeSystem/v3-ActReason여야 합니다.
    • Consent.provision.purpose.code는 비어 있지 않으며 최대 13자(영문 기준)입니다.
  • 최대 1개 environment:
    • Consent.provision.extension.urlhttps://g.co/fhir/medicalrecords/Environment여야 합니다.
    • 시스템과 코드를 결합한 길이는 15자(영문 기준) 미만이어야 합니다.
  • 리소스 유형을 기준으로 필터링하는 경우 Consent.provision.class.systemhttp://hl7.org/fhir/resource-types여야 합니다.
  • 데이터 소스를 기준으로 필터링하는 경우 Consent.provision.extension.urlhttps://g.co/fhir/medicalrecords/DataSource여야 합니다.
  • 데이터 태그를 기준으로 필터링하는 경우 Consent.provision.extension.urlhttps://g.co/fhir/medicalrecords/DataTag여야 합니다.
    • 데이터 태그는 지정된 모든 태그(결합하여 해석됨)로 리소스를 매칭하는 정책을 기술하도록 하나의 수준에 중첩된 복잡한 확장 프로그램일 수 있습니다.
    • 중첩 태그는 최대 5개까지 지원됩니다.
  • 이 행에서 다르게 설명하지 않는 한 반복되는 모든 속성의 값은 최대 100개입니다.
시행 모델
  • 환자마다 한 번에 active 동의 리소스 최대 200개까지 시행할 수 있습니다.
  • 각 저장소에는 최대 200개의 active 관리자 정책이 한 번에 시행될 수 있습니다.
  • 특정 환자의 모든 활성 동의에 대한 모든 동의 지시문 집합의 특수한 압축 형식이 설정한 크기 기준점을 초과하지 않아야 합니다. 일반적으로 특별히 매우 긴 리소스 문자열이 많지 않은 한 동의 지시문을 수천 개까지 인코딩할 수 있습니다. 예를 들면 다음과 같습니다.
    • 고유한 데이터 소스와 데이터 태그에 대한 동의 수백 개는 각각 매우 긴 공간을 많이 소비합니다.
    • 각각 고유한 Consent.provision.actor를 지정하는 여러 활성 동의에서 고유한 Consent.provision.data.reference 리소스 식별자가 3,000개 있는 단일 환자는 데이터 참조 제약조건을 지정하지 않거나 동일한 작업자 참조 문자열이 많이 포함된 프로비저닝보다 더 적극적으로 공간을 사용합니다.
  • 리소스마다 적용 가능한 모든 동의에서 동의 지시문이 최대 1000개까지 있을 수 있습니다.
X-Consent-Scope
  • actor 항목 최소 1개, 최대 3개
  • purp 항목 최대 1개:
    • purp 항목은 system/code 형식이어야 합니다(v3http://terminology.hl7.org/CodeSystem/v3-ActReason에 등록된 시스템).
    • 코드 길이는 13자(영문 기준) 미만이어야 합니다.
  • env 항목 최대 1개:
    • env 항목은 system/code 형식이어야 합니다.
    • 시스템과 코드를 결합한 길이는 15자(영문 기준) 미만이어야 합니다.
  • btgactor 항목이 1개 이상 있어야 합니다.
  • bypass에는 최소한 actor 항목 1개와 env 항목 1개가 필요합니다.
지원되는 메서드
성능
  • ApplyConsentsApplyAdminConsentsImportResources와 비슷하거나 더 효과적인 방식으로 확장됩니다.
  • 동의 인식 요청 관련:
    • Google 동의 모델은 많은 리소스와 여러 환자에 대한 대규모 검색을 포함하여 CRUD 작업 시행 성능에 최적화되어 있습니다.
    • 개별 리소스 읽기는 요청 지연 시간에 약간 영향을 미칠 수 있지만 검색 성능은 기본 쿼리 및 검색 중에 활성화되는 더 많은 접근자 기준으로 이어지는 동의 범위 수에 따라 달라집니다.
    • 다양한 담당자 FHIR 요청 매개변수에 대해 자체 성능 테스트를 실행하여 FHIR 저장소에 있는 지정된 검색 리소스 유형의 리소스 수와 같은 데이터 특성을 기준으로 사용 사례 성능 특성을 결정하는 것이 좋습니다.
    • Google 솔루션은 수집 중 처리량과 같은 간단한 동의 리소스를 포함하여 모든 리소스를 수집하고 업데이트하며 기타 형태의 쓰기 트래픽이 영향을 최소한으로 받으면서 처리될 수 있습니다.

권장사항

다음 섹션에서는 FHIR 액세스 제어를 사용할 때의 권장사항을 설명합니다.

일반 권장사항

  • FHIR 리소스 가져오기ApplyConsents 또는 ApplyAdminConsents 호출을 동시에 수행하지 마세요. 먼저 FHIR 리소스를 가져온 후 ApplyConsents 또는 ApplyAdminConsents를 호출하는 것이 좋습니다. 하지만 가져올 리소스에 환자 또는 동의 리소스가 포함되지 않은 경우에는 시행 모델이 영향을 받지 않으며 동의 또는 관리자 정책 처리가 필요하지 않습니다.

  • 커스텀 검색 만들기ApplyConsents 호출을 동시에 수행하지 마세요. 하나씩 차례대로 수행하는 것이 좋습니다.

  • 워크플로에서 분리된 PatientScope에서 여러 ApplyConsents를 호출해야 하는 경우 이를 동시에 호출할 수 있습니다.

  • ApplyAdminConsents는 임의 개수의 ApplyConsents와 함께 동시에 실행될 수 있지만 다른 ApplyAdminConsents와 동시에 실행될 수는 없습니다.

  • 프록시를 설정할 때 한 환자의 데이터가 다른 환자의 레코드에 기록되지 않도록 읽기 전용 권한으로 IAM 서비스 계정을 제한합니다.

  • 레코드를 만들거나 업데이트할 때 동의 프록시를 사용하지 마세요.

  • 모든 쓰기 요청의 유효성을 검사하여 환자 간 데이터가 예기치 않게 수정되지 않도록 합니다.

  • 단계식 동의가 시행되면 구획 기본 리소스를 먼저 가져온 다음에 나머지 구획 리소스를 가져와야 합니다. 또는 모든 구획 리소스를 단일 번들 내에 래핑하고 fhir.executeBundle을 사용하여 수집할 수 있습니다.

환자 리소스 삭제

환자 리소스를 삭제할 때 환자의 동의 시행을 삭제하려면(특히 FhirStore.disableReferentialIntegrity가 true인 경우) 다음 작업 순서를 따르는 것이 좋습니다.

  1. 환자 리소스에 속하는 모든 동의 리소스를 삭제합니다.

  2. PatientScope 필터를 사용하여 ApplyConsents를 호출합니다.

동의 액세스를 위해 기존 저장소를 설정하려면 다음 단계를 수행합니다.

  1. UpdateFhirStore를 사용하여 ConsentConfig를 동의 시행 versionV1로 사용하도록 설정하고 accessEnforcedtrue로 설정합니다.

    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"
    
  2. 환자 동의 또는 관리자 정책 처리

    1. 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"
    
    1. 관리자 정책 및 관리자 단계식 정책을 위한 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"
      

다음 단계