Mengontrol akses ke resource FHIR di Cloud Healthcare API

Halaman ini menjelaskan cara menggunakan resource Izin FHIR untuk menentukan akses data dari penyimpanan FHIR di Cloud Healthcare API.

Untuk mengonfigurasi penyimpanan FHIR dengan penerapan izin, selesaikan langkah-langkah berikut:

  1. Buat penyimpanan FHIR jika Anda belum memilikinya.

  2. Tetapkan parameter ConsentConfig toko FHIR berikut untuk mengaktifkan penerapan izin:

    • version: Menentukan versi penerapan izin yang digunakan untuk penyimpanan FHIR. Nilai ini hanya dapat ditetapkan sekali oleh CreateFhirStore atau UpdateFhirStore. Setelah ditetapkan, Anda harus memanggil ApplyConsents atau ApplyAdminConsents untuk mengubah versi.

    • access_enforced: Jika ditetapkan ke true, saat mengakses resource FHIR, header izin yang diberikan akan diverifikasi berdasarkan perintah izin yang diberikan oleh konsumen.

    • consent_header_handling: Jika ditetapkan ke PERMIT_EMPTY_SCOPE (default), server akan mengizinkan permintaan tanpa (atau kosong) header X-Consent-Scope. Jika ditetapkan ke REQUIRED_ON_READ dan access_enforced = true, server akan menolak semua permintaan tanpa (atau kosong) header X-Consent-Scope.

Menyiapkan toko FHIR baru dengan ConsentConfig

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json" \
    --data "{
      'version': 'R4',
      'enableUpdateCreate': true,
      'consentConfig': {
        'version': 'V1',
        'accessEnforced': true
      }
    }" "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores?fhirStoreId=FHIR_STORE_ID"

Anda akan melihat respons JSON seperti berikut:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID",
  "version": "R4",
  "enableUpdateCreate": true,
  "consentConfig": {
    "version": "V1"
  }
}

Jika Anda sudah memiliki toko, gunakan UpdateFhirStore untuk menetapkan ConsentConfig dengan penerapan izin version sebagai V1 dan tetapkan accessEnforced ke true.

curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json" \
    --data "{
      'consentConfig': {
        'version': 'V1',
        'accessEnforced': true
      }
    }" "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?update_mask=consentConfig"

Kebijakan ditampilkan melalui Resource izin. Tujuan dan penggunaan kolom resource dijelaskan di Dokumen Model Data.

Berikut contoh dari semua resource yang dapat dibuat untuk contoh khusus ini.

Membuat resource FHIR

Contoh berikut menunjukkan cara mengeksekusi [paket FHIR](/healthcare-api/docs/how-tos/fhir-bundles) untuk mengisi resource berikut:

  • Referensi Praktisi dengan nama Jeffrey Brown
  • Referensi Pasien bernama Darcy Smith
  • Referensi Pengamatan yang menunjukkan pengukuran hemoglobin Darcy (LOINC718-7) yang dikumpulkan oleh Happy Hospital
  • Referensi Pengamatan yang menunjukkan pengukuran glukosa Darcy (LOINC15074-8).
  • Izin dari Darcy untuk mengizinkan Jeffrey Brown menggunakan aplikasi App/123 untuk mengakses datanya yang dikumpulkan oleh Happy Hospital
  • Persetujuan dari Darcy untuk mengizinkan Jeffrey Brown mengakses datanya untuk perawatan darurat (ETREAT)
  • Izin dari Happy Hospital untuk mengizinkan Jeffrey Brown mengakses semua data saat melakukan riset biomedis (BIORCH) dengan aplikasi 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/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir"

Anda akan melihat respons JSON seperti berikut:

{
  "entry": [
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/12942879-f89f-41ae-aa80-0b911b649833/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/68583624-9921-4158-8754-2a306c689abd/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/10998b60-a252-405f-aa47-0702554ddc8e/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/73c54e8d-2789-403b-9dee-13085c5d5e34/_history/VERSION_ID",
        "status": "201 Created"
      }
    },
    {
      "response": {
        "etag": "W/\"VERSION_ID\"",
        "lastModified": "2022-09-01T17:31:40.423469+00:00",
        "location": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/5c8e3f8a-9fd5-480d-a08e-f29b89feccde/_history/VERSION_ID",
        "status": "201 Created"
      }
    }
  ],
  "resourceType": "Bundle",
  "type": "transaction-response"
}

Berikut adalah lebih banyak contoh Resource izin R4 yang menunjukkan cara kebijakan kompleks ditampilkan.

{
  "resourceType": "Consent",
  "id": "patient-consent-example",
  "patient": {
    "reference": "Patient/f001"
  },
  "category": [
    {
      "coding": [
        {
          "system": "http://loinc.org",
          "code": "59284-0"
        }
      ]
    }
  ],
  "scope": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/consentscope",
        "code": "patient-privacy"
      }
    ]
  },
  "policyRule": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "OPTIN"
      }
    ]
  },
  "status": "active",
  "provision": {
    "type": "permit",
    "actor": [
      {
        "reference": {
          "reference": "Practitioner/f002"
        },
        "role": {
          "coding": [
            {
              "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode",
              "code": "GRANTEE"
            }
          ]
        }
      }
    ],
    "purpose": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason",
        "code": "TREAT"
      }
    ],
    "class": [
      {
        "system": "http://hl7.org/fhir/resource-types",
        "code": "Encounter"
      }
    ],
    "data": [
      {
        "meaning": "instance",
        "reference": {
          "reference": "Encounter/e001"
        }
      }
    ],
    "extension": [
      {
        "url": "https://g.co/fhir/medicalrecords/Environment",
        "valueCodeableConcept": {
          "coding": [
            {
              "system": "iso3166-1",
              "code": "CA"
            }
          ]
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "valueCoding": {
          "system": "http://terminology.hl7.org/CodeSystem/common-tags",
          "code": "actionable"
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "extension": [
          {
            "url": "https://g.co/fhir/medicalrecords/DataTag",
            "valueCoding": {
              "system": "http://example.com/custom-tags",
              "code": "archived"
            }
          },
          {
            "url": "https://g.co/fhir/medicalrecords/DataTag",
            "valueCoding": {
              "system": "http://example.com/custom-tags",
              "code": "insensitive"
            }
          }
        ]
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataSource",
        "valueUri": "http://somesystem.example.org/foo"
      }
    ],
    "securityLabel": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-Confidentiality",
        "code": "R"
      },
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "PSY"
      }
    ]
  }
}

Contoh sebelumnya mewakili referensi Izin pasien yang mana pasien f001 memberikan izin kepada dokter f002 dengan tujuan memberikan perawatan rutin yang diwakili oleh TREAT. Praktisi berasal dari geolokasi iso3166-1/CA. Resource Izin ini memungkinkan tenaga kesehatan mengakses data pasien jika data tersebut memenuhi semua kondisi berikut.

  • Ini adalah jenis Encounter dengan ID Encounter/e001.
  • Data ini berasal dari sumber http://somesystem.example.org/foo.
  • Class ini memenuhi setidaknya salah satu kondisi berikut pada tag (resource dapat diberi tag dengan menetapkan kolom system dan code dari Meta.tag):
    • Memiliki tag (system = http://terminology.hl7.org/CodeSystem/common-tags dan code = actionable)
    • Memiliki kedua tag (system = http://example.com/custom-tags dan code = archived) dan (system = http://example.com/custom-tags dan code = insensitive)
  • Label tersebut memiliki setidaknya salah satu label keamanan berikut
    • system = http://terminology.hl7.org/CodeSystem/v3-Confidentiality dan code adalah salah satu dari R, N, M, L, U.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCode dan code = PSY.

Contoh perintah kebijakan admin

{
  "resourceType": "Consent",
  "id": "admin-policy-example",
  "patient": {},
  "extension": [{
    "url": "https://g.co/fhir/medicalrecords/ConsentAdminPolicy"
  }],
  "category": [
    {
      "coding": [
        {
          "system": "http://loinc.org",
          "code": "57017-6"
        }
      ]
    }
  ],
  "scope": {},
  "policyRule": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "OPTIN"
      }
    ]
  },
  "status": "active",
  "provision": {
    "type": "permit",
    "actor": [
      {
        "reference": {
          "reference": "Practitioner/f002"
        },
        "role": {
          "coding": [
            {
              "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode",
              "code": "GRANTEE"
            }
          ]
        }
      }
    ],
    "purpose": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason",
        "code": "TREAT"
      }
    ],
    "class": [
      {
        "system": "http://hl7.org/fhir/resource-types",
        "code": "Encounter"
      }
    ],
    "data": [
      {
        "meaning": "instance",
        "reference": {
          "reference": "Encounter/e001"
        }
      }
    ],
    "extension": [
      {
        "url": "https://g.co/fhir/medicalrecords/Environment",
        "valueCodeableConcept": {
          "coding": [
            {
              "system": "iso3166-1",
              "code": "CA"
            }
          ]
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "valueCoding": {
          "system": "http://terminology.hl7.org/CodeSystem/common-tags",
          "code": "actionable"
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "extension": [
          {
            "url": "https://g.co/fhir/medicalrecords/DataTag",
            "valueCoding": {
              "system": "http://example.com/custom-tags",
              "code": "archived"
            }
          },
          {
            "url": "https://g.co/fhir/medicalrecords/DataTag",
            "valueCoding": {
              "system": "http://example.com/custom-tags",
              "code": "insensitive"
            }
          }
        ]
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataSource",
        "valueUri": "http://somesystem.example.org/foo"
      }
    ],
    "securityLabel": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-Confidentiality",
        "code": "R"
      },
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "PSY"
      }
    ]
  }
}

Contoh sebelumnya menunjukkan resource Izin kebijakan admin yang memberikan izin kepada praktisi f002 dengan tujuan memberikan perlakuan reguler yang diwakili oleh TREAT. Praktisi berasal dari geolokasi iso3166-1/CA. Resource Izin ini memungkinkan tenaga kesehatan mengakses data pasien jika data tersebut memenuhi semua kondisi berikut:

  • Ini adalah jenis Encounter dengan ID Encounter/e001.
  • Data ini berasal dari sumber http://somesystem.example.org/foo.
  • Solusi ini memenuhi setidaknya salah satu kondisi berikut pada tag:
    • Memiliki tag (system = http://terminology.hl7.org/CodeSystem/common-tags dan code = actionable)
    • Memiliki kedua tag (system = http://example.com/custom-tags dan code = archived) dan (system = http://example.com/custom-tags dan code = insensitive)
  • Label tersebut memiliki setidaknya salah satu label keamanan berikut
    • system = http://terminology.hl7.org/CodeSystem/v3-Confidentiality dan code adalah salah satu dari R, N, M, L, U.
    • system = http://terminology.hl7.org/CodeSystem/v3-ActCode dan code = PSY.

Contoh perintah kebijakan menurun admin

{
  "resourceType": "Consent",
  "id": "admin-cascading-policy-example",
  "patient": {},
  "extension": [
    { "url": "https://g.co/fhir/medicalrecords/ConsentAdminPolicy" },
    { "url": "https://g.co/fhir/medicalrecords/CascadingPolicy" }
  ],
  "category": [
    {
      "coding": [
        {
          "system": "http://loinc.org",
          "code": "57017-6"
        }
      ]
    }
  ],
  "scope": {},
  "policyRule": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
        "code": "OPTIN"
      }
    ]
  },
  "status": "active",
  "provision": {
    "type": "permit",
    "actor": [
      {
        "reference": {
          "reference": "Practitioner/f002"
        },
        "role": {
          "coding": [
            {
              "system": "http://terminology.hl7.org/CodeSystem/v3-RoleCode",
              "code": "GRANTEE"
            }
          ]
        }
      }
    ],
    "purpose": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/v3-ActReason",
        "code": "TREAT"
      }
    ],
    "class": [
      {
        "system": "http://hl7.org/fhir/resource-types",
        "code": "Patient"
      }
    ],
    "extension": [
      {
        "url": "https://g.co/fhir/medicalrecords/Environment",
        "valueCodeableConcept": {
          "coding": [
            {
              "system": "iso3166-1",
              "code": "CA"
            }
          ]
        }
      },
      {
        "url": "https://g.co/fhir/medicalrecords/DataTag",
        "valueCoding": {
          "system": "http://terminology.hl7.org/CodeSystem/common-tags",
          "code": "employee"
        }
      }
    ]
  }
}

Contoh sebelumnya menunjukkan resource Izin kebijakan menurun admin yang memberikan izin kepada praktisi f002 dengan tujuan memberikan perlakuan reguler yang diwakili oleh TREAT. Praktisi berasal dari geolokasi iso3166-1/CA. Resource Izin ini memungkinkan praktisi mengakses data kompartemen pasien dengan tag employee. Semua kriteria resource hanya berlaku untuk resource dasar kompartemen, yaitu resource Pasien, karena resource tersebut mengontrol resource mana yang akan menurun.

Terapkan izin pasien atau kebijakan admin

Terapkan izin pasien paling lambat ApplyConsents

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json" \
    --data "{'validateOnly': false}" \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"

Anda akan melihat respons JSON seperti berikut:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
}

Respons berisi nama operasi. Untuk melacak status operasi, Anda dapat menggunakan metode [Operation `get`](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get):

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

Setelah operasi selesai, server akan menampilkan respons dengan status operasi dalam format JSON:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1beta1.fhir.FhirStoreService.ApplyConsents",
    "createTime": "CREATE_TIME",
    "endTime": "END_TIME",
    "logsUrl": "https://console.cloud.google.com/logs/query/CLOUD_LOGGING_URL",
    "counter": {
      "success": "2",
      "secondarySuccess": "5"
    }
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.fhir.ApplyConsentsResponse",
    "consentApplySuccess": "2",
    "affectedResources": "5"
  }
}

Respons ini menunjukkan bahwa server berhasil memproses 2 izin dan memperbarui akses konsensual dari 5 resource (1 Pasien, 2 Izin, 2 Pengamatan).

Terapkan kebijakan admin paling lambat ApplyAdminConsents

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json" \
    --data "{
      'validateOnly': false,
      'newConsentsList': {
        'names': ['projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/5c8e3f8a-9fd5-480d-a08e-f29b89feccde/_history/VERSION_ID']
      }
    }" \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyAdminConsents"

Anda akan melihat respons JSON seperti berikut:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
}

Respons berisi nama operasi. Untuk melacak status operasi, Anda dapat menggunakan metode [Operation `get`](/healthcare-api/docs/reference/rest/v1/projects.locations.datasets.operations/get):

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

Setelah operasi selesai, server akan menampilkan respons dengan status operasi dalam format JSON:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1beta1.fhir.FhirStoreService.ApplyAdminConsents",
    "createTime": "CREATE_TIME",
    "endTime": "END_TIME",
    "logsUrl": "https://console.cloud.google.com/logs/query/CLOUD_LOGGING_URL",
    "counter": {
      "success": "1",
      "secondarySuccess": "7"
    }
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.fhir.ApplyAdminConsentsResponse",
    "consentApplySuccess": "1",
    "affectedResources": "7"
  }
}

Respons ini menunjukkan bahwa server berhasil memproses 1 kebijakan admin dan memperbarui akses konsensual untuk 7 resource (1 Praktisi, 1 Pasien, 2 Pengamatan, 2 Persetujuan pasien, dan 1 kebijakan admin).

Penegakan izin yang disimpan dalam penyimpanan FHIR tidak akan berlaku hingga ApplyConsents (untuk izin pasien) atau ApplyAdminConsents (untuk kebijakan admin dan kebijakan bertingkat admin) dipanggil dan berhasil diselesaikan. Jika menambahkan, mengubah, atau menghapus izin setelah menjalankan ApplyConsents atau ApplyAdminConsents, Anda harus menjalankannya lagi agar izin tersebut dapat disertakan dalam model penerapan.

Resource FHIR diindeks secara asinkron, sehingga mungkin ada sedikit penundaan antara waktu saat ApplyConsents atau ApplyAdminConsents selesai, dan saat model penerapan tercermin dalam hasil penelusuran. Penundaan ini hanya diperkirakan untuk permintaan penelusuran.

Jika ini adalah pertama kalinya Anda menyiapkan penerapan izin di penyimpanan FHIR, tunggu hingga operasi yang berjalan lama ApplyConsents atau ApplyAdminConsents selesai sebelum membuat permintaan berbasis izin.

Untuk memanggil ApplyConsents pada subkumpulan pasien, Anda dapat menggunakan filter berikut:

  • PatientScope: untuk menjalankan ApplyConsents pada daftar ID pasien yang berisi hingga 10.000 pasien

  • TimeRange: untuk menjalankan ApplyConsent di daftar ID resource Pasien yang resource Izinnya diperbarui selama rentang waktu tertentu

Untuk memanggil ApplyAdminConsents: Anda harus memberikan daftar lengkap semua kebijakan yang ingin diterapkan (bukan daftar tambahan). Akibatnya, daftar kosong akan membatalkan penerapan dari semua kebijakan admin dari Play Store. Setiap kebijakan harus berupa nama versi resource jika penyimpanan FHIR membuat versi, dan nama resource jika tidak.

Anda dapat menggunakan operations.get untuk mengambil ProgressCounter operasi. Setelah selesai, ada ApplyConsentsResponse yang disertakan dalam Operation.response. Penghitung di ProgressCounter dan ApplyConsentsResponse atau ApplyAdminConsentsResponse dijelaskan dalam tabel berikut.

ProgressCounter ApplyConsentsResponse atau ApplyAdminConsentsResponse Deskripsi
success consentApplySuccess Jumlah resource Consent yang berhasil diproses oleh operasi.
failure consentApplyFailure Jumlah resource Consent yang tidak didukung atau tidak valid. Anda dapat melihat log error di Cloud Logging atau saat validateOnly adalah false, memeriksa status penerapan izin menggunakan CheckConsentEnforcementStatus atau CheckPatientConsentEnforcementStatus untuk mengambil detail error.
secondarySuccess affectedResources Jika validateOnly adalah false, ini menunjukkan jumlah resource FHIR yang berhasil diindeks ulang karena efek perubahan izin.
secondaryFailure failedResources Jika validateOnly adalah false, jenis ini menunjukkan jumlah resource FHIR yang mungkin memiliki perubahan izin, tetapi gagal diindeks ulang. Hal ini dapat memengaruhi penelusuran dengan konteks izin, tetapi tidak memengaruhi metode lainnya. Untuk melihat detail error, Anda dapat melihat log error di Cloud Logging.

Saat resource Izin FHIR diproses, Anda dapat menggunakan API berikut untuk memeriksa status penegakan untuk satu izin atau semua izin dari pasien:

  • CheckConsentEnforcementStatus: menampilkan resource Parameters (STU3, R4) yang mencantumkan parameter berikut:

    • id: menunjukkan ID resource dari resource Consent

    • lastUpdated: menunjukkan waktu saat izin terakhir kali diterapkan

    • versionId: menunjukkan ID versi yang digunakan untuk penerapan izin

    • consent-enforcement-status: merepresentasikan status penerapan izin

  • CheckPatientConsentEnforcementStatus: menampilkan Bundle (STU3, R4) dari resource Parameters (STU3, R4) yang terdiri dari status penegakan semua izin dari satu pasien

Untuk kebijakan admin, CheckConsentEnforcementStatus hanya dapat digunakan untuk memeriksa status penerapan kebijakan Admin izin tunggal. Atau, Anda dapat menggunakan fhirStores.get untuk melihat semua kebijakan admin aktif yang diterapkan ke Play Store.

consent-enforcement-status dapat memiliki salah satu nilai berikut:

  • OFF: merepresentasikan status penerapan default resource Izin baru tempat resource Izin belum pernah diproses.

  • ENFORCEABLE: status saat resource Izin telah berhasil diproses.

  • INACTIVE: status tidak aktif saat resource Consent diabaikan.

  • UNSUPPORTED: status resource Izin yang mungkin sesuai dengan spesifikasi FHIR, tetapi tidak memiliki kekuatan hukum. Hal ini disebabkan oleh penerapan yang terbatas dari penerapan izin FHIR dengan tingkat dukungan fitur saat ini.

  • ENFORCEMENT_LIMIT_EXCEEDED: status saat format resource izin FHIR dan tingkat dukungan untuk resource bebas error, tetapi satu atau beberapa kondisi berikut berlaku:

    • Pasien memiliki sekumpulan besar referensi Izin.

    • Ukuran perintah izin di semua izin aktif lebih besar daripada ukuran maksimum perintah izin yang diizinkan bagi server FHIR untuk menegakkannya.

Cloud Healthcare API mendukung penelusuran resource FHIR di penyimpanan FHIR tertentu dengan actor, purpose, dan environment sebagai parameter kueri. Respons hanya berisi resource yang diizinkan.

  1. Praktisi Jeffrey Brown (diidentifikasi oleh Practitioner/12942879-f89f-41ae-aa80-0b911b649833) menggunakan aplikasi tepercaya App/123 menelusuri semua Pengamatan dengan 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"
    

    Anda akan melihat respons JSON seperti berikut:

    {
      "entry": [
        {
          "fullUrl": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION_ID/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa",
          "resource": {
            "code": {
              "coding": [
                {
                  "code": "718-7",
                  "display": "Hemoglobin [Mass/volume] in Blood",
                  "system": "http://loinc.org"
                }
              ]
            },
            "effectivePeriod": {
              "start": "2021-12-10T05:30:10+01:00"
            },
            "id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
            "issued": "2021-12-10T13:30:10+01:00",
            "meta": {
              "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
              "source": "http://example.com/HappyHospital",
              "versionId": "VERSION_ID"
            },
            "resourceType": "Observation",
            "status": "final",
            "subject": {
              "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
            },
            "valueQuantity": {
              "code": "g/dL",
              "system": "http://unitsofmeasure.org",
              "unit": "g/dl",
              "value": 7.2
            }
          },
          "search": {
            "mode": "match"
          }
        }
      ],
      "link": [
        {
          "relation": "search",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?status=final"
        }
      ],
      "resourceType": "Bundle",
      "total": 1,
      "type": "searchset"
    }
    
  3. Praktisi Jeffrey Brown (diidentifikasi oleh Practitioner/12942879-f89f-41ae-aa80-0b911b649833) menggunakan aplikasi App/123 menelusuri semua Pengamatan dari Pasien Darcy.
  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"
    

    Anda akan melihat respons JSON seperti berikut:

    {
      "link": [
        {
          "relation": "search",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject%3APatient.name=Darcy"
        }
      ],
      "resourceType": "Bundle",
      "total": 0,
      "type": "searchset"
    }
    

    Kueri sebelumnya adalah penelusuran berantai. Karena akses skenario izin actor/Practitioner/12942879-f89f-41ae-aa80-0b911b649833 env/App/123 ditolak untuk resource Pasien Darcy (diidentifikasi oleh Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2), server FHIR tidak akan menampilkan Pengamatan dari Pasien seolah-olah Pasien tidak ada.

  5. Praktisi Jeffrey Brown (diidentifikasi oleh Practitioner/12942879-f89f-41ae-aa80-0b911b649833) menggunakan aplikasi App/123 menelusuri semua Pengamatan dari Pasien Darcy untuk tujuan perawatan darurat.
  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"
    

    Anda akan melihat respons JSON seperti berikut:

    {
      "entry": [
        {
          "fullUrl": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/68583624-9921-4158-8754-2a306c689abd",
          "resource": {
            "code": {
              "coding": [
                {
                  "code": "15074-8",
                  "display": "Glucose [Moles/volume] in Blood",
                  "system": "http://loinc.org"
                }
              ]
            },
            "effectivePeriod": {
              "start": "2021-12-01T05:30:10+01:00"
            },
            "id": "68583624-9921-4158-8754-2a306c689abd",
            "issued": "2021-12-01T13:30:10+01:00",
            "meta": {
              "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
              "versionId": "VERSION_ID"
            },
            "resourceType": "Observation",
            "status": "final",
            "subject": {
              "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
            },
            "valueQuantity": {
              "code": "mmol/L",
              "system": "http://unitsofmeasure.org",
              "unit": "mmol/l",
              "value": 6.3
            }
          },
          "search": {
            "mode": "match"
          }
        },
        {
          "fullUrl": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/7473784b-46a8-470c-b9a6-fe38a01025aa",
          "resource": {
            "code": {
              "coding": [
                {
                  "code": "718-7",
                  "display": "Hemoglobin [Mass/volume] in Blood",
                  "system": "http://loinc.org"
                }
              ]
            },
            "effectivePeriod": {
              "start": "2021-12-10T05:30:10+01:00"
            },
            "id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
            "issued": "2021-12-10T13:30:10+01:00",
            "meta": {
              "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
              "source": "http://example.com/HappyHospital",
              "versionId": "VERSION_ID"
            },
            "resourceType": "Observation",
            "status": "final",
            "subject": {
              "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
            },
            "valueQuantity": {
              "code": "g/dL",
              "system": "http://unitsofmeasure.org",
              "unit": "g/dl",
              "value": 7.2
            }
          },
          "search": {
            "mode": "match"
          }
        }
      ],
      "link": [
        {
          "relation": "search",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Observation/?subject:Patient.name=Darcy"
        }
      ],
      "resourceType": "Bundle",
      "total": 2,
      "type": "searchset"
    }
    
  7. Praktisi Jeffrey Brown (diidentifikasi oleh Practitioner/12942879-f89f-41ae-aa80-0b911b649833) menelusuri Pengamatan dengan status=final untuk dua tujuan, perlakuan dan riset
  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"
    

    Anda akan melihat respons JSON seperti berikut:

    {
      "issue": [
        {
          "code": "security",
          "details": {
            "text": "permission_denied"
          },
          "diagnostics": "the maximum number of allowed consent purpose scopes is 1, got 2",
          "severity": "error"
        }
      ],
      "resourceType": "OperationOutcome"
    }
    

    Dalam hal ini, Praktisi Jeffrey Brown harus menghapus tujuan yang tidak perlu dari `X-Consent-Scope` dalam permintaan.

  9. Admin IT rumah sakit menggunakan bypass untuk menelusuri semua Praktisi di rumah sakit.
  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?"
    

    Karena bypass diberikan, pemeriksaan izin dilewati. Anda akan menerima respons JSON yang mirip dengan berikut ini:

    {
      "entry": [
        {
          "fullUrl": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/12942879-f89f-41ae-aa80-0b911b649833",
          "resource": {
            "active": true,
            "birthDate": "1970-05-23",
            "gender": "male",
            "id": "12942879-f89f-41ae-aa80-0b911b649833",
            "meta": {
              "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
              "versionId": "VERSION_ID"
            },
            "name": [
              {
                "family": "Brown",
                "given": [
                  "Jeffrey"
                ],
                "use": "official"
              }
            ],
            "resourceType": "Practitioner"
          },
          "search": {
            "mode": "match"
          }
        }
      ],
      "link": [
        {
          "relation": "search",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
        },
        {
          "relation": "first",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
        },
        {
          "relation": "self",
          "url": "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Practitioner/?"
        }
      ],
      "resourceType": "Bundle",
      "total": 1,
      "type": "searchset"
    }
    

Cloud Healthcare API mendukung pengambilan resource FHIR di penyimpanan FHIR tertentu dengan actor, purpose, dan environment sebagai parameter kueri. Respons hanya berisi resource yang diizinkan.

  1. Praktisi Jeffrey Brown (diidentifikasi oleh Practitioner/12942879-f89f-41ae-aa80-0b911b649833) menggunakan aplikasi App/123 membaca pengukuran hemoglobin Pasien (dalam contoh ini, 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"
    

    Karena pemohon diberi izin, responsnya adalah isi resource Observasi.

    {
      "code": {
        "coding": [
          {
            "code": "718-7",
            "display": "Hemoglobin [Mass/volume] in Blood",
            "system": "http://loinc.org"
          }
        ]
      },
      "effectivePeriod": {
        "start": "2021-12-10T05:30:10+01:00"
      },
      "id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
      "issued": "2021-12-10T13:30:10+01:00",
      "meta": {
        "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
        "source": "http://example.com/HappyHospital",
        "versionId": "VERSION_ID"
      },
      "resourceType": "Observation",
      "status": "final",
      "subject": {
        "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
      },
      "valueQuantity": {
        "code": "g/dL",
        "system": "http://unitsofmeasure.org",
        "unit": "g/dl",
        "value": 7.2
      }
    }
    
  3. Praktisi Jeffrey Brown (diidentifikasi oleh Practitioner/12942879-f89f-41ae-aa80-0b911b649833) menggunakan aplikasi tidak dikenal App/unknown membaca pengukuran hemoglobin Pasien (dalam contoh ini, 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"
    

    Permintaan ditolak karena akses batas pemohon (`Aplikasi/tidak diketahui`) tidak diizinkan oleh persetujuan Pasien.

    {
      "issue": [
        {
          "code": "security",
          "details": {
            "text": "permission_denied"
          },
          "diagnostics": "Consent access denied or the resource being accessed does not exist",
          "severity": "error"
        }
      ],
      "resourceType": "OperationOutcome"
    }
    
  5. Praktisi Jeffrey Brown (diidentifikasi oleh Practitioner/12942879-f89f-41ae-aa80-0b911b649833) melakukan riset biomedis menggunakan aplikasi App/golden membaca tanggal lahir Darcy (dalam contoh ini, 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"
    

    Karena pemohon diberi izin, responsnya adalah konten resource Pasien.

    {
      "active": true,
      "birthDate": "1990-01-01",
      "gender": "female",
      "id": "3c6aa096-c054-4c22-b2b4-1e4a4d203de2",
      "meta": {
        "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
        "versionId": "VERSION_ID",
        "tag": [{
          "system": "http://terminology.hl7.org/CodeSystem/common-tags",
          "code": "employee"
        }]
      },
      "name": [
        {
          "family": "Smith",
          "given": [
            "Darcy"
          ],
          "use": "official"
        }
      ],
      "resourceType": "Patient"
    }
    
  7. Praktisi Jeffrey Brown (diidentifikasi oleh Practitioner/12942879-f89f-41ae-aa80-0b911b649833) meminta akses darurat tidak sah ke rekam medis pasien, menggunakan protokol "break-the-box". (dalam contoh ini, Observation/7473784b-46a8-470c-b9a6-fe38a01025aa).
  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"
    

    Karena metode otorisasi izin adalah btg, server akan melewati pemeriksaan izin. Responsnya adalah konten resource Observation.

    {
      "code": {
        "coding": [
          {
            "code": "718-7",
            "display": "Hemoglobin [Mass/volume] in Blood",
            "system": "http://loinc.org"
          }
        ]
      },
      "effectivePeriod": {
        "start": "2021-12-10T05:30:10+01:00"
      },
      "id": "7473784b-46a8-470c-b9a6-fe38a01025aa",
      "issued": "2021-12-10T13:30:10+01:00",
      "meta": {
        "lastUpdated": "2022-09-01T17:31:40.423469+00:00",
        "source": "http://example.com/HappyHospital",
        "versionId": "VERSION_ID"
      },
      "resourceType": "Observation",
      "status": "final",
      "subject": {
        "reference": "Patient/3c6aa096-c054-4c22-b2b4-1e4a4d203de2"
      },
      "valueQuantity": {
        "code": "g/dL",
        "system": "http://unitsofmeasure.org",
        "unit": "g/dl",
        "value": 7.2
      }
    }
    

Bagian berikut menjelaskan metode penerapan izin yang didukung dalam Cloud Healthcare API dan cara penerapan akses resource saat Anda membuat permintaan berdasarkan izin.

Saat membuat permintaan, server otorisasi Anda bertanggung jawab untuk membuat token akses dengan cakupan izin yang relevan.

Setel header HTTP

Cakupan izin diteruskan ke Cloud Healthcare API menggunakan header HTTP X-Consent-Scope. Cloud Healthcare API menggunakan header ini untuk menerapkan kontrol akses berbasis izin pada data di penyimpanan FHIR.

Permintaan FHIR dapat mendukung sejumlah cakupan entri izin yang terbatas. Hingga tiga entri actor, satu dari purp, dan satu dari env dapat disertakan dalam permintaan FHIR tertentu.

Untuk cakupan khusus, permintaan FHIR dapat mendukung salah satu dari btg, atau bypass.

Setel header HTTP untuk aplikasi tepercaya

Bagian ini hanya diperlukan jika Anda menggunakan server otorisasi yang dikontrol pelanggan. Dalam instance ini, Anda juga harus menggunakan SMARTproxy atau proxy serupa.

Beberapa aplikasi tepercaya dapat melakukan panggilan langsung ke Cloud Healthcare API dengan cakupan izin dalam header HTTP yang ditentukan. Hal ini memungkinkan penerapan izin langsung tanpa memerlukan SMARTproxy atau proxy lain untuk melakukan konversi antara server otorisasi eksternal dan Google Cloud.

Misalnya, aplikasi Anda mungkin terdaftar untuk subset cakupan, seperti cakupan environment aplikasi, atau aplikasi mungkin menampilkan widget pemilihan untuk menetapkan beberapa entri cakupan seperti purpose pengakses.

Pengguna tepercaya atau aplikasi tepercaya juga dapat menggunakan entri cakupan btg atau bypass, yang tunduk pada peninjauan pasca-audit.

Cloud Healthcare API menyediakan dukungan bawaan untuk penerapan Izin FHIR berdasarkan cakupan izin input. Administrator penyimpanan FHIR bertanggung jawab untuk membuat dan mengonfigurasi server otorisasi di luar Cloud Healthcare API yang memberikan cakupan izin.

Contoh token akses

Contoh berikut menunjukkan token akses yang dienkode dalam base64:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpc3MiOiJjb25zZW50LnRva2VuLm9yZyIsImlhdCI6MTYxMjg4NDA4NSwiZXhwIjoxNjQ0NDIwMDg1LCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJkb2N0b3IuZ2FicmllbGFAZXhhbXBsZS5jb20iLCJzY29wZSI6Im9pZGMgYWN0b3IvUHJhY3RpdGlvbmVyLzEyMyBhY3Rvci9Hcm91cC85OTkgcHVycC92My9UUkVBVCBlbnYvQXBwL2FiYyJ9.fC7ljkVUUx8fwUOrJuONcrqA-WKC-k_Bclzlgds0Cq6H_gEe3nUjPlSOCTQsIdYB

Setelah mendekode token akses, Anda dapat melihat bahwa token tersebut berisi payload berikut:

{
  "iss": "consent.token.org",
  "iat": 1612884085,
  "exp": 1644420085,
  "aud": "www.example.com",
  "sub": "doctor.gabriela@example.com",
  "scope": "oidc actor/Practitioner/123 actor/Group/999 purp/v3/TREAT env/App/abc"
}

Mengonfigurasi SMARTProxy

SMARTProxy adalah proxy open source dari Google yang menyediakan fitur berikut:

  • Mengizinkan server FHIR Cloud Healthcare API untuk menerima dan memvalidasi token akses berbasis izin.

  • Mengizinkan implementasi FHIR di Cloud Healthcare API untuk menyertakan token akses berbasis izin sebagai bagian dari model izin dan pengelolaan Cloud Healthcare API.

  • Mendukung fitur token untuk SMART pada dukungan FHIR juga.

Saat Anda membuat permintaan untuk mengambil data dari Cloud Healthcare API melalui SMARTProxy, hal berikut akan terjadi:

  1. SMARTProxy menerima permintaan dari klien yang berisi token berbasis izin.

  2. SMARTProxy memvalidasi token berdasarkan izin melalui server otorisasi JWT yang Anda miliki.

  3. SMARTProxy membaca cakupan dari token berbasis izin dan meneruskannya ke Cloud Healthcare API melalui header HTTP.

  4. Cloud Healthcare API menerima header dan memvalidasinya untuk menerapkan perintah izin pada permintaan. Cloud Healthcare API kemudian menampilkan respons melalui SMARTProxy ke klien.

Mengonfigurasi akun layanan Google Cloud

Proxy hanya dapat memiliki satu akun layanan Google Cloud. Jika beberapa klien menggunakan proxy yang sama, klien tersebut akan menggunakan akun layanan yang sama. Berhati-hatilah saat berbagi akun layanan dengan beberapa klien karena alasan berikut:

Misalnya, jika Anda memanggil Cloud Healthcare API secara langsung menggunakan Akun Google Anda untuk autentikasi, Cloud Audit Logs akan mencatat alamat email Anda sebagai alamat email utama. Saat Anda menggunakan proxy untuk memanggil Cloud Healthcare API, proxy tersebut akan menggunakan akun layanannya sendiri dan alamat email utamanya adalah alamat email akun layanan, dan akun asalnya tidak ditentukan.

Log audit

Log audit dibuat saat ada permintaan akses atau saat penerapan akses resource berubah.

Mengakses log audit

Jika log audit diaktifkan di penyimpanan FHIR, kolom metadata consentMode akan disertakan dalam log audit yang tersedia di Cloud Logging. consentMode dapat memiliki salah satu nilai berikut:

  • off: konfigurasi penyimpanan FHIR memiliki consentConfig.accessEnforced yang ditetapkan ke false dan tidak mengizinkan permintaan berbasis izin.

  • emptyScope: FHIR store memiliki consentConfig.accessEnforced yang ditetapkan ke true, tetapi header cakupan izin tidak disertakan. Akibatnya, persetujuan tidak ditegakkan.

  • enforced: penyimpanan FHIR memiliki consentConfig.accessEnforced yang ditetapkan ke true dan header cakupan izin ada. Akibatnya, izin dievaluasi dan diterapkan pada permintaan resource di kompartemen pasien (STU3, R4).

  • btg: permintaan FHIR memiliki btg yang diberikan di header cakupan izin. Akibatnya, pemeriksaan izin dilewati. Permintaan ini dimaksudkan untuk digunakan untuk keadaan darurat dan tunduk pada tinjauan pasca-audit saja.

  • bypass: permintaan FHIR hanya memiliki bypass yang diberikan di header cakupan izin. Akibatnya, pemeriksaan izin dilewati. Permintaan ini dimaksudkan untuk digunakan oleh alur kerja tepercaya (seperti administrator atau aplikasi tepercaya, bukan pengguna akhir) sehingga log audit ini berbeda dengan btg, yang digunakan untuk pemeriksaan tata kelola data.

Jika ingin, Anda dapat menetapkan access_determination_log_config ke VERBOSE untuk mencatat informasi selengkapnya tentang alasan permintaan disetujui atau ditolak.

Log audit perubahan penerapan akses

Jika resource dasar kompartemen berubah (misalnya, menghapus tag employee pasien): Kontrol akses pada resource yang diubah dan kompartemennya dapat berubah karena Kebijakan Cascading Admin. Ini akan memicu pengindeksan ulang pada semua resource kompartemennya. Progres indeks ulang untuk setiap update resource dasar kompartemen dapat dilacak di Cloud Logging dengan filter jsonPayload.@type="type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry".

Contoh log progres pengindeksan ulang bertingkat

{
  "insertId": "tz2gtza8",
  "jsonPayload": {
    "@type": "type.googleapis.com/google.cloud.healthcare.logging.FhirConsentCascadeLogEntry",
    "state": "STATE_FINISHED",
    "affectedResources": "2",
    "lastUpdated": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ",
    "compartmentBaseResourceName": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/PATIENT_RESOURCE_ID/_history/PATIENT_RESOURCE_VERSION"
  },
  "resource": {
    "type": "healthcare_fhir_store",
    "labels": {
      "location": "LOCATION",
      "dataset_id": "DATASET_ID",
      "fhir_store_id": "FHIR_STORE_ID",
      "project_id": "PROJECT_ID"
    }
  },
  "timestamp": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ",
  "severity": "INFO",
  "logName": "projects/PROJECT_ID/logs/healthcare.googleapis.com%2Fconsent_cascading_fhir",
  "receiveTimestamp": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ"
}

jsonPayload.state adalah status operasi indeks ulang, jsonPayload.affectedResources adalah jumlah resource kompartemen yang diindeks ulang, dan jsonPayload.lastUpdated adalah stempel waktu pembaruan resource pasien. Jika operasi baru saja dimulai, jsonPayload.state="STATE_STARTED" dan jsonPayload.affectedResources tidak akan ada.

Batasan dan batasan

Bagian ini menunjukkan batasan untuk FHIR R4, tetapi batasan dan batas yang sama berlaku untuk FHIR STU3.

Jenis Batasan dan batas
Resource Izin Tunggal
  • Hanya satu Consent.provision yang didukung, beberapa ketentuan atau penyediaan bertingkat tidak didukung.
  • Minimal 1 Consent.provision.actor, maksimal 25:
    • Consent.provision.actor.role harus http://terminology.hl7.org/CodeSystem/v3-RoleCode.
    • Consent.provision.actor.code harus GRANTEE atau HPOWATT.
  • Maksimal 1 Consent.provision.purpose:
    • Consent.provision.purpose.system harus http://terminology.hl7.org/CodeSystem/v3-ActReason.
    • Consent.provision.purpose.code tidak boleh kosong dan terdiri dari maksimal 13 karakter.
  • Maksimal 1 environment:
    • Consent.provision.extension.url harus https://g.co/fhir/medicalrecords/Environment.
    • Panjang gabungan sistem dan kode harus kurang dari 15 karakter.
  • Jika memfilter menurut jenis resource, Consent.provision.class.system harus berupa http://hl7.org/fhir/resource-types.
  • Jika memfilter menurut sumber data, Consent.provision.extension.url harus https://g.co/fhir/medicalrecords/DataSource.
  • Jika memfilter menurut tag data, Consent.provision.extension.url harus https://g.co/fhir/medicalrecords/DataTag.
    • Tag data dapat berupa ekstensi yang rumit, yang disusun bertingkat hingga satu tingkat, untuk mendeskripsikan kebijakan yang mencocokkan resource dengan semua tag yang ditentukan (diinterpretasikan secara bersamaan).
    • Maksimal 5 tag bertingkat didukung.
  • Maksimal 100 nilai untuk semua atribut berulang kecuali jika dijelaskan secara berbeda di baris ini.
Model penerapan
  • Setiap pasien dapat memiliki hingga 200 resource Izin active yang diterapkan sekaligus.
  • Setiap toko dapat menerapkan hingga 200 kebijakan admin active sekaligus.
  • Format ringkas khusus untuk kumpulan semua Arahan Izin di seluruh izin aktif untuk Pasien tertentu tidak boleh melebihi batas ukuran yang ditetapkan; biasanya ada kapasitas yang cukup untuk mengenkode ribuan perintah izin, kecuali jika string resource yang sangat panjang sangat banyak. Contoh:
    • Ratusan Izin untuk sumber data dan tag data unik, masing-masing sangat menghabiskan banyak ruang penyimpanan.
    • Satu Pasien dengan 3.000 entri ID resource Consent.provision.data.reference unik di banyak Izin aktif yang masing-masing menentukan Consent.provision.actor unik akan menggunakan ruang secara lebih agresif daripada ketentuan yang tidak menentukan batasan referensi data apa pun atau berisi banyak string referensi pelaku yang sama.
  • Setiap resource dapat memiliki maksimal 1.000 perintah izin dari semua Izin yang berlaku untuknya.
X-Consent-Scope
  • Minimal satu dan maksimum tiga entri actor.
  • Maksimum satu entri purp:
    • Setiap entri purp harus dalam format system/code (v3 adalah sistem terdaftar untuk http://terminology.hl7.org/CodeSystem/v3-ActReason).
    • Panjang kode harus kurang dari 13.
  • Maksimum satu entri env:
    • Setiap entri env harus dalam format system/code.
    • Panjang gabungan sistem dan kode harus kurang dari 15.
  • btg memerlukan minimal satu entri actor.
  • bypass memerlukan minimum satu entri actor dan satu entri env.
Metode yang didukung
Performa
  • ApplyConsents dan ApplyAdminConsents memiliki skala yang serupa atau lebih baik daripada ImportResources.
  • Mengenai permintaan berbasis izin:
    • Model izin kami telah dioptimalkan untuk penegakan performa operasi CRUD, termasuk penelusuran dalam skala besar di banyak referensi dan pasien.
    • Pembacaan resource individual mungkin berdampak sedikit terhadap latensi permintaan, tetapi performa penelusuran bervariasi berdasarkan kueri dasar dan jumlah cakupan izin yang menyebabkan lebih banyak kriteria pengakses aktif selama penelusuran.
    • Sebaiknya jalankan pengujian performa Anda sendiri pada berbagai parameter permintaan FHIR representatif untuk menentukan karakteristik performa untuk kasus penggunaan berdasarkan karakteristik data, seperti jumlah resource dari jenis resource penelusuran tertentu yang ada di penyimpanan FHIR.
    • Solusi kami menjaga penyerapan dan pembaruan semua resource, termasuk resource izin, tetap ringan sehingga throughput selama penyerapan dan bentuk traffic tulis lainnya dapat berlanjut dengan dampak minimum.

Praktik terbaik

Bagian berikut menjelaskan praktik terbaik saat menggunakan Kontrol Akses FHIR.

Praktik terbaik umum

  • Jangan import resource FHIR dan panggil ApplyConsents atau ApplyAdminConsents secara paralel. Sebaiknya impor resource FHIR terlebih dahulu, lalu panggil ApplyConsents atau ApplyAdminConsents. Namun, jika resource yang akan diimpor tidak menyertakan resource Pasien atau Izin, model penegakan tidak akan terpengaruh dan izin pemrosesan atau kebijakan admin tidak diperlukan.

  • Jangan buat penelusuran kustom dan panggil ApplyConsents secara paralel. Sebaiknya Anda melakukannya satu per satu.

  • Jika alur kerja Anda memerlukan pemanggilan beberapa ApplyConsents di PatientScope yang terpisah, keduanya dapat dipanggil secara paralel.

  • ApplyAdminConsents dapat berjalan secara paralel dengan sejumlah ApplyConsents, tetapi tidak dengan ApplyAdminConsents lainnya.

  • Saat menyiapkan proxy, batasi akun layanan IAM dengan izin hanya baca agar tidak menulis data satu pasien ke catatan pasien lainnya.

  • Jangan gunakan proxy izin saat membuat atau memperbarui data.

  • Validasi semua permintaan tulis untuk mencegah modifikasi yang tidak terduga pada data lintas pasien.

  • Saat izin menurun diterapkan, resource dasar kompartemen harus diimpor terlebih dahulu, diikuti dengan resource kompartemen yang tersisa. Atau, semua resource kompartemen dapat digabungkan dalam satu paket dan diserap menggunakanfhir.executeBundle.

Hapus resource Pasien

Saat menghapus resource Pasien, jika Anda juga ingin menghapus penerapan izin untuk pasien tersebut (terutama jika FhirStore.disableReferentialIntegrity bernilai true), sebaiknya ikuti urutan operasi berikut:

  1. Hapus semua resource Consent milik resource Pasien.

  2. Panggil ApplyConsents dengan filter PatientScope.

Guna menyiapkan toko yang sudah ada untuk akses izin, selesaikan langkah-langkah berikut:

  1. Gunakan UpdateFhirStore untuk menetapkan ConsentConfig dengan penerapan izin version sebagai V1 dan tetapkan accessEnforced ke true.

    curl -X PATCH \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "Content-Type: application/json" \
        --data "{
          'consentConfig': {
            'version': 'V1',
            'accessEnforced': true
          }
        }" "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?update_mask=consentConfig"
    
  2. Memproses persetujuan pasien atau kebijakan admin

    1. ApplyConsents untuk persetujuan pasien
    curl -X POST \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "Content-Type: application/json" \
        --data "{'validateOnly': false}" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"
    
    1. ApplyAdminConsents untuk kebijakan admin dan kebijakan turunan admin.
    curl -X POST \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "Content-Type: application/json" \
        --data "{
          'newConsentsList': {
              'names': [
              'projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/RESOURCE_ID_1/_history/VERSION_ID_1',
              ...
              'projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Consent/RESOURCE_ID_N/_history/VERSION_ID_N'
              ]
          },
          'validateOnly': false
        }" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyAdminConsents"
    

Seberapa sering ApplyConsents atau ApplyAdminConsents

  • Jika kolom ConsentConfig tidak disetel: Kolom ConsentConfig tidak disetel, baik saat penyimpanan FHIR pertama kali dibuat maupun saat kolom ConsentConfig dihapus. Setelah kolom ConsentConfig tidak disetel, Anda harus mengulangi proses menyiapkan penyimpanan untuk akses izin sebelum membuat permintaan berdasarkan izin agar tidak mengevaluasi kebijakan penerapan izin yang sudah tidak berlaku.

  • Saat model penegakan berubah: Saat resource Consent dibuat, diupdate, atau dihapus, model penerapannya akan berubah. Dalam kasus tersebut, Anda harus memanggil ApplyConsents atau ApplyAdminConsents agar perubahan ini dapat diterapkan.

    • Jika Anda dapat memantau Pasien dengan perubahan Izin, sebaiknya gunakan filter PatientScope untuk menghindari pemrosesan ulang seluruh toko. Filter ini berguna untuk segera memperbarui penerapan sebagian kecil Pasien.

    • Anda juga dapat menjalankan ApplyConsents secara berkala menggunakan filter TimeRange. Filter ini berguna saat refresh langsung tidak terlalu penting. Misalnya, permintaan berikut memperbarui penerapan untuk perubahan izin antara UTC 00.00-09-20 UTC dan UTC 0AM 2022-09-21.

      curl -X POST \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "Content-Type: application/json" \
        --data "{
           'validateOnly': false,
           'timeRange': {
             'start': '2022-09-20T00:00:00Z',
             'end': '2022-09-21T00:00:00Z',
           }
          }" \
        "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:applyConsents"
      

Langkah selanjutnya